我有一个简单的 ansible main_task.yml 文件,它是从 main.yml 循环而来的。
库存文件
[port_22]
192.168.0.189
192.168.0.199
[port_222]
192.168.0.199
[port_888]
192.168.0.200
主要任务.yml
---
- name: "run this on {{ item }} hosts"
debug: msg= "this runs only on p{{ item }} hosts"
when: "{{ item }} in group_names"
#when: group_names | select("item|string") | list | count > 0
主目录
- hosts: port_22, port_222
connection: local
vars:
ports:
- 22
- 222
tasks:
- name: Verification
include_tasks: main_task.yml
loop: "{{ ports }}"
它的抱怨
[WARNING]: conditional statements should not include jinja2 templating delimiters such as {{ }} or {% %}. Found: {{ item }} in group_names
删除 jinja2 模板时,得到以下信息:
skipping: [192.168.0.189]
我怎样才能实现这个目标?
更新:
修改main.yml
- hosts: host_22, host_222
#connection: local
vars:
ports:
- 22
tasks:
- name: deploy files with network address in them
include_tasks: main_task.yml
loop: "{{ ports }}"
修改了 main_task.yml
- name: "run this on {{ item }} hosts"
debug: msg= "this runs only on p{{ item }} hosts"
when: item in group_names
#when: group_names | select("item|string") | list | count > 0
- name: my hostname
shell: hostname; hostname -I
when: item in group_names
register: hostname_result
- debug:
var: hostname_result.stdout_lines
输出:
ansible-playbook main.yaml -i inventory.ini -u root
PLAY [host_22, host_222] *********************************************************************************************************************************************************************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************************************************************************************************************************************************************************
ok: [192.168.0.189]
ok: [192.168.0.199]
TASK [Verification] *********************************************************************************************************************************************************************************************************************************
included: /home/ubuntu/ansible/test/testing_loo/main_task.yml for 192.168.0.199, 192.168.0.189 => (item=22)
TASK [run this on 22 hosts] ******************************************************************************************************************************************************************************************************************************************************
skipping: [192.168.0.199]
skipping: [192.168.0.189]
TASK [my hostname] ***************************************************************************************************************************************************************************************************************************************************************
skipping: [192.168.0.199]
skipping: [192.168.0.189]
TASK [debug] *********************************************************************************************************************************************************************************************************************************************************************
ok: [192.168.0.199] => {
"hostname_result.stdout_lines": "VARIABLE IS NOT DEFINED!"
}
ok: [192.168.0.189] => {
"hostname_result.stdout_lines": "VARIABLE IS NOT DEFINED!"
}
答案1
when: item in group_names
当关键字已经隐式存在于 Jinja 表达式中时,请删除其中的 {{ }}。
但是你的发挥仍然存在问题。
关于 task.yml 中的验证任务,debug 只会打印内容,它实际上并不像断言任务那样进行验证。此外,您正在loop:
多个主机上执行并运行,这会运行2 * 2 = 4
时间,这可能不是您想要的,从而导致一些额外的跳过。
我看不出调试任务有什么价值,并会将其完全删除。还有其他方法可以查看组的内容,例如ansible-inventory
命令行工具。
任务名称中的表达式不会像您预期的那样起作用。我认为它只会反映第一个主机或类似的东西。
- hosts: all
connection: local
不要使用本地连接的多台主机。它将运行多次,但不会在任何位置使用 ssh,这可能不是您想要的。像 debug 这样的操作插件本身已经在本地主机上运行。或者您可以将 localhost 设置为主机模式。所以:
connection: local
在游戏层面删除。- 使用比全部更具体的主机模式。
hosts: port_22,port_222
将在两个组上运行,并且更清楚您的意图。