Ansible入門

Ansible入門

概要

サーバーの構成管理ツール
これまでのchefなどの構成管理ツールと違い「sshログインのみ」できればclient側に操作できる。
基本的に構成を管理してるので既にその構成になっているclientには、何もしない。

リンク

公式サイト
公式ドキュメント
Module Index

参考リンク

Ansibleのドキュメントを読んでみたメモ AnsibleでのEC2接続時エラーへの対処法

イメージ図

image

画像参考サイト

基本的な登場人物

  • InventoryFile(hosts)...サーバーのリスト 参考
  • ansible.cfg...ansibleの設定ファイル
  • playbook.yml...サーバ構築のための作業命令を書いておくファイル 参考

試しに作ってみる

HostサーバからDBサーバやWebサーバに設定を流してみる

環境を作ってみる(ansibleを試す環境作成)

ansibleを実行できる環境をつくるので、ansible自体とは関係ないです。
必要なければ飛ばしてください。

vagrant install

1 macvagrantをインストールする

2 ディレクトリ作成から初期化

$ mkdir -p Vagrant/ansible
$ cd Vagrant/ansible
$ vagrant init chef/centos-6.5

3 Vagrantfileを編集

$ ls Vagrantfile 
$ vim Vagrantfile

下記の箇所を変更

#config.vm.box = 'chef/centos-6.5'

config.vm.define "host" do |node|
     node.vm.box = "chef/centos-6.5"
     node.vm.hostname = "host"
     node.vm.network :private_network, ip: "192.168.43.51"
end

config.vm.define "web" do |node|
     node.vm.box = "chef/centos-6.5"
     node.vm.hostname = "web"
     node.vm.network :private_network, ip: "192.168.43.52"
end

config.vm.define "db" do |node|
     node.vm.box = "chef/centos-6.5"
     node.vm.hostname = "db"
     node.vm.network :private_network, ip: "192.168.43.53"
end

4 vm3台立ち上げる

$ vagrant up

5 起動したらstatus確認

$ vagrant status
Current machine states:

host                      running (virtualbox)
web                       running (virtualbox)
db                        running (virtualbox)

This environment represents multiple VMs. The VMs are all listed
above with their current state. For more information about a specific
VM, run `vagrant status NAME`. 

ansible構築

ansible install
1 hostにログイン
$ vagrant ssh host
2 install
$ wget https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ sudo rpm -Uvh epel-release-6-8.noarch.rpm
$ sudo yum install -y ansible
$ ansible --version
ansible 1.8.4
  configured module search path = None
3 ssh設定をしよう

hostにログインしておきます。

$ vim .ssh/config
$ chmod 600 .ssh/config

.ssh/configの中身

Host web
    HostName 192.168.43.52
Host db
    HostName 192.168.43.53
4 sshのkeyを作成
$ ssh-keygen -t rsa
5 web,dbのauthorizedkeyに登録
$ ssh-copy-id web
$ ssh-copy-id db

※passwordを聞かれたら「vagrant」

passwordを聞かれずにログインできることを確認
$ ssh web
$ ssh db

ansibleを使ってみる

Inventoryファイルの作成
$ vim hosts

[web]
192.168.43.52

[db]
192.168.43.53
試しにpingしてみる
$ ansible all -i hosts -m ping
192.168.43.52 | success >> {
    "changed": false,
    "ping": "pong"
}

192.168.43.53 | success >> {
    "changed": false,
    "ping": "pong"
}
いちいち[-i hosts]とinventoryファイルを指定するのは面倒のでconfigに書いてみる
$ vim ansible.cfg
[defaults]
hostfile = ./hosts

inventoryファイルを指定しないでpingを売ってみる

$ ansible all -m ping
192.168.43.52 | success >> {
    "changed": false,
    "ping": "pong"
}

192.168.43.53 | success >> {
    "changed": false,
    "ping": "pong"
}

playbookを使ってみる

playbookを使ってuserを作成してみる

$ vim playbook.yml
---
- hosts: all
  sudo: yes
  tasks:
    - name: add a new user
      user: name=kiwamu

実行してみる

$ ansible-playbook playbook.yml

その他試してみる

文法が正しいかをチェック
ansible-playbook playbook.yml --syntax-check

taskの一覧を表示してみる
ansible-playbook playbook.yml --list-task

ドライランしてみる
ansible-playbook playbook.yml --check

いろいろ試してみる

webにhttp,phpをinstallして、index.phpを転送、 dbにmysqlをinstallなどなど

playbookの中身

---
- hosts: all
  sudo: yes
#  vars:
#    username: kiwamu
#  vars_prompt:
#    username: "Enter username"
  tasks:
    - name: add a new user
      user: name=kiwamu
    - name: install libselinux-python
      yum: name=libselinux-python state=latest

- hosts: web
  sudo: yes
  tasks:
    - name: install apache
      yum: name=httpd state=latest
    - name: start apache and enabled
      service: name=httpd state=started enabled=yes
    - name: change owner
      file: dest=/var/www/html owner=vagrant recurse=yes
    - name: copy index.html
      copy: src=./index.html dest=/var/www/html/index.html owner=vagrant
    - name: install php pachages
      yum: name={{item}} state=latest
      with_items:
        - php
        - php-devel
        - php-mbstring
        - php-mysql
      notify:
        - restart apache
    - name: copy hello.php
      copy: src=./hello.php dest=/var/www/html/hello.php owner=vagrant
  handlers:
    - name: restart apache
      service: name=httpd state=restarted

- hosts: db
  sudo: yes
  tasks:
    - name: install mysql
      yum: name={{item}} state=latest
      with_items:
        - mysql-server
        - MySQL-python
    - name: start mysql and enabled
      service: name=mysqld state=started enabled=yes
    - name: create a database
      mysql_db: name=mydb state=present
    - name: create a user for mydb
      mysql_user: name=dbuser password=dbpassword priv=mydb.*:ALL state=present

実行してみる

$ ansible-playbook playbook.yml

PLAY [all] ********************************************************************

GATHERING FACTS ***************************************************************
ok: [192.168.43.52]
ok: [192.168.43.53]

TASK: [add a new user] ********************************************************
ok: [192.168.43.53]
ok: [192.168.43.52]

TASK: [install libselinux-python] *********************************************
ok: [192.168.43.53]
ok: [192.168.43.52]

PLAY [web] ********************************************************************

GATHERING FACTS ***************************************************************
ok: [192.168.43.52]

TASK: [install apache] ********************************************************
ok: [192.168.43.52]

TASK: [start apache and enabled] **********************************************
ok: [192.168.43.52]

TASK: [change owner] **********************************************************
ok: [192.168.43.52]

TASK: [copy index.html] *******************************************************
ok: [192.168.43.52]

TASK: [install php pachages] **************************************************
ok: [192.168.43.52] => (item=php,php-devel,php-mbstring,php-mysql)

TASK: [copy hello.php] ********************************************************
ok: [192.168.43.52]

PLAY [db] *********************************************************************

GATHERING FACTS ***************************************************************
ok: [192.168.43.53]

TASK: [install mysql] *********************************************************
ok: [192.168.43.53] => (item=mysql-server,MySQL-python)

TASK: [start mysql and enabled] ***********************************************
ok: [192.168.43.53]

TASK: [create a database] *****************************************************
ok: [192.168.43.53]

TASK: [create a user for mydb] ************************************************
ok: [192.168.43.53]

PLAY RECAP ********************************************************************
192.168.43.52              : ok=10   changed=0    unreachable=0    failed=0
192.168.43.53              : ok=8    changed=0    unreachable=0    failed=0