Ansible2.5にてinclude_roleでwith_itemsのループを使うと不具合が出てしまう

こんにちは。構築担当の下地です。

最近は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がリリース予定と、開発のスピードと勢いが凄いですね!

触っていても面白いツールですので、また時間をみつけてコードをいじり倒そうと思います。

今回もお読み頂きありがとうございました。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA