ansible - 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 文档:
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
推荐阅读
- php - 修改容器内的 JSON 配置文件的问题 (PHP)
- docker - docker容器中gitlab runner的Maven存储库?
- sql-server - 无法通过 localhost SQL Server 连接字符串中的指定用户登录
- python - Python请求标头我可以使用二维字典吗?
- blockchain - 为闹钟搭建链环节点
- laravel - npm run watch/hot 仅在第一次运行时成功
- javascript - 如何将嵌套对象展平为对象数组
- c# - 如何在newtonsoft 中得到没有jPath 属性的结果?
- flutter - 使用 Flutter Bloc 在电子商务应用中实现访客特征/用户
- javascript - 让用户下载数据不起作用 - 文件保护程序不起作用?