gpt4 book ai didi

所有主机的 Ansible 全局增量变量

转载 作者:行者123 更新时间:2023-12-01 23:17:43 24 4
gpt4 key购买 nike

我的 list 中有两台服务器(主机)

[server]
10.23.12.33
10.23.12.40

和剧本(play.yml)

---
- hosts: all
roles:
web

在 vars 目录中的 Web 角色内部,我有 main.yml

---
file_number : 0

任务目录中的 Web 角色内部有 main.yml

---
- name: Increment variable
set_fact: file_number={{ file_number | int + 1 }}

- name: create file
command: 'touch file{{ file_number }}'

现在我希望在第一台机器上我将有file1,在第二台机器上我将有file2,但在两台机器上我都有file1

所以这个变量对于每台机器来说都是本地的,我怎样才能使它对所有机器都是全局的。

我的文件结构是:

hosts
play.yml
roles/
web/
tasks/
main.yml
vars/
main.yml

最佳答案

Now i expect that in first machine i will have file1 and in second machine i will have file2 but in both machines i have file1

您需要记住,Ansible 中的变量不是全局的。变量(又名“事实”)唯一地应用于每个主机,因此主机 1 的 file_number 与主机 2 的 file_number 不同。这是一个大致基于您发布的内容的示例:

角色/test/vars/main.yml:

---
file_number: 0

角色/测试/任务/main.yml:

---
- name: Increment variable
set_fact: file_number={{ file_number | int + 1 }}

- name: debug
debug: msg="file_number is {{ file_number }} on host {{ inventory_hostname }}"

现在假设您只定义了两个主机,并且您在如下所示的剧本中多次运行此角色:

---
- hosts: all
roles:
- { role: test }

- hosts: host1
roles:
- { role: test }

- hosts: all
roles:
- { role: test }

因此,在第一个游戏中,该角色适用于主机 1 和主机 2。在第二个游戏中,它仅针对主机 1 运行,而在第三个游戏中,它再次针对主机 1 和主机 2 运行。该剧本的输出是:

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

TASK: [test | Increment variable] *********************************************
ok: [host1]
ok: [host2]

TASK: [test | debug] **********************************************************
ok: [host1] => {
"msg": "file_number is 1 on host host1"
}
ok: [host2] => {
"msg": "file_number is 1 on host host2"
}

PLAY [host1] **************************************************

TASK: [test | Increment variable] *********************************************
ok: [host1]

TASK: [test | debug] **********************************************************
ok: [host1] => {
"msg": "file_number is 2 on host host1"
}

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

TASK: [test | Increment variable] *********************************************
ok: [host1]
ok: [host2]

TASK: [test | debug] **********************************************************
ok: [host1] => {
"msg": "file_number is 3 on host host1"
}
ok: [host2] => {
"msg": "file_number is 2 on host host2"
}

正如您所看到的,file_number 的值对于主机 1 和主机 2 来说是不同的,因为增加该值的角色对主机 1 运行的次数比对主机 2 运行的次数多。

不幸的是,确实没有一种干净的方法在 Ansible 中创建变量全局。 Ansible 能够针对大量主机并行运行任务,这使得此类事情变得非常棘手。除非您对并行环境中的全局变量非常小心,否则您很容易触发 race condition ,这可能会导致不可预测(不一致)的结果。

关于所有主机的 Ansible 全局增量变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34254013/

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