如何解决使用 if 条件将 True 或 False 分配给 Ansible 中的 gather_facts 不起作用
---
- hosts: "{{ run_on_node|default('mysql_cluster_sql[0]')}}"
connection: "{% if migrated is defined and migrated == 'yes' %}local{% else %}ssh{% endif %}" # This works as we are assigning non boolean value
gather_facts: "{% if migrated is defined and migrated == 'yes' %}false{% else %}true{% endif %}" #This doesnt work well
tasks:
- debug: var=ansible_all_ipv4_addresses
- debug: var=ansible_default_ipv4.address
库存文件:
[mysql_cluster_sql]
10.200.1.191 migrated=yes
该变量根据条件具有 true 和 false 值,但即使 gather_facts 为 false,它也会收集事实。
解决方法
gather_facts
将在播放循环开始之前进行评估,因此在这种情况下 ansible 无法知道它应该加载哪个组/主机变量。 connection
属性的问题完全相同。
我只看到通过明确收集事实并为每个主机设置连接来满足您的要求的一种方法。 Ini 格式不能很好地用于库存,所以我转换为 yaml。我还在 playbook 中修改了您的默认 hosts
表达式,以便它直接从清单中获取主机名。如果您愿意,可以保留自己的,如果它适合您的需要。
库存:
---
all:
children:
mysql_cluster_sql:
hosts:
10.200.1.191:
migrated: yes
vars:
ansible_connection: "{{ migrated | default(false) | bool | ternary('local','ssh') }}"
剧本:
---
- hosts: "{{ run_on_node | default(groups['mysql_cluster_sql'][0]) }}"
gather_facts: false
tasks:
- name: gather_facts if not migrated
setup:
when: not (migrated | default(false) | bool)
- debug:
var: ansible_all_ipv4_addresses
- debug:
var: ansible_default_ipv4.address
,
简化并修复条件。使用默认值。这将涵盖两个测试,例如
shell> cat pb.yml
- hosts: localhost
gather_facts: "{{ (migrated|default('no') == 'yes')|ternary(false,true) }}"
tasks:
- meta: noop
将在未定义变量 migrated 的情况下收集事实
shell> ansible-playbook pb.yml
PLAY [localhost] ********************************************************
TASK [Gathering Facts] **************************************************
ok: [localhost]
,或者当变量设置为“yes”以外的其他值时
shell> ansible-playbook pb.yml -e migrated=no
PLAY [localhost] ********************************************************
TASK [Gathering Facts] **************************************************
ok: [localhost]
当变量设置为“是”时,不会收集任何事实
shell> ansible-playbook pb.yml -e migrated=yes
PLAY [localhost] ********************************************************
PLAY RECAP **************************************************************
金贾
如果你坚持Jinja,下面的剧本给出了相同的结果
shell> cat pb.yml
- hosts: localhost
gather_facts: "{% if migrated|default('no') == 'yes' %}
false
{% else %}
true
{% endif %}"
tasks:
- meta: noop
布尔值
您可以通过显式转换为 Boolean 来进一步简化测试,例如
- hosts: localhost
gather_facts: "{{ (migrated|default('no')|bool)|ternary(false,true) }}"
tasks:
- meta: noop
真/假
确保您了解布尔转换和测试的工作原理。查看任务结果
- debug:
msg: "True"
loop: [yes,Yes,true,True,xxx]
when: item|bool
- debug:
msg: "False"
loop: [no,No,false,False,xxx]
when: not item|bool
- debug:
msg: "{{ item|bool|ternary(True,False) }}"
loop: [yes,xxx,no,xxx]
- debug:
msg: "{{ item|ternary(True,xxx]
问:"从清单中传递变量“迁移”不起作用。"
答:你说得对。似乎在 gather_facts 运行时库存变量不可用。使用 setup 作为解决方法。例如
- hosts: localhost
gather_facts: false
tasks:
- setup:
when: (migrated|default('no')|bool)|ternary(false,true)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。