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

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

Posted at April 25,2025 11:55 PM
Tag:[ansible]

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
関連記事
トラックバックURL


コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)