首页 > 解决方案 > Ansible 的 when 条件结合 run_once 会不小心跳过一些不应该跳过的任务

问题描述

我的 inventory_hosts 如下:

# inventory
[kafka]
192.168.1.1 
192.168.1.2 

[mysql]
192.168.1.3

我的 ansible-playbook 如下:

网站.yml:

- name: test
  hosts: all
  roles:
   - kafka

kafka 角色任务:

# main.yml
- name: get kafka groups length
  shell: echo "{{ groups['kafka']|length }}"
  run_once: true
  delegate_to: localhost
  when: "'kafka' in group_names"

预期成绩

get kafka groups length可以分别执行和委托给本地执行,并且只能执行一次

实际结果

TASK [Gathering Facts] ******************************************************************************************************************************************************
ok: [192.168.1.1]
ok: [192.168.1.2]
ok: [192.168.1.3]

TASK [kafka : get mongodb groups length] ************************************************************************************************************************************
skipping: [192.168.1.3]

很奇怪的设计,我觉得不应该跳过,但他确实跳过了,我该怎么办?我期待同样的结果

标签: ansible

解决方案


来自 Ansible 文档:

group_names是当前主机所在的所有组的列表(数组)

您只运行一次任务,因此它只在第一台主机上运行,​​并且该主机只属于该kafka组。这意味着您group_names在该运行中的变量仅包括kafka.

试试这个:

- name: get kafka groups length
  shell: echo "{{ groups['kafka']|length }}"
  run_once: true
  delegate_to: localhost
  when: groups['kafka'] is defined

推荐阅读