ansibleには「playbook」 という機能があります。
簡単に言うと
ansibleコマンド → 単純に1コマンドもしくはワンライナーのコマンドを実行したい
ansible-playbookコマンド → playbookに「変数」や「繰り返し」など複雑な処理を書いて実行したい
です。
今回は更に「ansible-playbook」 の作成方法や使い方を解説します。
Ansible のインストールや初期設定に関しては以下の記事を参照ください。
AWSインフラ研究所
https://go-journey.club/archives/3357
AWSを中心としたクラウドインフラ技術サイト
AWS EC2 を Ansible で構成管理をする場合の設定方法です。
AWSインフラ研究所
https://go-journey.club/archives/3400
AWSを中心としたクラウドインフラ技術サイト
Ansible プレイブックの基礎
ansibleのプレイブック「playbook」 の機能を使うと、サーバーの構築や運用管理の質が大幅に向上します。
※playbookとは「ドラマの脚本」、「アメフトの作戦計画書」などの意味です。
プレイブックにはターゲットノード上で実行したい処理を記述します。
単純な構成で、プレイブックに書かれてある処理を上から順番にやっていくだけです。
以下、詳しく見ていきましょう。
プレイブックは YAML 形式で記述するから簡単
YAMLは「ヤムル」 と呼びます。
YAMLは「YAML Ain’t a Markup Language」 の略で「YAMLはマークアップ言語ではありません」 という意味です。
YAMLはインデントやハイフンなどを使ってデータの構造を表します。
YAML形式のファイルは「.yml」 の拡張子が付きます。
YAMLの大きな特徴
YAML形式ファイルの大きな特徴は
テキストファイルで読める
プログラムに詳しくなくても何となく分かる
です。
この特徴が非常に重要で、今まで「Chef」 や「Puppet」 にはなかった「簡単さ・気軽さ」 を Ansible にもたらしています。
実際、サーバー周りを運用管理するインフラのエンジニアはプログラマーではないので、プログラムに関する理解度はバラつきがあります。
しかしYAML形式でプレイブックを書けることで、様々なレベルのエンジニアが共通の理解ができるようになります。
→大きな組織ではこの共通の理解が重要になります。
プレイブックの構造
プレイブックの構造は、いつくかのセクションに分かれています。
例えば pingの疎通確認をするプレイブックの場合
プレイブックはインデントが大きな役割を担っています。
インデントで処理・動作が変わります。
そのためインデントには注意しましょう。
$ cat playbook.yml
– hosts: all # 指定したすべてのサーバで行いたい場合
sudo: yes # sudoを利用するかどうか
tasks: # Tasks以下に実際に行う処理を記述していく
– name: ping # 処理の名前
ping:
ansible-playbook を実行してみます。
$ ansible-playbook ping-playbook.yml -i hostlist
PLAY [all] ***********************************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************************
ok: [160.xxx.xxx.115]
ok: [192.168.1.11]
ok: [192.168.1.10]
TASK [ping] **********************************************************************************************************************
ok: [192.168.1.11]
ok: [160.xxx.xxx.115]
ok: [192.168.1.10]
to retry, use: –limit @/home/ansible_test/ansible/ping-playbook.retry
PLAY RECAP ***********************************************************************************************************************
160.xxx.xxx.115 : ok=2 changed=0 unreachable=0 failed=0
192.168.1.10 : ok=2 changed=0 unreachable=0 failed=0
192.168.1.11 : ok=2 changed=0 unreachable=0 failed=0
もう1度 yaml ファイルを確認してみましょう。
$ cat playbook.yml
– hosts: all ← Targets セクション
tasks: ← Task セクション
– name: ping
ping:
このように Ansible のプレイブックは複数のセクションから成り立っています。
例えば、プレイブックに Task が3つあれば、1 play 3 task のプレイブックになります。
ターゲット(Targets)セクション
ターゲットノードを指定します。
※ターゲット(Targets)セクションとインベントリファイルは違います。
インベントリファイルは、構成管理をしたいサーバー一覧であるのに対して、ターゲット(Targets)セクションは、サーバー一覧の中からどのサーバーに対して処理をしたいのかを選択するために使用します。
【例】インベントリファイルが以下の場合
$ cat hostlist
[local]
192.168.1.10
192.168.1.11
[remote]
160.xxx.xxx.xx5
[aws]
54.xx.xx.xx7
[all:vars]
ansible_ssh_port=22
ansible_ssh_user=ansible_test
ansible_ssh_pass=xxxxxxxxxxxxx
ターゲット(Targets)セクションは以下のようになります。
全台に対してタスクを実行したい場合
単純に all を指定するだけで、インベントリファイルに記述されている全台に対してタスクを実行します。
– hosts: all ← インベントリファイルに記載されている全台に対してタスクを実行します。「*」も「all」の意味になります。
tasks:
– name: ping
ping:
特定のグループだけに対してタスクを実行したい場合
例えば、[local] グループだけに対してタスクを実行したい場合は、以下のように設定します。
– hosts: local ← グループ名を指定します。
tasks:
– name: ping
ping:
特定の1台だけに対してタスクを実行したい場合
例えば、グループではなく特定の1台に対してのみタスクを実行したい場合は、以下のように設定します。
– hosts: 192.168.1.10 ← ホスト名、IPアドレス、FQDNなど直接指定してもOKです。
tasks:
– name: ping
ping:
※もちろん、ここで指定する特定の1台は、あらかじめインベントリファイルに記載されている必要があります。
仕様上、Ansibleはインベントリファイルに記載のないマシンに対してはタスクを実行しません。
特定の複数のグループを指定したい場合
例えば、[local]グループ と、[remote]グループ の2つのみに対してタスクを実行したい場合は以下のようになります。
グループは、コロン[:]で区切ることで複数指定することができます。
– hosts: local:remote ← 複数のグループ名を[:]で区切って指定します。
tasks:
– name: ping
ping:
タスク(Tasks)セクション
タスク(Tasks)セクションで具体的な処理を定義します。
ping 確認をする場合
以下のように ping 確認用のプレイブック「ping-playbook.yml」 を作成します。
$ vi ping-playbook.yml
$ cat ping-playbook.yml
– hosts: 192.168.1.10 ← 1台だけ指定します。
tasks:
– name: ping check
ping:
ansible-playbook で実行します。
$ ansible-playbook -i hostlist ping-playbook.yml
PLAY [192.168.1.10] *********************************************************************************
TASK [Gathering Facts] ******************************************************************************
ok: [192.168.1.10]
TASK [ping check] ***********************************************************************************
ok: [192.168.1.10]
PLAY RECAP ******************************************************************************************
192.168.1.10 : ok=2 changed=0 unreachable=0 failed=0
httpd をインストールする場合
例としてローカルサーバーの「192.168.1.10」に「httpd」をインストールします。
$ vi httpd-install-playbook.yml
– hosts: 192.168.1.10 ← 1台だけ指定します。
become: true ← become ディレクティブは、接続アカウント以外のアカウントで実行する場合に指定します。(今回は接続アカウントが「ansible_test」で yum でインストールするのは root アカウントなので記述しています)
become_user: root ← ターゲットノードで処理を実行するアカウントを指定します。今回は「root」アカウントで実行するので「root」を指定しています。
become_method: sudo ← ターゲットノード上で「become_user」で指定したアカウントにスイッチするコマンドを指定します。デフォルトは「sudo」です。
tasks:
– name: httpd install
yum: name=httpd state=installed
$ cat httpd-install-playbook.yml
– hosts: 192.168.1.10
become: true
become_user: root
become_method: sudo
tasks:
– name: httpd install
yum: name=httpd state=installed
ansible-playbook で実行します。
$ ansible-playbook -i hostlist httpd-install-playbook.yml
PLAY [192.168.1.10] *********************************************************************************
TASK [Gathering Facts] ******************************************************************************
ok: [192.168.1.10]
TASK [httpd install] ********************************************************************************
changed: [192.168.1.10]
PLAY RECAP ******************************************************************************************
192.168.1.10 : ok=2 changed=1 unreachable=0 failed=0
httpdのインストール結果を確認ます。
$ rpm -qa | grep httpd
httpd-tools-2.4.6-45.el7.centos.4.x86_64
httpd-2.4.6-45.el7.centos.4.x86_64
wgetをインストールする場合
CentOS6に「wget」 をインストールする手順を紹介します。
Ansibleを使えば、個別パッケージのインストールも可能です。
※CentOSを「minimum」でインストールすると、よく使うコマンドが入ってない時があります。
$ cat wget-install-playbook.yml
– hosts: 192.168.1.11
become: true
become_user: root
become_method: sudo
tasks:
– name: wget install
yum: name=wget state=installed
ansible-playbookを実行します。
$ ansible-playbook -i hostlist wget-install-playbook.yml
PLAY [192.168.1.11] *********************************************************************************
TASK [Gathering Facts] ******************************************************************************
ok: [192.168.1.11]
TASK [wget install] *********************************************************************************
changed: [192.168.1.11]
PLAY RECAP ******************************************************************************************
192.168.1.11 : ok=2 changed=1 unreachable=0 failed=0
wgetコマンドがインストールされました。
[root@cent06 ~]# wget
wget: URLがありません
使い方: wget [オプション]… [URL]…
詳しいオプションは `wget –help’ を実行してください。
[DEPRECATION WARNING]: Instead of sudo/sudo_user, が出力される場合
以下のように警告が表示される場合があります。
$ ansible-playbook -i hostlist httpd-install-playbook.yml
[DEPRECATION WARNING]: Instead of sudo/sudo_user, use become/become_user and make sure become_method
is ‘sudo’ (default).
This feature will be removed in a future release. Deprecation warnings can be
disabled by setting deprecation_warnings=False in ansible.cfg.
以下の設定が原因です。
$ cat httpd-install-playbook.yml
– hosts: 192.168.1.10
sudo: yes ← sudoディレクディブを利用すると警告が出ます。
tasks:
– name: httpd install
yum: name=http state=installed
これはエラーではなく警告でタスク自体は実行できますが、Ansibleの仕様で将来的に「sudo」は廃止するようなので使用しない方がいいでしょう。
ハンドラー(Handlers)セクション
Tasks セクションと同じように処理を定義します。
Tasks セクションとの違いは、例えば yum update でアップデート処理が走った時だけサービスを再起動するなど、更新された場合のみ特定の処理を実行したい場合に利用します。
httpdをアップデートした場合のみサービスを再起動したい場合
実際にハンドラー(Handlers)セクションを使って少々複雑なプレイブックを作成してみましょう。
1.プレイブックを作成する
$ vi httpd-update-playbook.yml
– hosts: 192.168.1.11
become: true
become_user: root
become_method: sudo
tasks:
– name: httpd update
yum: name=httpd state=latest
notify:
– Restart httpd
handlers:
– name: Restart httpd
service: name=httpd state=restarted
$ cat httpd-update-playbook.yml
– hosts: 192.168.1.11
become: true
become_user: root
become_method: sudo
tasks:
– name: httpd update
yum: name=httpd state=latest
notify:
– Restart httpd
handlers:
– name: Restart httpd
service: name=httpd state=restarted
2.以前のバージョンの httpd をターゲットノードにインストールする
ターゲットノードにログインして以前のバージョンの httpd をダウンロードしてインストールします。
# wget http://vault.centos.org/6.0/os/x86_64/Packages/httpd-2.2.15-5.el6.centos.x86_64.rpm
# wget http://vault.centos.org/6.0/os/x86_64/Packages/httpd-tools-2.2.15-5.el6.centos.x86_64.rpm
# yum install httpd-2.2.15-5.el6.centos.x86_64.rpm httpd-tools-2.2.15-5.el6.centos.x86_64.rpm
インストール:
httpd.x86_64 0:2.2.15-5.el6.centos httpd-tools.x86_64 0:2.2.15-5.el6.centos
完了しました!
# chkconfig | grep httpd
httpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
# chkconfig httpd on
# chkconfig | grep httpd
httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
# service httpd start
httpd を起動中: httpd: apr_sockaddr_info_get() failed for cent06.localdomain
httpd: Could not reliably determine the server’s fully qualified domain name, using 127.0.0.1 for ServerName
[ OK ]
# service httpd status
httpd (pid 1746) を実行中…
3.ansible-playbookを実行する
ansible-playbookを実行します。
$ ansible-playbook -i hostlist httpd-update-playbook.yml
PLAY [192.168.1.11] *********************************************************************************
TASK [Gathering Facts] ******************************************************************************
ok: [192.168.1.11]
TASK [httpd update] *********************************************************************************
changed: [192.168.1.11]
RUNNING HANDLER [Restart httpd] *********************************************************************
changed: [192.168.1.11]
PLAY RECAP ******************************************************************************************
192.168.1.11 : ok=3 changed=2 unreachable=0 failed=0
$
4.チェックをする
最後にアップデートがされていることを確認します。
# rpm -qa | grep httpd
httpd-tools-2.2.15-59.el6.centos.x86_64
httpd-2.2.15-59.el6.centos.x86_64
バー(Vars)セクション
変数を定義します。
変数を定義することで
プレイブックが読みやすくなる
変更がしやすくなる
タスクを効率化できる
などのメリットがあります。
変数を使って複数のアカウントを作成する場合
test01~test06まで6アカウントを作成します。
パスワードは6アカウント共通にします。
初めに事前準備としてハッシュ化したパスワードを作成します。
その理由は、
パスワードをそのまま yml ファイルに記述すると漏えいする可能性がある
/etc/passwd にパスワードが平文で登録されてしまい漏えいする可能性がある
などセキュリティホールになる可能性があるため、パスワードをハッシュ化してからアカウントを作成します。
CentOS6 の場合、パスワードのハッシュ化は「grub-crypt」 コマンドを使います。
# grub-crypt –sha-512
Password:
Retype password:
$6$InC1ytwkn41Ofh71$tSwwe6GW.SMWdbAcpzqK/9xTzoBTZIOeFPJcN0P8rCZCCDB7F0cTcUdxQ7I6KFgFVowBE8keqopOXZgCQ7/t3.
CentOS7の場合は、「grub-crypt」コマンドがないので、以下の Python コマンド で作成します。
以下、パスワードが「password12345」の場合のハッシュ化したパスワード生成コマンドです。
[ansible_test@cnt07 ansible]$ python -c ‘import crypt; print crypt.crypt(“password12345”, “$6$random_salt”)’
$6$random_salt$X2hH6DGbX0lrhVzLxTwPAAZFUREkSAkisjXnr3f.K9mAlgXcKoGi1Fs90x8gAsY7ddNeOdO4Qk1RmvdMC7T0U/
[ansible_test@cnt07 ansible]$
詳しく解説しますと、
「import crypt」 で crypt モジュールをインポートしています。
「crypt.crypt(”任意のパスワード”, “salt値”)」 で「任意のパスワード」 をハッシュ化しています。
「salt」 とは暗号化アルゴリズムにブレ を生じさせるために使うキーワードです。
そのため、「test」でも「1234」でも何でもいいです。
その「crypt.crypt」の結果を「print」 で表示しています。
ちょっとややこしいかもしれませんが、CentOS7の場合はこの方法でハッシュ化されたパスワードを生成することができます。
ハッシュ化したパスワードを yml ファイルに記載します。
$ vi create-account-playbook.yml
– hosts: 192.168.1.11
become: true
become_user: root
become_method: sudo
tasks:
– name: Create Group
group:
name=”{{ item.groups }}”
gid=”{{ item.gids }}”
with_items:
– { groups: ‘test01’, gids: 3001 }
– { groups: ‘test02’, gids: 3002 }
– { groups: ‘test03’, gids: 3003 }
– { groups: ‘test04’, gids: 3004 }
– { groups: ‘test05’, gids: 3005 }
– { groups: ‘test06’, gids: 3006 }
– name: Create Users
user:
name=”{{ item.account }}”
group=”{{ item.groups }}”
password=”{{ item.password }}”
with_items:
– { account: ‘test01’, groups: ‘test01’, gids: 3001, password: ‘$6$InC1ytwkn41Ofh71$tSwwe6GW.SMWdbAcpzqK/9xTzoBTZIOeFPJcN0P8rCZCCDB7F0cTcUdxQ7I6KFgFVowBE8keqopOXZgCQ7/t3.’ }
– { account: ‘test02’, groups: ‘test02’, gids: 3002, password: ‘$6$InC1ytwkn41Ofh71$tSwwe6GW.SMWdbAcpzqK/9xTzoBTZIOeFPJcN0P8rCZCCDB7F0cTcUdxQ7I6KFgFVowBE8keqopOXZgCQ7/t3.’ }
– { account: ‘test03’, groups: ‘test03’, gids: 3003, password: ‘$6$InC1ytwkn41Ofh71$tSwwe6GW.SMWdbAcpzqK/9xTzoBTZIOeFPJcN0P8rCZCCDB7F0cTcUdxQ7I6KFgFVowBE8keqopOXZgCQ7/t3.’ }
– { account: ‘test04’, groups: ‘test04’, gids: 3004, password: ‘$6$InC1ytwkn41Ofh71$tSwwe6GW.SMWdbAcpzqK/9xTzoBTZIOeFPJcN0P8rCZCCDB7F0cTcUdxQ7I6KFgFVowBE8keqopOXZgCQ7/t3.’ }
– { account: ‘test05’, groups: ‘test05’, gids: 3005, password: ‘$6$InC1ytwkn41Ofh71$tSwwe6GW.SMWdbAcpzqK/9xTzoBTZIOeFPJcN0P8rCZCCDB7F0cTcUdxQ7I6KFgFVowBE8keqopOXZgCQ7/t3.’ }
– { account: ‘test06’, groups: ‘test06’, gids: 3006, password: ‘$6$InC1ytwkn41Ofh71$tSwwe6GW.SMWdbAcpzqK/9xTzoBTZIOeFPJcN0P8rCZCCDB7F0cTcUdxQ7I6KFgFVowBE8keqopOXZgCQ7/t3.’ }
$ cat create-account-playbook.yml
– hosts: 192.168.1.11
become: true
become_user: root
become_method: sudo
tasks:
– name: Create Group
group:
name=”{{ item.groups }}”
gid=”{{ item.gids }}”
with_items:
– { groups: ‘test01’, gids: 3001 }
– { groups: ‘test02’, gids: 3002 }
– { groups: ‘test03’, gids: 3003 }
– { groups: ‘test04’, gids: 3004 }
– { groups: ‘test05’, gids: 3005 }
– { groups: ‘test06’, gids: 3006 }
– name: Create Users
user:
name=”{{ item.account }}”
group=”{{ item.groups }}”
password=”{{ item.password }}”
with_items:
– { account: ‘test01’, groups: ‘test01’, gids: 3001, password: ‘$6$InC1ytwkn41Ofh71$tSwwe6GW.SMWdbAcpzqK/9xTzoBTZIOeFPJcN0P8rCZCCDB7F0cTcUdxQ7I6KFgFVowBE8keqopOXZgCQ7/t3.’ }
– { account: ‘test02’, groups: ‘test02’, gids: 3002, password: ‘$6$InC1ytwkn41Ofh71$tSwwe6GW.SMWdbAcpzqK/9xTzoBTZIOeFPJcN0P8rCZCCDB7F0cTcUdxQ7I6KFgFVowBE8keqopOXZgCQ7/t3.’ }
– { account: ‘test03’, groups: ‘test03’, gids: 3003, password: ‘$6$InC1ytwkn41Ofh71$tSwwe6GW.SMWdbAcpzqK/9xTzoBTZIOeFPJcN0P8rCZCCDB7F0cTcUdxQ7I6KFgFVowBE8keqopOXZgCQ7/t3.’ }
– { account: ‘test04’, groups: ‘test04’, gids: 3004, password: ‘$6$InC1ytwkn41Ofh71$tSwwe6GW.SMWdbAcpzqK/9xTzoBTZIOeFPJcN0P8rCZCCDB7F0cTcUdxQ7I6KFgFVowBE8keqopOXZgCQ7/t3.’ }
– { account: ‘test05’, groups: ‘test05’, gids: 3005, password: ‘$6$InC1ytwkn41Ofh71$tSwwe6GW.SMWdbAcpzqK/9xTzoBTZIOeFPJcN0P8rCZCCDB7F0cTcUdxQ7I6KFgFVowBE8keqopOXZgCQ7/t3.’ }
– { account: ‘test06’, groups: ‘test06’, gids: 3006, password: ‘$6$InC1ytwkn41Ofh71$tSwwe6GW.SMWdbAcpzqK/9xTzoBTZIOeFPJcN0P8rCZCCDB7F0cTcUdxQ7I6KFgFVowBE8keqopOXZgCQ7/t3.’ }
ansible-playbookを実行します。
$ ansible-playbook -i hostlist create-account-playbook.yml
PLAY [192.168.1.11] ************************************************************************************
TASK [Gathering Facts] *********************************************************************************
ok: [192.168.1.11]
TASK [Create Group] ************************************************************************************
changed: [192.168.1.11] => (item={u’groups’: u’test01′, u’gids’: 3001})
changed: [192.168.1.11] => (item={u’groups’: u’test02′, u’gids’: 3002})
changed: [192.168.1.11] => (item={u’groups’: u’test03′, u’gids’: 3003})
changed: [192.168.1.11] => (item={u’groups’: u’test04′, u’gids’: 3004})
changed: [192.168.1.11] => (item={u’groups’: u’test05′, u’gids’: 3005})
changed: [192.168.1.11] => (item={u’groups’: u’test06′, u’gids’: 3006})
TASK [Create Users] ************************************************************************************
changed: [192.168.1.11] => (item={u’account’: u’test01′, u’password’: u’$6$InC1ytwkn41Ofh71$tSwwe6GW.SMWdbAcpzqK/9xTzoBTZIOeFPJcN0P8rCZCCDB7F0cTcUdxQ7I6KFgFVowBE8keqopOXZgCQ7/t3.’, u’groups’: u’test01′, u’gids’: 3001})
changed: [192.168.1.11] => (item={u’account’: u’test02′, u’password’: u’$6$InC1ytwkn41Ofh71$tSwwe6GW.SMWdbAcpzqK/9xTzoBTZIOeFPJcN0P8rCZCCDB7F0cTcUdxQ7I6KFgFVowBE8keqopOXZgCQ7/t3.’, u’groups’: u’test02′, u’gids’: 3002})
changed: [192.168.1.11] => (item={u’account’: u’test03′, u’password’: u’$6$InC1ytwkn41Ofh71$tSwwe6GW.SMWdbAcpzqK/9xTzoBTZIOeFPJcN0P8rCZCCDB7F0cTcUdxQ7I6KFgFVowBE8keqopOXZgCQ7/t3.’, u’groups’: u’test03′, u’gids’: 3003})
changed: [192.168.1.11] => (item={u’account’: u’test04′, u’password’: u’$6$InC1ytwkn41Ofh71$tSwwe6GW.SMWdbAcpzqK/9xTzoBTZIOeFPJcN0P8rCZCCDB7F0cTcUdxQ7I6KFgFVowBE8keqopOXZgCQ7/t3.’, u’groups’: u’test04′, u’gids’: 3004})
changed: [192.168.1.11] => (item={u’account’: u’test05′, u’password’: u’$6$InC1ytwkn41Ofh71$tSwwe6GW.SMWdbAcpzqK/9xTzoBTZIOeFPJcN0P8rCZCCDB7F0cTcUdxQ7I6KFgFVowBE8keqopOXZgCQ7/t3.’, u’groups’: u’test05′, u’gids’: 3005})
changed: [192.168.1.11] => (item={u’account’: u’test06′, u’password’: u’$6$InC1ytwkn41Ofh71$tSwwe6GW.SMWdbAcpzqK/9xTzoBTZIOeFPJcN0P8rCZCCDB7F0cTcUdxQ7I6KFgFVowBE8keqopOXZgCQ7/t3.’, u’groups’: u’test06′, u’gids’: 3006})
PLAY RECAP *********************************************************************************************
192.168.1.11 : ok=3 changed=2 unreachable=0 failed=0
結果を確認します。
# cat /etc/passwd | grep test
test:x:500:500::/home/test:/bin/bash
ansible_test:x:501:501::/home/ansible_test:/bin/bash
test01:x:502:3001::/home/test01:/bin/bash
test02:x:503:3002::/home/test02:/bin/bash
test03:x:504:3003::/home/test03:/bin/bash
test04:x:505:3004::/home/test04:/bin/bash
test05:x:506:3005::/home/test05:/bin/bash
test06:x:507:3006::/home/test06:/bin/bash
# cat /etc/shadow | grep test
test:$6$mg9bhIkj$UBgoAQz98VzA5eOR9n6T7CBhmFCdMXekhLcxE2oVeW9IwOtq0SoPig0GvHxRxHhzw8iPScJbFuSy9fZAwoAFA0:17333:0:99999:7:::
ansible_test:$6$MUbYuosn$3sb3uCHsR9d5vSKO8ijMlOqJ3TPoywYKmtastsUu/earr583y.Mq8y4cJI/9mkC1X7YVVsBnJq6nxHczvL4DF1:17333:0:99999:7:::
test01:$6$InC1ytwkn41Ofh71$tSwwe6GW.SMWdbAcpzqK/9xTzoBTZIOeFPJcN0P8rCZCCDB7F0cTcUdxQ7I6KFgFVowBE8keqopOXZgCQ7/t3.:17335:0:99999:7:::
test02:$6$InC1ytwkn41Ofh71$tSwwe6GW.SMWdbAcpzqK/9xTzoBTZIOeFPJcN0P8rCZCCDB7F0cTcUdxQ7I6KFgFVowBE8keqopOXZgCQ7/t3.:17335:0:99999:7:::
test03:$6$InC1ytwkn41Ofh71$tSwwe6GW.SMWdbAcpzqK/9xTzoBTZIOeFPJcN0P8rCZCCDB7F0cTcUdxQ7I6KFgFVowBE8keqopOXZgCQ7/t3.:17335:0:99999:7:::
test04:$6$InC1ytwkn41Ofh71$tSwwe6GW.SMWdbAcpzqK/9xTzoBTZIOeFPJcN0P8rCZCCDB7F0cTcUdxQ7I6KFgFVowBE8keqopOXZgCQ7/t3.:17335:0:99999:7:::
test05:$6$InC1ytwkn41Ofh71$tSwwe6GW.SMWdbAcpzqK/9xTzoBTZIOeFPJcN0P8rCZCCDB7F0cTcUdxQ7I6KFgFVowBE8keqopOXZgCQ7/t3.:17335:0:99999:7:::
test06:$6$InC1ytwkn41Ofh71$tSwwe6GW.SMWdbAcpzqK/9xTzoBTZIOeFPJcN0P8rCZCCDB7F0cTcUdxQ7I6KFgFVowBE8keqopOXZgCQ7/t3.:17335:0:99999:7:::
#
with_item ディレクディブ
上の例で記載した通り「with_item」 ディレクディブを利用することで、プレイブックをスッキリとまとめることができるようになります。
ただあまり使いすぎると却って可読性が低下するので、ほどほどに利用するのがいいと思います。
例えば、with_itemsディレクディブを利用してグループを複数作る例ですが、{{ item.groups }} が「変数」 となり、変数の中に「test01」 が代入されます。
処理の順番は、tasks の「name(- name: Create Groupのこと)」 が1セットになるので、グループ「test01 3001」 が代入され、1セットの処理が完了したら(グループが作成されたら)、グループ「test02 3002」 が作成されるというようにシーケンシャルに(1つ1つ連続的に)処理されます。
つまりパラレルで順不同で一気にグループが6つ作られるわけではありません。
tasks:
– name: Create Group
group:
name=”{{ item.groups }}”
gid=”{{ item.gids }}”
with_items:
– { groups: ‘test01’, gids: 3001 }
– { groups: ‘test02’, gids: 3002 }
– { groups: ‘test03’, gids: 3003 }
– { groups: ‘test04’, gids: 3004 }
– { groups: ‘test05’, gids: 3005 }
– { groups: ‘test06’, gids: 3006 }
まとめ
最初にプレイブックを作り込めれば、これほど簡単に確実にサーバーを管理できるツールは他にないと思いました。
ターゲットノードのディストリビューションもバージョンの違いも吸収してくれますし、何台サーバーがあっても(それこそ数千台レベルでも)何度も繰り返し全台に対して任意の設定を入れることができます。
体感的には1台2~3秒レベルで設定できるように感じました。
100台に対して ansible-playbook を実行した時は1~2分程度で処理が完了したと思います。
今後も ansible について詳しく調べて業務で活用できるように playbook 作成と実行結果からの検証を積み重ねていきたいと思います。
コメント