web-dev-qa-db-ja.com

Ansible、異なるパラメータセットで複数回実行中の役割

異なるパラメータセットを使用して1つのロールを実行するためのベストプラクティスは何ですか?

1つのサーバーで1つのアプリケーション(Dockerコンテナー)を、それぞれに異なる環境変数を使用して複数回実行する必要があります。

17
vuliad

この種のことに関しては、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 }
14
nikobelia

変数の適切なレイアウトがある場合、私は通常 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
7
Andrew

以下の情報が必要な場合は、

場合によっては、Ansibleロールに引数を渡すことは、それを複数回効果的に実行するための人工的な方法です。

典型的な使用例は、アプリケーションをインストールする過程で、同じプレイブックで、毎回異なる構成でアプリケーションを数回再起動することです。デフォルトでは、Ansibleは再起動の役割がすでに実行されていると見なし、再生しません。これはべき等と関係があるに違いありません。

解決策は、複数回実行されるロールのmeta/main.ymlに次のプロパティを追加することです。

allow_duplicates: true

そして、あなたは行ってもいいです!

1
avi.elkharrat