Ansible,运行 角色多次使用不同的参数集

Ansible, running role multiple times with different parameter sets

运行使用不同参数集设置一个角色的最佳做法是什么?

我需要在一台服务器上多次 运行 一个应用程序(docker 容器),每个应用程序都有不同的环境变量。

A​​nsible 文档在涉及此类事情时存在局限性 - 如果有官方最佳实践,我还没有遇到过。

让您的剧本美观且可读的一个好方法是 运行 针对主机的几个不同的剧本,并在每个剧本中使用不同的参数调用角色。

role: foo, var: blah 语法显示在 this description 中是一种很好的传递参数的方法,并且一目了然地了解正在发生的事情。例如:

- 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_stateroles/apply_state/tasks 文件夹中具有 print_state.yml。诀窍是在 include 中传递 item,之后就是小菜一碟了。

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

一切顺利!