在Ansible剧本上循环遍历var文件,然后按顺序运行剧本中的所有角色

时间:2019-12-02 16:21:18

标签: ansible

我正在尝试找到一种方法,可以按顺序循环运行剧本。也就是说,所有角色都使用一个值运行,然后再次使用第二个值,依此类推。

我已经尝试过了,但是每个角色在第二个角色运行之前都要经过循环。我希望这两个角色都可以在第二项循环之前运行。

例如:我的结构

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

这样,如果第一个失败,它仍然可以浏览其他项目

1 个答案:

答案 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中所述场景。