gpt4 book ai didi

Ansible 有条件地委托(delegate)_到本地或远程?

转载 作者:行者123 更新时间:2023-12-04 23:17:10 28 4
gpt4 key购买 nike

我有几个ansible有时在本地环境中有意义的剧本,否则它们将被远程执行。为此,我使用 delegate_to指令,但这也意味着我必须将所有任务加倍,例如:

---
- hosts: all
gather_facts: no

tasks:

- name: Local command
command: hostname
register: target_host
when: vhost is undefined
delegate_to: 127.0.0.1

# ---

- name: Remote command
command: hostname
register: target_host
when: vhost is defined

本地执行 :
$ ansible-playbook -i inv.d/test.ini play.d/delegate.yml

PLAY [all] ********************************************************************

TASK: [Local command] *********************************************************
changed: [new-server -> 127.0.0.1]

TASK: [Remote command] ********************************************************
skipping: [new-server]

PLAY RECAP ********************************************************************
new-server : ok=1 changed=1 unreachable=0 failed=0

远程执行 :
$ ansible-playbook -i inv.d/test.ini play.d/delegate.yml -e vhost=y

PLAY [all] ********************************************************************

TASK: [Local command] *********************************************************
skipping: [new-server]

TASK: [Remote command] ********************************************************
changed: [new-server]

PLAY RECAP ********************************************************************
new-server : ok=1 changed=1 unreachable=0 failed=0

有没有更聪明的方法告诉 ansible什么时候回退到本地环境?目前我正在使用 ansible==1.9.2 .

最佳答案

不应在任务中定义应执行任务的位置。当任务总是必须在本地或相关机器(例如数据库主机或路由器)上运行而剧本本身以及大多数任务运行在剧本级别定义的主机时,委派是有意义的。

但是,如果您的目标是在本地或一组远程主机上运行整个 playbook,您应该使用不同的 list 文件或组。

如果您有两个不同的 list 文件,一个定义 localhost,另一个定义所有远程主机,然后在调用 ansible 时应用您想要的 list ,-i inv.d/local-i inv.d/remote .

或者将它们全部放在一个库存中并动态传递该组。在您的 list 中,您定义了两个组:

[local]
127.0.0.1

[remote]
host-1
host-2
host-N

然后将该组作为额外变量传递给 ansible: -e "run=local"-e "run=remote"
在您的剧本中,您设置了 hosts动态:
---
- hosts: "{{ run | mandatory }}"
gather_facts: no
tasks:
...

在您的示例中,您似乎只能使用根据 vhost 定义的单个远程主机。额外变量。在这种情况下,最好的选择似乎是在主机部分重新使用此变量并默认为 localhost。
---
- hosts: "{{ vhost | default('127.0.0.1') }}"
gather_facts: no
tasks:
...

所以如果 vhost定义了整个剧本将在该主机上执行。如果未定义,则 playbook 在本地运行。

最后,您仍然可以使用 delegate_to像这样的单个任务的选项:
- name: Local AND remote command
command: hostname
delegate_to: "{{ '127.0.0.1' if vhost is undefined else omit }}"

omit is a special variable使 Ansible 忽略该选项,就好像它没有被定义一样。

关于Ansible 有条件地委托(delegate)_到本地或远程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37388696/

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