異なるパラメータセットを使用して1つのロールを実行するためのベストプラクティスは何ですか?
1つのサーバーで1つのアプリケーション(Dockerコンテナー)を、それぞれに異なる環境変数を使用して複数回実行する必要があります。
この種のことに関しては、Ansibleのドキュメントには制限があります。公式のベストプラクティスがある場合、私はそれに遭遇していません。
プレイブックを読みやすくするための良い方法の1つは、ホストに対していくつかの異なるプレイを実行し、それぞれに異なるパラメーターを使用してロールを呼び出すことです。
role: foo, var: blah
構文を少し説明します この説明 は、パラメーターを渡すための良い方法であり、何が起こっているのかが一目でわかります。例えば:
- name: Run the docker role with docker_container_state=foo
hosts: docker-Host
roles:
- { role: docker_container, docker_container_state: foo }
- name: Run the docker role with docker_container_state=bar
hosts: docker-Host
roles:
- { role: docker_container, docker_container_state: bar }
変数の適切なレイアウトがある場合、私は通常 includes を使用して、ロールの一部(またはロール全体!)を複数回実行します。以下のプレイブックの例を参照してください。役割はapply_state
で、print_state.yml
フォルダー内にroles/apply_state/tasks
があります。秘訣は、アイテムをインクルード内に渡すことです。その後、それはケーキになります。
playbook.yml
- hosts: localhost
roles:
- { role: apply_state, states: [ state_one, state_two, state_three ] }
roles/apply_state/tasks/main.yml
- name: print all states!
include: print_state.yml state="{{ item }}"
with_items: "{{ states }}"
roles/apply_state/tasks/print_state.yml
- name: echo state
debug: msg="{{ state }}"
以下のansible-playbook -i localhost, playbook.yml
の出力を参照してください。
PLAY [localhost] ***************************************************************
TASK [setup] *******************************************************************
ok: [localhost]
TASK [apply_state : print all states!] *****************************************
included: /home/user/roles/apply_state/tasks/print_state.yml for localhost
included: /home/user/roles/apply_state/tasks/print_state.yml for localhost
included: /home/user/roles/apply_state/tasks/print_state.yml for localhost
TASK [apply_state : echo state] ************************************************
ok: [localhost] => {
"msg": "state_one"
}
TASK [apply_state : echo state] ************************************************
ok: [localhost] => {
"msg": "state_two"
}
TASK [apply_state : echo state] ************************************************
ok: [localhost] => {
"msg": "state_three"
}
PLAY RECAP *********************************************************************
localhost : ok=7 changed=0 unreachable=0 failed=0
以下の情報が必要な場合は、
場合によっては、Ansibleロールに引数を渡すことは、それを複数回効果的に実行するための人工的な方法です。
典型的な使用例は、アプリケーションをインストールする過程で、同じプレイブックで、毎回異なる構成でアプリケーションを数回再起動することです。デフォルトでは、Ansibleは再起動の役割がすでに実行されていると見なし、再生しません。これはべき等と関係があるに違いありません。
解決策は、複数回実行されるロールのmeta/main.yml
に次のプロパティを追加することです。
allow_duplicates: true
そして、あなたは行ってもいいです!