gpt4 book ai didi

ansible - 让 ansible skip 在运行 Ansible playbook 的机器上运行 play

转载 作者:行者123 更新时间:2023-12-04 10:20:15 26 4
gpt4 key购买 nike

如何构建剧本,以便不在运行 Ansible 的机器上执行单独的剧本?

例如,如果我有一个简单的双人剧本:

- name: Patch and reboot
hosts: all
gather_facts: true

tasks:
- name: Fully patch system
package:
name: "*"
state: latest
become: true
register: patchstatus

- name: Reboot if patched
reboot:
become: true
when: patchstatus is changed

但是我不希望重启在运行 Ansible 的机器上运行时触发。

我知道维护得更好的库存不会让我的 Ansible 系统与其他系统一起使用,但这是一个实验室,我想要一个简单的剧本,我可以每晚启动 - 我宁愿它不重启我的 Ansible 剧本(至少不是直到它是最后一个重新启动)。

简单地说,我正在寻找一个预定义的变量,所以我可以使用一个简单的 when: ansible_hostname != ansible_execution_server可以简单地用来跳过播放。 (假设 ansible_execution_server 是执行 ansible-playbook 的系统的名称。)

然后重启部分可能是这样的:
  - name: Reboot if patched
reboot:
become: true
when:
- patchstatus is changed
- ansible_hostname != ansible_execution_server

最佳答案

如果您在运行 Playbook 时没有成为现有库存文件的目标,那么您的工作站将成为 Implicit Localhost 的目标。 .

您遇到的行为是因为全局 hosts变量设置为 all .您可能知道,其中指定每个任务都应在 list 中的所有主机上运行。

如果您不希望在运行 Playbook 的机器上触发重启,那么您需要确保将其排除在外。这通常通过 list 文件中的组来完成。

我对使用 Ansible list 文件比较熟悉,而且我从未遇到过使用一个文件会增加您在描述的最后一段中描述的限制的情况。

首先,here is the documentation用于 Ansible list 文件。我知道 Ansible 文档非常冗长。但是 Ansible 的许多更精细的工作都是微妙的,如果您通常在文档中搜索特定的实现信息,您可能会错过很多上下文。如果您还没有阅读整篇文档,我鼓励您在继续之前阅读整个文档。

之后,构建一个 list 文件,如下所示:

[hardware]
my.router.name
my.switch.name
my.computer.name
my.first.server
my.second.server
my.third.server

[networking]
my.router.name
my.switch.name
my.second.server

[servers]
my.first.server
my.second.server
my.third.server

[computers]
my.computer.name
wife.computer.name

[instances:children]
my.router.name
my.switch.name
my.computer.name
wife.computer.name
my.first.server
my.second.server
my.third.server

在此示例中,您总共定义了 7 个设备。它们存在于您的 children 中部分。从那里,您可以派生出不同的主机组。例如在这里,我创建了 hardware , networking , servers , & computers组。

假设您想使用 Playbook 重新启动所有个人计算机。然后你将第 2 行设置为 hosts: computers .如果您想重新启动所有服务器和所有网络设备,则可以将其设置为: hosts: networking:servers
如果您想要除 my.computer.name 之外的所有设备修补并重新启动然后你可以像这样编写你的剧本:
- hosts: hardware:networking:servers:wife.computer.name
gather_facts: true
become: true

tasks:
- package:
name: "*"
state: latest
register: patchstatus

- reboot:
when: patchstatus is changed

让我知道这是否有帮助,或者我是否错过了您的问题。 Ansible 使用起来很有趣,所以我总是乐于提供帮助。

关于ansible - 让 ansible skip 在运行 Ansible playbook 的机器上运行 play,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60896005/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com