こんにちは。構築担当の下地です。
最近はAnsibleとServerspecのコードをいじることが多く、中々うまく動かないなーという毎日ですが、構成管理ツールや自動チェックツールはおもしろいですね。
今日は最近Ansibleでハマった事象について書いてみます。
宜しくお願いします。
include_roleでroleをwith_itemsで回したい
まず現在のディレクトリ構成は以下のようになっています。
# tree -L 2
.
├── group_vars
│ └── target_server.yml
├── host_vars
├── inventory
│ └── inventory.ini
├── roles
│ ├── change_hosts_file
│ ├── change_password
│ ├── change_resolv_file
│ ├── common
│ ├── config_hostname
│ ├── epel_remi_install
│ ├── httpd_setup
│ ├── httpd_ssl_config
│ ├── httpd_virtualhost_config
│ ├── mysql56_setup
│ ├── mysql57_setup
│ ├── mysql_check
│ ├── phpmyadmin_setup
│ ├── php_setup
│ ├── selinux_disable
│ ├── serverreboot
│ ├── sshd_setup
│ ├── time_zone_change
│ ├── vsftpd_setup
│ ├── wordpress
│ └── yumupdate
├── site.yml
└── site.yml.org
25 directories, 4 files
このようにrolesディレクトリに多数のroleが配置されています。
この中にあるroleをいくつかピックアップしてcommonロールの中で利用したい感じです。
検証のため、まずメインのplaybookであるsite.ymlの中はシンプルにcommonのみ記載します。
# cat site.yml
---
- hosts: target_server
roles:
- common
また、commonロールのmain.ymlは以下のように書きました。
期待する結果としてはwith_itemsに指定したroleをループでincludeすることです。
# cat roles/common/tasks/main.yml
---
- name: 各種初期設定を行います
include_role:
name: "{{item}}"
with_items:
- config_hostname
- change_password
- change_resolv_file
- change_hosts_file
- sshd_setup
- time_zone_change
- yumupdate
実行結果
この構成で実行してみます。
すると以下のようになりました。
期待する結果とは反して、一番下のitemのみが何度も実行されています。
# ansible-playbook -i inventory/inventory.ini site.yml
PLAY [target_server] *******************************************************************************************************************************************************************
TASK [Gathering Facts] *****************************************************************************************************************************************************************
ok: [116.118.239.183]
TASK [common : 各種初期設定を行います] ************************************************************************************************************************************************************
TASK [yumupdate : yum updateを実行します] ****************************************************************************************************************************************************
ok: [116.118.239.183]
TASK [yumupdate : /etc/yum.confにexclude処理を追記します] ***************************************************************************************************************************************
ok: [116.118.239.183]
TASK [yumupdate : yum updateを実行します] ****************************************************************************************************************************************************
ok: [116.118.239.183]
TASK [yumupdate : /etc/yum.confにexclude処理を追記します] ***************************************************************************************************************************************
ok: [116.118.239.183]
TASK [yumupdate : yum updateを実行します] ****************************************************************************************************************************************************
ok: [116.118.239.183]
TASK [yumupdate : /etc/yum.confにexclude処理を追記します] ***************************************************************************************************************************************
ok: [116.118.239.183]
TASK [yumupdate : yum updateを実行します] ****************************************************************************************************************************************************
ok: [116.118.239.183]
TASK [yumupdate : /etc/yum.confにexclude処理を追記します] ***************************************************************************************************************************************
ok: [116.118.239.183]
TASK [yumupdate : yum updateを実行します] ****************************************************************************************************************************************************
ok: [116.118.239.183]
TASK [yumupdate : /etc/yum.confにexclude処理を追記します] ***************************************************************************************************************************************
ok: [116.118.239.183]
TASK [yumupdate : yum updateを実行します] ****************************************************************************************************************************************************
ok: [116.118.239.183]
TASK [yumupdate : /etc/yum.confにexclude処理を追記します] ***************************************************************************************************************************************
ok: [116.118.239.183]
TASK [yumupdate : yum updateを実行します] ****************************************************************************************************************************************************
ok: [116.118.239.183]
TASK [yumupdate : /etc/yum.confにexclude処理を追記します] ***************************************************************************************************************************************
ok: [116.118.239.183]
PLAY RECAP *****************************************************************************************************************************************************************************
116.118.239.183 : ok=15 changed=0 unreachable=0 failed=0
どうしてうまく動かない?
色々ネットで調べてみると、どうもこの不具合は既に認識されており、githubにissuesやpull requestが上がっていました。
こちらがissuesの記事。
https://github.com/ansible/ansible/issues/37016
こちらがpull request。
https://github.com/ansible/ansible/pull/36372
となると次のバージョンでは改修されるかな?と思いAnsibleの公式を見てみると、そろそろAnsible ver2.6がリリースされる模様です。
https://docs.ansible.com/ansible/devel/roadmap/ROADMAP_2_6.html#release-schedule
本記事の執筆日は6/7ですが、Ansible 2.6は遅くても6/28にはリリースされそうですので、Ansible 2.6がリリースされ次第入れてみて検証する予定です。
まとめ
Ansibleはこの間ver 2.5が出たと思ったら、既にver 2.6がリリース予定と、開発のスピードと勢いが凄いですね!
触っていても面白いツールですので、また時間をみつけてコードをいじり倒そうと思います。
今回もお読み頂きありがとうございました。