Ansible | 条件语句不应包含 jinja2 模板 | when group_name 变量

Ansible | 条件语句不应包含 jinja2 模板 | when group_name 变量

我有一个简单的 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 设置为主机模式。所以:

  1. connection: local在游戏层面删除。
  2. 使用比全部更具体的主机模式。hosts: port_22,port_222将在两个组上运行,并且更清楚您的意图。

相关内容