Ansibleモジュールをplaybookで試す【初級編】

2015.07.07

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。半瀬です。

Ansible入門の連投です。今回はモジュールの練習をいくつか晒します。
前回同様、大体コピペで確認できるように書いてみました。

練習環境

前回と同じ環境を使用します。

AWS Design

⭐️前回記事の手順内の1.から4.で作成可能です。

インスタンスのPrivate IPと必要なファイルは再掲します。

・管理インスタンス(ip-10-0-0-10) : 10.0.0.10 ・WEBインスタンス1(ip-10-0-1-10) : 10.0.1.10 ・WEBインスタンス2(ip-10-0-2-10) : 10.0.2.10 ・EC2キーファイル ec2-key.pem ・unusable設定ファイル ansible_hosts

※ファイル名などが間違っているとコピペでは確認できません。

実際に練習しましょう。

cronモジュール!

cronモジュールは crontab の設定追加/変更/削除が可能です。playbookで動作を確認していきます。

1. crontab追加用 playbookファイル(.yml)を準備

書き方は、「job」で実行したいコマンドを記載し、実行間隔や日時などは「*」で良いところは指定せず、必要なところのみ書いておくというかたちになります。「name」で指定した文字列は削除などにも使います。
というわけで、crontabに登録するplaybookを作成しました。

[ec2-user@ip-10-0-0-10 ~]$ cat add_cron.yml 
- hosts: webs
  sudo: yes
  tasks:
      - name: sumple cron minutely
        cron: name="check dirs m" job="ls -lah >> /tmp/sumple_cron_minutely.log"

      - name: sumple cron hourly
        cron: name="check dirs h" minute="55" job="ls -lah >> /tmp/sumple_cron_hourly.log"
 
      - name: sumple cron daily
        cron: name="check dirs d" minute="55" hour="1" job="ls -lah >> /tmp/sumple_cron_daily.log"

      - name: sumple cron weekly
        cron: name="check dirs w" minute="55" hour="1" weekday="2" job="ls -lah >> /tmp/sumple_cron_weekly.log"

      - name: sumple cron monthly
        cron: name="check dirs M" minute="55" hour="1" day="7" job="ls -lah >> /tmp/sumple_cron_monthly.log"
[ec2-user@ip-10-0-0-10 ~]$

毎分/毎時/毎日/毎週/毎月 での処理実行をしたいPlaybookファイルです。

2. 実行する

[ec2-user@ip-10-0-0-10 ~]$ ansible-playbook --private-key=.ssh/ec2-key.pem -i ansible_hosts add_cron.yml

3. リモートホストのcrontabを確認

ansibleコマンドで確認してみましょう。

[ec2-user@ip-10-0-0-10 ~]$ ansible --private-key=.ssh/ec2-key.pem -i ansible_hosts webs -a "crontab -l" -s
10.0.1.10 | success | rc=0 >>
#Ansible: check dirs m
* * * * * ls -lah >> /tmp/sumple_cron_minutely.log
#Ansible: check dirs h
55 * * * * ls -lah >> /tmp/sumple_cron_hourly.log
#Ansible: check dirs d
55 1 * * * ls -lah >> /tmp/sumple_cron_daily.log
#Ansible: check dirs w
55 1 * * 2 ls -lah >> /tmp/sumple_cron_weekly.log
#Ansible: check dirs M
55 1 7 * * ls -lah >> /tmp/sumple_cron_monthly.log

10.0.2.10 | success | rc=0 >>
#Ansible: check dirs m
* * * * * ls -lah >> /tmp/sumple_cron_minutely.log
#Ansible: check dirs h
55 * * * * ls -lah >> /tmp/sumple_cron_hourly.log
#Ansible: check dirs d
55 1 * * * ls -lah >> /tmp/sumple_cron_daily.log
#Ansible: check dirs w
55 1 * * 2 ls -lah >> /tmp/sumple_cron_weekly.log
#Ansible: check dirs M
55 1 7 * * ls -lah >> /tmp/sumple_cron_monthly.log

よさそうです。ここではcronジョブ自体の実行確認は不要かと思いますので、次に進みます。次は削除をしてみます。

4. 削除用 playbookファイル(.yml)を準備

ansible内で定義した「name」に対して、「state=absent」(削除)を実行するという書き方になります。

