gpt4 book ai didi

ansible - 将变量传递给包含的剧本

转载 作者:行者123 更新时间:2023-12-01 12:25:36 26 4
gpt4 key购买 nike

我正在包括我的剧本中的另一本剧本。我需要传递一个变量,叫做 required_node_version .我在我的剧本中使用了相同的变量,因此期望包含的剧本将继承它。但它不会导致“未定义”错误。所以我尝试使用这个不太优雅的解决方案:

- hosts: localhost
connection: local
vars:
required_node_version: v6.3.1

...

- include: ../../base/ci/build.yml
vars:
required_node_version: "{{required_node_version}}"

导致 {"failed": true, "msg": "ERROR! recursive loop detected in template string: {{required_node_version}}"} .

有什么优雅的解决方案吗?

最佳答案

Ansible 分别维护每个 play 的状态。一个戏剧的可变范围也与其他戏剧分开。您可以将戏剧中定义的变量范围视为有向无环图,其中每个节点名称都是唯一的,并且值将在第二次写入时被覆盖。

当您在剧本中包含其他剧本(包括顶层剧本)时,包含的剧本将具有自己的变量范围,因为它是完全不同的剧本。因此,您将无法访问 main play 中定义的变量。实际错误不是 递归循环检测到错误 ,实际错误为变量未定义 错误,因为您试图访问在其他游戏中定义的变量。

试试这个:

main.yml

---
- hosts: all
vars:
name: shasha

- include: included_playbook.yml
vars:
name1: "{{name}}""

现在您将得到实际错误: 名称未定义 ,因为您在分配 时尝试从不同的范围(不同的播放)访问变量姓名 姓名1 .

现在更改您的 main.yml 有了这个:

main.yml
---
- hosts: all
vars:
name: shasha

- include: included_playbook.yml
vars:
name: shashank

虽然 姓名 被定义两次,它们彼此不同,因为两者的范围不同(主要播放范围和包含播放范围)。所以这很好用,没有任何问题。

一些替代解决方案:

1. 在调用 playbook 时传递变量:

由于您包含的剧本也可以作为主要剧本运行,在这种情况下,您将如何使用该变量?您要么在该剧本中定义变量,要么从命令行传递它。

当您在调用 playbook 时传递变量时,它将自动在两个 playbook(主 playbook 以及包含的 playbook)范围内创建该变量:
ansible-playbook -i hosts main.yml -e "required_node_version=v6.3.1"

或者,也许您可​​以创建一个 JSON 文件,其中包含所有常见变量,这些变量在您包含的所有 playbook 中都很常见,然后在调用主要 ansible playbook 时传递该 JSON 文件。

2. 重新设计您的 Ansible 剧本:

如果您包含的 ansible playbook 作为助手工作而不是以独立方式使用,那么您应该在任务级别包含此 playbook。您仍将保持可重用性,并且只有单个作用域,因此您无需担心显式传递变量。

关于递归循环检测到错误背后的原因的更多信息:

Ansible 在将变量赋值给变量时实际上并没有使用右值的概念,而是执行两者之间的绑定(bind)。例如,您认为变量 的值是多少?姓名1 在以下代码中:

main.yml
---
- hosts: all
vars:
- name: old_val
- name1: "{{name}}"
- name: new_val

tasks:
- debug: msg="{{name1}}"

如果您的答案是 new_val ,你明白其中的逻辑。考虑 姓名1 作为引用,指的是 姓名 姓名 现在指的是new_val。所以唯一存在的值是 新值 姓名1 姓名 只是对 的引用新值 .
引用 旧值 丢失了。

现在考虑以下脚本:

main_recursive.yml
---
- hosts: all
vars:
- name: shasha
- name1: "{{name}}"
- name: "{{name1}}"

tasks:
- debug: msg="{{name}}"

现在让我们尝试恢复 的值姓名 . 姓名 指向 姓名1 姓名1 指向 姓名 .没关系,但我们如何才能达到实际值(value)???没办法,它是一个递归循环!

关于ansible - 将变量传递给包含的剧本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40190981/

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