gpt4 book ai didi

Ansible - 如何有条件地反转剧本中的变量

转载 作者:行者123 更新时间:2023-12-01 15:58:39 24 4
gpt4 key购买 nike

我需要能够反转存储在从命令行传递给剧本的 JSON 文件中的变量。

这些是我设置的任务(它们相同除了变量),这是剧本的片段:

- name: Prepare a .sql file
delegate_to: 127.0.0.1
mysql_db:
name: "{{ source['database']['db_name'] }}"
state: dump
login_host: "{{ source['database']['host'] }}"
login_user: "{{ source['database']['user'] }}"
login_password: "{{ source['database']['password'] }}"
target: test_db.sql
when: invert is not defined

- name: Prepare a .sql file (inverted)
delegate_to: 127.0.0.1
mysql_db:
name: "{{ target['database']['db_name'] }}"
state: dump
login_host: "{{ target['database']['host'] }}"
login_user: "{{ target['database']['user'] }}"
login_password: "{{ target['database']['password'] }}"
target: test_db.sql
when: invert is defined

因此当我执行

ansible-playbook -i hosts playbook.yml --extra-vars "@dynamic_vars.json"

第一个任务被执行。如果我执行

ansible-playbook -i hosts playbook.yml --extra-vars "@dynamic_vars.json"--extra-vars "invert-yes"

第二个任务被执行,它采用与参数相同的散列,但只将源交换为目标(它实际上成为我剧本中的源)。

如您所见,这是一种非常简单的方法,有很多不必要的重复,我只是不喜欢它。但是,我想不出更好的方法来在命令行中恢复变量而无需构建一些更复杂的包含逻辑。

也许您可以建议我如何做得更好?谢谢!

最佳答案

在谈到避免重复的话题时,我非常喜欢 YAML 的 anchor 和引用。由于内容是动态的,您可以利用 with_items,它可用于传递如下参数:

- &sqldump
name: Prepare a .sql file
delegate_to: 127.0.0.1
mysql_db:
name: "{{ item['database']['db_name'] }}"
state: dump
login_host: "{{ item['database']['host'] }}"
login_user: "{{ item['database']['user'] }}"
login_password: "{{ item['database']['password'] }}"
target: test_db.sql
when: invert is not defined
with_items:
- source


- <<: *sqldump
name: Prepare a .sql file (inverted)
when: invert is defined
with_items:
- target

第二个任务是第一个任务的完美克隆,然后覆盖namecondition 和循环with_items 以传递target 而不是 source


在阅读您对@ydaetskcoR 的回答后,听起来您在很多情况下都需要使用一个或另一个字典中的数据。也许在那种情况下,根据 invert 参数全局定义 var 是有意义的。您的 vars 文件可能如下所示:

---

source:
database: ...
db_name: ...

target:
database: ...
db_name: ...

data: "{{ target if invert is defined else source }}"

然后您可以在所有任务中简单地使用数据,而无需进一步处理条件。

- name: Prepare a .sql file
delegate_to: 127.0.0.1
mysql_db:
name: "{{ data['database']['db_name'] }}"
state: dump
login_host: "{{ data['database']['host'] }}"
login_user: "{{ data['database']['user'] }}"
login_password: "{{ data['database']['password'] }}"
target: test_db.sql

当然,这样你就有了一个固定的任务名称,它不会随着你传递的参数而改变。

关于Ansible - 如何有条件地反转剧本中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34245821/

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