[ec2-user@ip-10-0-0-10 ~]$ cat del_cron.yml 
- hosts: webs
  sudo: yes
  tasks:
      - name: sumple cron minutely
        cron: name="check dirs m" state="absent" 

      - name: sumple cron hourly
        cron: name="check dirs h" state="absent" 
 
      - name: sumple cron daily
        cron: name="check dirs d" state="absent"
[ec2-user@ip-10-0-0-10 ~]$

毎分/毎時/毎日の3行を削除し、「毎週」と「毎月」を残したいPlaybookファイルです。

5. 削除実行します

[ec2-user@ip-10-0-0-10 ~]$ ansible-playbook --private-key=.ssh/ec2-key.pem -i ansible_hosts del_cron.yml

6. リモートホストの削除確認をします。

[ec2-user@ip-10-0-0-10 ~]$ ansible --private-key=.ssh/ec2-key.pem -i ansible_hosts webs -a "crontab -l" -s
10.0.1.10 | success | rc=0 >>
#Ansible: check dirs w
55 1 * * 2 ls -lah >> /tmp/sumple_cron_weekly.log
#Ansible: check dirs M
55 1 7 * * ls -lah >> /tmp/sumple_cron_monthly.log

10.0.2.10 | success | rc=0 >>
#Ansible: check dirs w
55 1 * * 2 ls -lah >> /tmp/sumple_cron_weekly.log
#Ansible: check dirs M
55 1 7 * * ls -lah >> /tmp/sumple_cron_monthly.log

[ec2-user@ip-10-0-0-10 ~]$

3行は削除され、「毎週」と「毎月」が残りました。 よさそうです。

scriptモジュール!!

scriptモジュールはローカルに準備した処理ファイルをリモートホストで実行するものです。あるリモートホストの特定ファイルを基準にホストごとに処理実行する/しないを決められるパラメータが準備されています。例えば「/home/ec-user2/check」をフラグファイルとして、 ・「creates=/home/ec2-user/check」であれば、リモートホストに「check」ファイルが”ない”場合は処理実行する ・「removes=/home/ec2-user/check」であれば、リモートホストに「check」ファイルが”ある”場合は処理実行する といったようなパターン分けが可能です。 ansibleの処理対象となる2つのリモートホストの片方のみにcheckファイルを置いてパターンの確認をしてみようかと思います。

1. フラグファイルをリモートホストの片方に配置

リモートホスト「10.0.1.10」に「/home/ec2-user/check」をtouchします。

[ec2-user@ip-10-0-0-10 ~]$ ssh -i .ssh/ec2-key.pem ec2-user@10.0.1.10 "touch check"

念のため確認しておきましょう。

[ec2-user@ip-10-0-0-10 ~]$ ansible --private-key=.ssh/ec2-key.pem -i ./ansible_hosts webs -a "ls -l check"
10.0.1.10 | success | rc=0 >>
-rw-rw-r-- 1 ec2-user ec2-user 0 Jul  7 04:20 check

10.0.2.10 | FAILED | rc=2 >>
ls: cannot access check: No such file or directory

「10.0.1.10」にのみ、「check」ファイルができていますね。これで「creates/removes」のパラメータ確認ができます。

2. スクリプトを準備

スクリプトは、ansible実行元(管理インスタンスと前回は呼んでいました)に配置しておきます。

[ec2-user@ip-10-0-0-10 ~]$ cat sumple.sh
#!/bin/bash

log="/home/ec2-user/exec_script.txt"

/bin/hostname > ${log}
/bin/date >> ${log}
ls -l ${0} >> ${log}

exit 0

コマンドの出力結果をec2-userのホームディレクトリ内のテキストに吐き出します。

「create=/home/ec2-user/check」と指定をしておきます。

3. createsを指定したPlaybook(.yml)を用意

[ec2-user@ip-10-0-0-10 ~]$ cat exec_script.yml 
- hosts: webs
  sudo: yes
  tasks:
      - name: exec script
        script: /home/ec2-user/sumple.sh creates=/home/ec2-user/check
[ec2-user@ip-10-0-0-10 ~]$

「check」ファイルがある10.0.1.10側には実行されず、10.0.2.10側でのみ実行されるはずです。

4. 実行します

