Ansible:使用变量定义playbook主机

11

我的安装版本如下: ansible 2.3.0 (devel 2131eaba0c)

我想将我的主机变量指定为外部变量,然后在playbook中使用它,就像这样:

hosts: "{{integration}}"

在我的 group_vars/all 文件中,我有以下定义变量:

integration: "int60"

主机文件(host file)的示例:

[int60] 
hostA

[int61]
hostB

很遗憾,这并不起作用。我还尝试了以下方式来定义主机变量

[integration]
127.0.0.1 ansible_host="{{ integration_env }}"

我希望在我的group_vars/all文件中指定integration_env,目前遇到的问题是任务似乎是在本地运行而不是在所需环境中运行。

有没有可能做到这样的事情?如果有其他更好的方法也可以。主要目标是在一个变量文件中定义主机变量。

1个回答

12

如果您将integration变量作为额外变量传递,则此方法将起作用:

ansible-playbook -e integration=int60 myplaybook.yml

在使用"header" play中的任何变量之前,应该在Ansible解析playbook之前进行定义。

在你的例子中,你将 integration 定义为主机facts。Facts只能在任务级别上定义,而不是play级别。

更新:你可以使用其他传递变量的方式,不仅限于extra vars。 例如:

- hosts: "{{ lookup('env','DYN_HOSTS') }}"

也会起作用。


感谢您的快速回复。我看到过像那样的解决方案,但这对我不起作用,因为我是通过Jenkins作业(和Ansible插件)运行Ansible的,它不允许传递任何额外的变量。此外,我需要在Ansible任务中更改集成变量,以便下一次运行会选择不同的环境。您知道其他的解决方案吗? - Vetemi
Jenkins的Ansible插件确实允许使用额外的变量。在Jenkins中创建Ansible步骤时,它隐藏在“高级”选项下。 - Steve E.
@ Steve:是的,你说得对,但我需要通过ansible任务更改这个变量,所以这个解决方案对我不起作用。 - Vetemi
@Konstantin:将变量存储在环境变量中是一种有效的解决方案(例如,在先前的任务中将存储的ansible变量导出到环境变量中,然后在之后使用它),但直接使用变量会更好。因此,我的问题是:这是否可能? - Vetemi
不,影响下一个任务的主机的唯一方法是使用动态组。您可以在上一个任务期间将静态组名称硬编码到您的任务中并进行填充。请参见http://stackoverflow.com/a/38631923/2795592。 - Konstantin Suvorov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接