现在我希望在第一台机器上我会有 file1,在第二台机器上我会有 file2 但在两台机器上我都有 file1
您需要记住 Ansible 中的变量不是全局变量。变量(又名“事实”)唯一地应用于每个主机,因此 host1 的 file_number 与 host2 的 file_number 不同。这是一个基于您发布的内容的示例:
roles/test/vars/main.yml:
---
file_number: 0
roles/test/tasks/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 }
因此,在第一次播放中,该角色适用于 host1 和 host2。在第二个游戏中,它只针对 host1,而在第三个游戏中,它再次针对 host1 和 host2。这个剧本的输出是:
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 的值对于 host1 和 host2 是不同的,因为增加值的角色对 host1 的运行次数比对 host2 的运行次数多。
不幸的是,在 Ansible 中创建变量 global 确实没有一种干净的方法。 Ansible 能够针对大量主机并行运行任务的整个性质使得这样的事情非常棘手。除非您对并行环境中的全局变量非常小心,否则您很容易触发race condition,这可能会导致不可预测(不一致)的结果。