[ec2-user@ip-10-0-0-10 ~]$ ansible-playbook --private-key=.ssh/ec2-key.pem -i ./ansible_hosts exec_script.yml

5. createsが効いているかを確認

ansibleコマンドで確認してみましょう。※ 処理結果として ec2-userのホームに 「exec_script.txt」ができているかどうかで判断ができます。

[ec2-user@ip-10-0-0-10 ~]$ ansible --private-key=.ssh/ec2-key.pem -i ./ansible_hosts webs  -a "ls -l exec_script.txt"
10.0.1.10 | FAILED | rc=2 >>
ls: cannot access exec_script.txt: No such file or directory

10.0.2.10 | success | rc=0 >>
-rw-r--r-- 1 root root 170 Jul  7 04:53 exec_script.txt

「10.0.1.10」では作成されず、「10.0.2.10」には作成されています。 よさそうです。

6. 処理結果のファイルを削除

次のremovesの確認のため。 ※フラグの「check」ファイルは削除しません。

[ec2-user@ip-10-0-0-10 ~]$ ansible --private-key=.ssh/ec2-key.pem -i ./ansible_hosts webs -m file -a "dest=./exec_script.txt state=absent "

確認は下記の通り。

[ec2-user@ip-10-0-0-10 ~]$ ansible --private-key=.ssh/ec2-key.pem -i ./ansible_hosts webs  -a "ls -l exec_script.txt"

7. removesを指定したPlaybook(.yml)を準備

[ec2-user@ip-10-0-0-10 ~]$ cat exec_script.yml 
- hosts: webs
  sudo: yes
  tasks:
      - name: exec script
        script: /home/ec2-user/sumple.sh removes=/home/ec2-user/check
[ec2-user@ip-10-0-0-10 ~]$

8. 実行してみます。

[ec2-user@ip-10-0-0-10 ~]$ ansible-playbook --private-key=.ssh/ec2-key.pem -i ./ansible_hosts exec_script.yml

9. removes記述時の結果を確認してみましょう

同じようにansibleコマンドで。。

[ec2-user@ip-10-0-0-10 ~]$ ansible --private-key=.ssh/ec2-key.pem -i ./ansible_hosts webs  -a "ls -l exec_script.txt"
10.0.1.10 | success | rc=0 >>
-rw-r--r-- 1 root root 170 Jul  7 04:55 exec_script.txt

10.0.2.10 | FAILED | rc=2 >>
ls: cannot access exec_script.txt: No such file or directory

「creates」と逆の結果になりますので、「check」ファイルを配置している「10.0.1.10」側にのみ処理が実行されていることが確認できます。 こちらもよさそうですね。

shell。

shellモジュールはリモートホストに配置しているシェルスクリプトを実行するものです。

1. playbookファイル(.yml)を準備します。

[ec2-user@ip-10-0-0-10 ~]$ cat exec_shell.yml 
- hosts: webs
  sudo: yes
  tasks:
      - name: copy file
        copy: src=/home/ec2-user/sumple.sh dest=/home/ec2-user/sumple.sh owner=ec2-user group=ec2-user mode=0755 

      - name: exec shell
        shell: /home/ec2-user/sumple.sh

      - name: delete file
        file: dest=/home/ec2-ser/sumple.sh state=absent
[ec2-user@ip-10-0-0-10 ~]$

scriptモジュールで使用したスクリプトをリモートホストで実行したいですが、元々リモートホスト側に配置していませんでしたので、copy処理をshell実行前に入れ、実行後にfileモジュールでリモート側のスクリプトを削除しています。

2. 実行。

[ec2-user@ip-10-0-0-10 ~]$ ansible-playbook --private-key=.ssh/ec2-key.pem -i ./ansible_hosts exec_shell.yml

確認手順は省略します。scriptモジュールでの手順を要領に確認をしてみてください。

さいごに

前回の記事ではplaybookでの例をあまり書けなかったので、今回は基本操作系のモジュールを追うとともに、playbook上で動作確認をしてみました。Ansibleにはたくさんのモジュールがありますが、モジュールの操作にある程度慣れてくると、playbookでの構成管理が見えてくるのではと思います。

まだクラウドモジュールに触れられていませんので、そのあたりはまた次の機会に。。。 それでは