こんにちは。
グローバルソリューション事業部の吉村です。
Ansibleを利用していると、inventory ファイルに記載のある全てのサーバに対して、
同じPlaybookを実行するという機会はなかなか少ないです。
必ず何かしらの条件がつきまとうので、Ansibleを器用に利用していかないといけません。
そこで、Ansible まとめ14, 15回は
条件ごとにどのようにAnsibleを実行すべきか
をご紹介しようと思います。
条件1.実行サーバを限定する
これには、いくつか方法があるので、それぞれ紹介します。
1-1 「”-i オプション”で別のinventoryファイル利用する」
通常、Ansible は、/etc/ansible/hosts ファイルに書かれたホストのみ実行が可能です。
例えば、/etc/ansible/hosts に以下の様にサーバのIPアドレスが書かれているとします。
1 2 3 |
192.168.12.181 192.168.12.182 192.168.12.183 |
この場合、普通にAnsibleのコマンドを実行できるのは.181~.183の3台だけです。
例として、.184にAnsibleコマンドを実行してみましょう。
1 2 |
$ ansible -m ping 192.168.12.184 No hosts matched |
「そんなホスト無いよ。」と言われて寂しい気持ちになります。
そこで、inventory ファイルを別に作ってあげて、それを指定してAnsibleコマンドを実行してみましょう!
hosts というファイルを作ってあげて、
1 2 3 |
$ vi hosts [このサーバだけに実行したい] 192.168.12.184 |
その inventory ファイルを指定して実行すると、
1 2 3 4 5 |
$ ansible -m ping 192.168.12.184 -i hosts 192.168.12.184 | success >> { "changed": false, "ping": "pong" } |
成功しました。
このように別の inventory ファイルを作って、指定する方法です。
1-2 「”-l オプション”で直接指定する」
↑の方法だと、「毎度 inventoryファイルを作るの面倒くさい・・・」ということになってしまうかもしれません。
その場合は、-l オプションで、inventory ファイルの中から実行するサーバを指定することができます。
先ほどの /etc/ansible/hosts ファイルで考えると、デフォルトでは、/etc/ansible/hosts ファイルに
記載されている.181~.183 全てにPlaybookを実行することになります。
example.yml を実行するホストはどれよ!? と、–list-host オプションで確認すると、こんな感じ。
1 2 3 4 5 6 7 8 |
$ ansible-playbook example.yml --list-host playbook: example.yml play #1 (check something): host count=3 192.168.12.181 192.168.12.182 192.168.12.183 |
そこで、-l オプションで、.183にだけ実行するように指定してみましょう!
1 2 3 4 5 6 |
$ ansible-playbook example.yml -l 192.168.12.183 --list-host playbook: example.yml play #1 (check something): host count=1 192.168.12.183 |
そうすると、.183だけが実行対象になりましたね。
また、-l オプションは1つのIPアドレス単位でなく、サブネット単位でも指定ができるので、このネットワーク範囲に実行という風にも条件が付けられます。
1-3 「ホストグループで指定する」
クラウド時代。
「サーバをホスト名で管理するのを辞めよう!役割毎に管理だ!」
という話題が良く出ますね。
こういった、目的別管理に向いているのが、
inventoryファイルでサーバをグルーピング後、特定のグループに対してのみ Ansible コマンドを実行する
というやり方です。
先の /etc/ansible/hosts ファイルを以下のように変更しました。
1 2 3 4 5 6 |
[hiphop] 192.168.12.181 [grime] 192.168.12.182 [garage] 192.168.12.183 |
3つのグループ(hiphop、grime、garage) に分けました。
では、この中で、hiphop グループのみ Playbookを実行してみましょう!
まずはさっき使った、-l オプションでも指定可能です。
1 2 3 4 5 6 |
$ ansible-playbook example.yml -l hiphop --list-host playbook: example.yml play #1 (check something): host count=1 192.168.12.181 |
2つ目は、Playbookの中で、指定することも可能です。
1 2 3 4 5 6 7 8 |
$ cat example.yml --- - name: check something hosts: hiphop gather_facts: False tasks: - shell: "cat /etc/redhat-release" |
「 hosts: hiphop」と指定して、何もオプションを付けずにPlaybookを実行すると、
1 2 3 4 5 6 7 8 9 |
$ ansible-playbook example.yml PLAY [check something] ******************************************************** TASK: [shell cat /etc/redhat-release] ***************************************** changed: [192.168.12.181] PLAY RECAP ******************************************************************** 192.168.12.181 : ok=1 changed=1 unreachable=0 failed=0 |
きちんと hiphop グループの .181 のみに実行しました。
Ansibleでは、このようにして、実行サーバを限定していくことが可能です。
今回はここまで。
次回は、gather_facts を利用して、OS毎に実行内容を変更する。
というような条件分岐をご紹介します。
お楽しみに!