Ansible
準備
Ansible
$ sudo apt install ansible
or
$ brew install ansible
仮想マシン
- Linux の VM を二台以上起動しておく
- 今回は Azure で Ubuntu 18.04 で作った
- 練習の時だけ起動するので、速めのプランでやった方がいい (時間が短いのでそんなに大した値段にならない)
はじめる
hosts ファイルを作る
コントロールするサーバーを列挙しておく。
52.191.141.92
52.191.139.213
グループ化もできる。
[servers]
52.191.141.92
52.191.139.213
/usr/bin/python3
を使う場合は以下のように書く。
[servers]
52.191.141.92
52.191.139.213
[servers:vars]
ansible_python_interpreter=/usr/bin/python3
ansible
コマンド
$ ansible -i hosts -m ping 52.191.141.92
52.191.141.92 | SUCCESS => {
"changed": false,
"ping": "pong"
}
ping module は動作確認用。
複数マシンに対して同時に実行するには ,
で区切る。
$ ansible -i hosts -m ping 52.191.141.92,52.191.139.213
52.191.141.92 | SUCCESS => {
"changed": false,
"ping": "pong"
}
52.191.139.213 | SUCCESS => {
"changed": false,
"ping": "pong"
}
グループも指定できる。
$ ansible -i hosts -m ping servers
52.191.141.92 | SUCCESS => {
"changed": false,
"ping": "pong"
}
52.191.139.213 | SUCCESS => {
"changed": false,
"ping": "pong"
}
全部っていう指定も。
ansible -i hosts -m ping all
52.191.141.92 | SUCCESS => {
"changed": false,
"ping": "pong"
}
52.191.139.213 | SUCCESS => {
"changed": false,
"ping": "pong"
}
shell module を使うとシェル経由でコマンドを実行できる。
$ ansible -i hosts -m shell -a 'whoami' servers
52.191.141.92 | SUCCESS | rc=0 >>
masakura
52.191.139.213 | SUCCESS | rc=0 >>
masakura
サーバーの管理は root
にならないとできないので、sudo
を使う。--become
引数を使う。
$ ansible -i hosts -m shell -a 'whoami' --become servers
52.191.141.92 | SUCCESS | rc=0 >>
root
52.191.139.213 | SUCCESS | rc=0 >>
root
sudo
のパスワードを要求されるケースでは、--ask-become-pass
をつける。
$ ansible -i hosts -m shell -a 'whoami' --become --ask-become-pass servers
SUDO password:
52.191.141.92 | SUCCESS | rc=0 >>
root
52.191.139.213 | SUCCESS | rc=0 >>
root
ファイルを作成するには copy module を使う。
$ ansible -i hosts -m copy -a 'dest=/etc/hoge.txt content="Hello, world!"' --become --ask-become-pass servers
SUDO password:
52.191.141.92 | SUCCESS => {
"changed": true,
"checksum": "943a702d06f34599aee1f8da8ef9f7296031d699",
"dest": "/etc/hoge.txt",
"gid": 0,
"group": "root",
"md5sum": "6cd3556deb0da54bca060b4c39479839",
"mode": "0644",
"owner": "root",
"size": 13,
"src": "/home/masakura/.ansible/tmp/ansible-tmp-1513321377.47-174888276599364/source",
"state": "file",
"uid": 0
}
52.191.139.213 | SUCCESS => {
"changed": true,
"checksum": "943a702d06f34599aee1f8da8ef9f7296031d699",
"dest": "/etc/hoge.txt",
"gid": 0,
"group": "root",
"md5sum": "6cd3556deb0da54bca060b4c39479839",
"mode": "0644",
"owner": "root",
"size": 13,
"src": "/home/masakura/.ansible/tmp/ansible-tmp-1513321377.47-77663751945532/source",
"state": "file",
"uid": 0
}
"changed": true
に注意。
もう一度実行する
$ ansible -i hosts -m copy -a 'dest=/etc/hoge.txt content="Hello, world!"' --become --ask-become-pass servers
SUDO password:
52.191.141.92 | SUCCESS => {
"changed": false,
"checksum": "943a702d06f34599aee1f8da8ef9f7296031d699",
"dest": "/etc/hoge.txt",
"gid": 0,
"group": "root",
"mode": "0644",
"owner": "root",
"path": "/etc/hoge.txt",
"size": 13,
"state": "file",
"uid": 0
}
52.191.139.213 | SUCCESS => {
"changed": false,
"checksum": "943a702d06f34599aee1f8da8ef9f7296031d699",
"dest": "/etc/hoge.txt",
"gid": 0,
"group": "root",
"mode": "0644",
"owner": "root",
"path": "/etc/hoge.txt",
"size": 13,
"state": "file",
"uid": 0
}
"changed": false
と false
になってる。
殆どのモジュールは不要であれば実行されない。今回の場合、ファイルの内容やパーミッションが変化しないので何もされなかった。
ansible-playbook
コマンド
Playbook というファイルを作ることで何度も同じことができます。以下を Playbook 化してみます。
$ ansible -i hosts -m copy -a 'dest=/etc/hoge.txt content="Hello, world!"' --become --ask-become-pass servers
こんな感じです。
- hosts: servers
become: yes
tasks:
- copy: dest=/etc/hoge.txt content="Hello, world!"
ちょっとわかりにくいと思うので JSON で書き直した例です。(こちらでも動きます)
[
{
"hosts": "servers",
"become": true,
"tasks": [
{
"copy": "dest=/etc/hoge.txt content=\"Hello, world!\""
}
]
}
]
実行します。
$ ansible-playbook -i hosts --ask-become-pass servers.yml
SUDO password:
PLAY ***************************************************************************
TASK [setup] *******************************************************************
ok: [52.191.141.92]
ok: [52.191.139.213]
TASK [copy] ********************************************************************
changed: [52.191.141.92]
changed: [52.191.139.213]
PLAY RECAP *********************************************************************
52.191.141.92 : ok=2 changed=1 unreachable=0 failed=0
52.191.139.213 : ok=2 changed=1 unreachable=0 failed=0
もう一度実行すると、changed
が ok
に変わります。
$ ansible-playbook -i hosts --ask-become-pass servers.yml
SUDO password:
PLAY ***************************************************************************
TASK [setup] *******************************************************************
ok: [52.191.141.92]
ok: [52.191.139.213]
TASK [copy] ********************************************************************
ok: [52.191.141.92]
ok: [52.191.139.213]
PLAY RECAP *********************************************************************
52.191.141.92 : ok=2 changed=0 unreachable=0 failed=0
52.191.139.213 : ok=2 changed=0 unreachable=0 failed=0
tasks
の書き方はバリエーションがありますので紹介します。
引数も含めて一行で書けますが、一般的にはあまり使われないと思います。長くなると読みにくいです。
tasks:
- copy: dest=/etc/hoge.txt content="Hello, world!"
こう書いた方がいいでしょう。
tasks:
- copy:
dest: /etc/hoge.txt
content: Hello, world!
もちろん、tasks
は複数書けます。
tasks:
- copy:
dest: /etc/a.txt
content: A
- copy:
dest: /etc/b.txt
content: B
role を使う
このまま続けていくと YAML が肥大化します。メンテナンス性が悪化するので、ロールに分割します。分割の設計をどうするかは置いておいて、とりあえずロールを作ります。
$ mkdir -p roles/test/tasks
---
- name: create hoge.txt
copy: dest=/etc/hoge.txt content="Hello, world!"
もちろん以下のように書くこともできますし、こちらの方がおすすめです。
---
- name: create hoge.txt
copy:
dest: /etc/hoge.txt
content: Hello, world!
servers.yml
ファイルをこう書き換えます。
- hosts: servers
become: yes
roles:
- test
同じように実行できます。
$ ansible-playbook -i hosts --ask-become-pass servers.yml