如何解决Ansible:调用按属性过滤的其他主机值
我有以下库存结构:
cluster:
server01.domain.com:
host_id: 1
host_role: master
server02.domain.com:
host_id: 2
host_role: follower
server03.domain.com:
host_id: 3
host_role: follower
我需要实现一个任务,只为服务器 2 和 3 运行,我应该可以在其中看到 server01 名称。
我试过了
- name: my test task
debug: "the fqdn of the server is: {{ vars['play_hosts'][0] }}"
when: host_role == 'follower'
但我在库存中使用的订单没有得到遵守。
当它的 host_role 等于 master 时,有没有办法调用我的集群元素?
否则,为每个主机设置一个可以使用的“全局变量”是可行的。
- set_fact:
master_fqdn: {{ inventory_hostname }}
when: host_role == 'master'
不幸的是,此解决方案将创建仅适用于第一台主机的 master_fqdn 变量。
更新
order:inventory
选项可能是一个解决方案,但正如我所说,它在我的剧本中没有得到尊重。我不知道为什么打印 {{ vars['play_hosts'] }}
并没有报告库存订单。
无论如何,我真正需要的是在其他主机上运行的任务中检索我的第一个服务器名称的可能性,只需根据 play_hosts
属性值过滤整个 host_role
数组。
换句话说:
- 任务应该运行
when host_role == 'worker'
- 我应该访问
vars['play_hosts'].key()
IFhost_role == 'master'
考虑到声明像 master_fqdn 这样的全局变量的可能性,我已经尝试过
set_fact:
master_fqdn: {{ inventory_hostname }}
when: host_role == 'master'
但不幸的是,这仅适用于我的第一个主机。
解决方法
您可以将 hosts
变量视为 list
,并将 slice
变量视为仅选择最后两个主机。
例如:假设您有以下库存:
[cluster]
server01 ansible_host=127.0.0.1 host_id=1 host_role=master
server02 ansible_host=127.0.0.1 host_id=2 host_role=worker
server03 ansible_host=127.0.0.1 host_id=3 host_role=worker
您将使用以下 playbook
编写 slice
:
- hosts: cluster[1:2]
gather_facts: no
connection: local
tasks:
- debug:
var: groups.cluster[0]
输出将如下所示:
❯ ansible-playbook playbooks/limit.yml
PLAY [cluster[1:2]] ************************************************************
Tuesday 01 June 2021 11:49:23 -0300 (0:00:00.020) 0:00:00.020 **********
TASK [debug] *******************************************************************
ok: [server02] =>
groups.cluster[0]: server01
ok: [server03] =>
groups.cluster[0]: server01
编辑
您可以通过修改以下内容来控制 playbook
的执行:
-
order
:设置 Ansible 选择主机的顺序。 -
serial
:设置运行的批量大小。 -
throttle
:限制执行时间或 CPU 密集型任务。 -
strategy
:控制 Ansible 任务执行行为。 -
run_once
:在单个主机上运行任务并将结果应用于所有主机。
以下摘自 the documentation 总结了它们的用途:
您可以使用 serial
设置一次要管理的主机数量、百分比或数量列表。在开始下一批主机之前,Ansible 在指定数量或百分比的主机上完成播放。您可以使用 throttle
限制分配给块或任务的工人数量。您可以使用 order
控制 Ansible 如何选择组中的下一个主机来执行。您可以使用 run_once
在单个主机上运行任务。这些关键字不是策略。它们是应用于游戏、块或任务的指令或选项。
您提到不遵守库存的顺序。那不是真的。默认情况下,Ansible 将使用清单的顺序。问题是 Ansible 也会并行运行任务,并且每次运行的任务完成情况会有所不同。
除了所有这些选项之外,您还可以使用 when
选项告诉 Ansible 如果条件不满足,它应该跳过运行该任务。如果不想在多个 when
上写 tasks
,可以将它与 import_tasks
选项结合使用。例如:
- hosts: cluster
gather_facts: no
connection: local
order: inventory
strategy: linear
serial: 1
tasks:
- import_tasks: ../tasks/when.yml
when: host_role == "worker"
这是输出:
❯ ansible-playbook playbooks/limit_2.yml
PLAY [cluster] *****************************************************************
Wednesday 02 June 2021 11:39:41 -0300 (0:00:00.019) 0:00:00.019 ********
PLAY [cluster] *****************************************************************
Wednesday 02 June 2021 11:39:41 -0300 (0:00:00.061) 0:00:00.081 ********
TASK [debug] *******************************************************************
ok: [server02] =>
groups.cluster[0]: server01
PLAY [cluster] *****************************************************************
Wednesday 02 June 2021 11:39:41 -0300 (0:00:00.061) 0:00:00.142 ********
ok: [server03] =>
groups.cluster[0]: server01
PLAY RECAP *********************************************************************
server01 : ok=0 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
server02 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
server03 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
您可以看到 Ansible 在 server01
上跳过了任务。我还配置了一些前面提到的选项来展示如何使用它们。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。