gpt4 book ai didi

ansible - 如何为所有播放/主机设置 Ansible 变量?

转载 作者:行者123 更新时间:2023-12-04 08:21:02 25 4
gpt4 key购买 nike

这个问题没有被回答。有人提到了环境变量。你能详细说明一下吗?

这似乎是一个简单的问题,但不是 ansible。它不断出现。尤其是在错误情况下。我需要一个全局变量。我可以在处理一个主机播放时设置一个,然后稍后与另一台主机检查。简而言之,我可以稍后在剧本中进行分支,具体取决于变量。

我们无法控制自定义软件的安装,但是如果安装了,我们必须将不同的软件放在其他机器上。最重要的是,安装会有所不同,具体取决于 VM 文件夹。我的全局变种王国。

变量的范围仅与当前 ansible_hostname 相关。是的,我们有 group_vars/all.yml 作为全局变量,但是我们不能在剧中设置它们。如果我设置了一个变量,其他主机的播放/任务都看不到它。我了解变量的范围,但我想设置一个可以在所有剧本播放中读取的全局变量。
实际的实现并不重要,但变量访问是(重要的)。

我的问题:有没有办法设置一个在另一台主机上运行不同任务时可以检查的变量?像 setGlobalSpaceVar(myvar, true) 这样的东西?我知道没有任何这样的方法,但我正在寻找解决方法。改写:在一个主机的一个任务中设置一个变量,然后在另一个主机的另一个任务中读取该变量。

我能想到的唯一方法是更改​​ Controller 上的文件,但这似乎是假的。

一个例子

以下内容与 oracle 备份和我们的本地可执行文件有关,但我保持通用。对于以下 - 是的,我可以执行 run_once,但这不会回答我的问题。这个变量访问问题在不同的上下文中不断出现。

我有 4 个 xyz 服务器。我有 2 个程序需要执行,但只能在 2 台不同的机器上执行。我不知道是哪个。对于不同的 VM 环境,设置可能会有所不同。

我们的 programOne 在具有驱动器 E 的服务器上运行。我可以使用 ansible 找到哪个服务器具有驱动器 E,并在我设置变量 (driveE_machine) 时相应地进行播放。它仅适用于该主机。为此,其他 3 台机器不会设置 driveE_machine。
在以后的游戏中,我只需要在其他 3 台机器中的一台上执行另一个程序。这意味着我需要设置一个变量,其他 2 台没有运行第二个程序的主机可以读取该变量。
我不知道该怎么做。

库存文件:

[xyz]
serverxyz[1:4].private.mystuff

剧本示例:
---
- name: stackoverflow variable question
hosts: xyz
gather_facts: no
serial: 1
tasks:
- name: find out who has drive E
win_shell: dir e:\
register: adminPage
ignore_errors: true

# This sets a variable that can only be read for that host
- name: set fact driveE_machine when rc is 0
set_fact:
driveE_machine: "{{inventory_hostname}}"
when: adminPage.rc == 0

- name: run program 1
include: tasks/program1.yml
when: driveE_machine is defined

# program2.yml executes program2 and needs to set some kind of variable
# so this include can only be executed once for the other 3 machines
# (not one that has driveE_machine defined and ???
- name: run program 2
include: tasks/program2.yml
when: driveE_machine is undefined and ???
# please don't say run_once: true - that won't solve my variable access question

有没有办法设置在另一台主机上运行任务时可以检查的变量?

最佳答案

不确定您真正想要什么,但是您可以使用单个循环任务(对全局变量的一些模拟)为每个主机设置一个事实:

剧本.yml

---
- hosts: mytest
gather_facts: no
vars:
tasks:
# Set myvar fact for every host in a play
- set_fact:
myvar: "{{ inventory_hostname }}"
delegate_to: "{{ item }}"
with_items: "{{ play_hosts }}"
run_once: yes
# Ensure that myvar is a name of the first host
- debug:
msg: "{{ myvar }}"

主机
[mytest]
aaa ansible_connection=local
bbb ansible_connection=local
ccc ansible_connection=local

结果
PLAY [mytest] ******************
META: ran handlers

TASK [set_fact] ******************
ok: [aaa -> aaa] => (item=aaa) => {"ansible_facts": {"myvar": "aaa"}, "ansible_facts_cacheable": false, "changed": false, "failed": false, "item": "aaa"}
ok: [aaa -> bbb] => (item=bbb) => {"ansible_facts": {"myvar": "aaa"}, "ansible_facts_cacheable": false, "changed": false, "failed": false, "item": "bbb"}
ok: [aaa -> ccc] => (item=ccc) => {"ansible_facts": {"myvar": "aaa"}, "ansible_facts_cacheable": false, "changed": false, "failed": false, "item": "ccc"}

TASK [debug] ******************
ok: [aaa] => {
"msg": "aaa"
}
ok: [bbb] => {
"msg": "aaa"
}
ok: [ccc] => {
"msg": "aaa"
}

关于ansible - 如何为所有播放/主机设置 Ansible 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47167446/

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