使用不同的参数集运行一个角色的最佳做法是什么?
我需要在一台服务器上多次运行一个应用程序(docker container),每个服务器都有不同的环境变量。
答案 0 :(得分:10)
当涉及到这种事情时,Ansible文档存在局限性 - 如果有官方最佳实践,我还没有遇到过它。
让您的剧本保持良好和可读性的一个好方法是针对主持人运行几个不同的剧本,并在每个剧中调用不同参数的角色。
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 }
答案 1 :(得分:6)
如果我有一个体面的变量布局,我通常会使用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 ] }
<强>角色/ apply_state /任务/ main.yml 强>
- name: print all states!
include: print_state.yml state="{{ item }}"
with_items: "{{ states }}"
<强>角色/ apply_state /任务/ 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
答案 2 :(得分:0)
如果您需要以下信息,
有时候,将参数传递给Ansible角色是一种有效地多次运行它的人为方法。
典型的用例是在安装过程中在同一剧本中多次重新启动应用程序,每次使用不同的配置。默认情况下,Ansible将认为重启角色已经被扮演,并且不会重播。这一定与幂等有关。
解决方案是将以下属性添加到要多次执行的角色的meta/main.yml
中:
allow_duplicates: true
您很高兴!