Ansible Playbook 中的可选变量覆盖

Posted

技术标签:

【中文标题】Ansible Playbook 中的可选变量覆盖【英文标题】:Optional Variable Override in Ansible Playbook 【发布时间】:2022-01-23 06:53:46 【问题描述】:

我使用 AWX 作为任务运行器来运行各种 Ansible 模块。一些 Ansible 模块是第三方模块,如果不分叉模块,我就无法控制其参数,这出于各种原因是不可取的。

AWX 提供ansible_user 作为我正在使用的某些模块使用的一个变量,我试图通过设置另一个变量user_override 来允许用户访问某些主机。

我首先想到将ansible_user: " user_override | default(ansible_user) " 行简单地添加到任务的参数中,这会起作用......但是有问题的模块不接受通过参数的凭据。我的下一个想法是在剧本中添加一个vars: 条目,并通过与上面相同的标记在那里提供覆盖。不幸的是,这导致了错误 recursive loop detected in template string,这一直是我在解决这个问题时存在的祸根。

我也尝试过使用 if/else 语法和中间变量,但似乎都不能解决这个问题。

如何在不分叉 AWX 或相关模块的情况下实现此覆盖功能?

Mods:这与询问简单变量默认值的一堆问题不同,因为现有问题不在 AWX 的上下文中,或者可以通过简单地使用 default()default(lookup()) 来解决。

【问题讨论】:

The documentation dealing with variable precedence 以你的确切 var 为例来说明整个主题。 @Zeitounator,这很有帮助,但我不确定如何使用优先级来解决这个问题,它只是有时会被覆盖。如果我在没有 AWX 的情况下运行 Ansible,优先级很容易解决问题。 我不明白。在这种情况下,为什么不更改 awx 任务中的用户?与在命令行上更改它相同。或者将它放在组/主机的清单中......优先规则在裸 ansible 和 awx 中是相同的。 Awx 仅使用 ansible 命令行启动 playbook。 【参考方案1】:

在这一点上,我很确定我(提问者)试图做的事情是通过有时设置一个值来完成的,但是我们的软件中的一些具有挑战性的匿名化约束使得它在某个地方在挑战和不可选择之间。

解决覆盖用户的特定问题的一个侧面解决方案是 AWX 将用户名设置为 remote_useransible_user,然后由 networkcli 使用。所以你可以使用 `remote_user: " override_user | default(ansible_user) " 这一行。这一般无济于事,但确实回答了问题。

【讨论】:

以上是关于Ansible Playbook 中的可选变量覆盖的主要内容,如果未能解决你的问题,请参考以下文章

将 Terraform 变量中的数字传递给 Ansible Playbook

ansible——playbook剧本

尝试在ansible playbook中使用变量文件中的变量

ansible之变量使用与playbook的设置(重点)

YAML语法Ansible Playbook剧本 Ansible变量

ansible-playbook变量