我正在尝试找到一种方法,可以按顺序循环运行剧本。也就是说,所有角色都使用一个值运行,然后再次使用第二个值,依此类推。
我已经尝试过了,但是每个角色在第二个角色运行之前都要经过循环。我希望这两个角色都可以在第二项循环之前运行。
例如:我的结构
group_vars:
- sys_stuff.yml
roles:
- role 1
- role 2
- role 3
playbook.yml
sys_stuff.yml具有
onesie:
memory: 1024
cpu: 4
email: blabla@bla
twosie:
memory: 512
cpu: 2
email: aa@bla.bla
我的playbook.yml:
- name: looping though tests
hosts: localhost
become: false
gather_facts: false
tasks:
- include_role:
name: display_msg
with_items: "{{ sys_stuff }}"
loop_control:
loop_var: sys_name
- include_role:
name: test_role
with_items: "{{ sys_stuff }}"
loop_control:
loop_var: sys_name
其中一个角色:
- name: msg in role 1
debug:
msg: "HELLO {{ sys_name }}"
当前输出:
TASK [include_role : test_role] *******************************************************************************************************************************************************************************************************************************************************************************************************************
TASK [test_role : msg in role1.yml] ***************************************************************************************************************************************************************************************************************************************************************************************************************
ok: [localhost] => {
"msg": "HELLO onesie"
}
TASK [test_role : msg in role1.yml] ***************************************************************************************************************************************************************************************************************************************************************************************************************
ok: [localhost] => {
"msg": "HELLO twosie"
}
TASK [display_msg : msg in display_role] **********************************************************************************************************************************************************************************************************************************************************************************************************
ok: [localhost] => {
"msg": "I am a messege on display message role onesie"
}
TASK [display_msg : fail] *************************************************************************************************************************************************************************************************************************************************************************************************************************
skipping: [localhost]
TASK [display_msg : msg in display_role] **********************************************************************************************************************************************************************************************************************************************************************************************************
ok: [localhost] => {
"msg": "I am a messege on display message role twosie"
}
我想要的是
run 1st role and output HELLO onsie
run 2nd role and output I am a messege on display message role onsie
run 1st role and outpul HELLO twosie
run 2nd role and output I am a messege on display message role twosie
这样,如果第一个失败,它仍然可以浏览其他项目
答案 0 :(得分:1)
一种可能的解决方案(未经测试的实现,您可能需要调整一点)是将循环移出更高级别的任务包括中的角色include。
例如:
创建一个my_role_sequence.yml
文件,
---
- include_role:
name: display_msg
- include_role:
name: test_role
修改您的剧本以遍历以下内容:
- name: looping though tests
hosts: localhost
become: false
gather_facts: false
tasks:
- include_tasks: my_role_sequence.yml
loop: "{{ lookup('dict', sys_stuff) }}"
loop_control:
loop_var: sys_name
同时,您可能有更好的选择,直接使用库存(在播放级别在组上循环,最终委派给localhost),并在播放级别利用serial
配置选项,如the rolling upgrade中所述场景。