如何使 ansible 任务仅在一台主机上运行? 对于每个应用程序



这个答案没有帮助。

该剧本如下所示:

- name: play1
hosts:
- all
gather_facts: true
remote_user: someteam
roles:
- role: role1
- role: role2
- role: role3
when: apps_var|length > 0

具体来说role3,在../roles/role3/tasks/main.yml中,任务看起来像:

- block:
- include: “deploy1.yml app={{ item }}"
with_items: "{{ apps_list | intersect(complete_list) }}"
- include: deploy2.yml app={{ item }}
with_items: "{{ complete_list }}"
when: complete_list|length > 0

我们希望仅在一台主机上为每个{{ apps_list | intersect(complete_list) }}运行deploy1.yml任务,而不是all

问题是,我们不能从role3中取出此任务(deploy1.yml

我们正在使用 ansible 2.3


run_once任务级别有帮助吗? 部署每个应用程序(在with_items中(,但只在一个主机上...

问:"我们希望为每个 {{ apps_list |仅在一台主机上相交(complete_list( }}。run_once在任务级别有帮助吗?部署每个应用程序(with_items年(但只在一个主机上?

答:是的。确实如此。以下任务

$ cat roles/role3/tasks/main.yml
- block:
- include_tasks: deploy1.yml
vars:
app: "{{ item }}"
loop: "{{ apps_list | intersect(complete_list) }}"
run_once: yes
- include: deploy2.yml
vars:
app: "{{ item }}"
loop: "{{ complete_list }}"
when: complete_list|length > 0
$ cat roles/role3/tasks/deploy1.yml 
- debug:
msg: 'role3: deploy1, app: {{ app }}'
$ cat roles/role3/tasks/deploy2.yml 
- debug:
msg: 'role3: deploy2, app: {{ app }}'

有库存

all:
hosts:
test_01:
test_02:
test_03:

和剧本

- name: play1
hosts: all
vars:
apps_list: [A, C]
complete_list: [A, B, C]
roles:
- role: role1
- role: role2
- role: role3
when: apps_list|length > 0

给予(删节(

[...]
TASK [role3 : debug] ***************************************************************************************
ok: [test_01] => {
"msg": "role3: deploy1, app: A"
}
TASK [role3 : debug] ***************************************************************************************
ok: [test_01] => {
"msg": "role3: deploy1, app: C"
}
[...]
TASK [role3 : debug] ***************************************************************************************
ok: [test_02] => {
"msg": "role3: deploy2, app: A"
}
ok: [test_01] => {
"msg": "role3: deploy2, app: A"
}
ok: [test_03] => {
"msg": "role3: deploy2, app: A"
}
TASK [role3 : debug] ***************************************************************************************
ok: [test_01] => {
"msg": "role3: deploy2, app: B"
}
ok: [test_03] => {
"msg": "role3: deploy2, app: B"
}
ok: [test_02] => {
"msg": "role3: deploy2, app: B"
}
TASK [role3 : debug] ***************************************************************************************
ok: [test_02] => {
"msg": "role3: deploy2, app: C"
}
ok: [test_01] => {
"msg": "role3: deploy2, app: C"
}
ok: [test_03] => {
"msg": "role3: deploy2, app: C"
}
PLAY RECAP *************************************************************************************************
test_01                    : ok=13   changed=0    unreachable=0    failed=0   
test_02                    : ok=9    changed=0    unreachable=0    failed=0   
test_03                    : ok=9    changed=0    unreachable=0    failed=0


笔记

1( 可以使用loop_control

- include_tasks: deploy1.yml
loop: "{{ apps_list | intersect(complete_list) }}"
loop_control:
loop_var: app

2(run_once也在整个街区工作

- block:
...
when: complete_list|length > 0
run_once: yes

最新更新