トップページへ

ansibleで同名のroleを複数回実行する方法

小粋空間 » Linux » ansible » ansibleで同名のroleを複数回実行する方法

ansibleで同名のroleを複数回実行する方法を紹介します。

1.問題点

次のroleを作成しました。

roles/test/tasks/main.yml

- name: コマンド実行
  shell:
    cmd: hostname
  register: result
 
- name: 結果出力
  debug:
    msg: "{{ result.stdout_lines }}"

このroleを実行するplaybook(test.yml)は下記です。

- hosts: localhost
  connection: local
  roles:
    - role: test
    - role: test
    - role: test

inventoryは省略しますので適宜用意してください。

このplaybookを実行すると、roleは一度しか実行されません。

(ansible) [hoge@server ~]$ ansible-playbook -i inventory test.yml
 
PLAY [localhost] ********************************************************************************************************************
 
TASK [Gathering Facts] **************************************************************************************************************
ok: [localhost]
 
TASK [test : コマンド実行] **********************************************************************************************************
changed: [localhost]
 
TASK [test : 結果出力] **************************************************************************************************************
ok: [localhost] => {
    "msg": [
        "hoge-server"
    ]
}
 
PLAY RECAP **************************************************************************************************************************
localhost                  : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

2.原因

これは、Ansibleが「ロールの重複適用」を避ける設計になっているためです。

3.対処

いくつか方法はあるようですが、ここではplaybook内で「tags」を付与する方法を紹介します。

下記のように、roleごとにtagsを追加して、ユニークな値を設定します。

test.yml

- hosts: localhost
  connection: local
  roles:
    - role: test
      tags: "1"
    - role: test
      tags: "2"
    - role: test
      tags: "3"

これで同名のroleでも期待通り実行されます。

(ansible) [hoge@server ~]$ ansible-playbook -i inventory test.yml
 
PLAY [localhost] ********************************************************************************************************************
 
TASK [Gathering Facts] **************************************************************************************************************
ok: [localhost]
 
TASK [test : コマンド実行] **********************************************************************************************************
changed: [localhost]
 
TASK [test : 結果出力] **************************************************************************************************************
ok: [localhost] => {
    "msg": [
        "hoge-server"
    ]
}
 
TASK [test : コマンド実行] **********************************************************************************************************
changed: [localhost]
 
TASK [test : 結果出力] **************************************************************************************************************
ok: [localhost] => {
    "msg": [
        "hoge-server"
    ]
}
 
TASK [test : コマンド実行] **********************************************************************************************************
changed: [localhost]
 
TASK [test : 結果出力] **************************************************************************************************************
ok: [localhost] => {
    "msg": [
        "hoge-server"
    ]
}
 
PLAY RECAP **************************************************************************************************************************
localhost                  : ok=7    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

« 前の記事へ

トップページへ