如何从库存文件中读取Ansiblevariables?

我无法弄清楚变数,我希望有人能指出我正确的方向。

我有三个文件:

  • group_vars/all

     --- env2: server 
  • hosts

     [all:vars] env=development [webservers] 138.78.334.247 
  • site.yml

     --- - name: Provision an {{ env }} {{ env2 }} db server hosts: all become: yes become_user: root vars: - update_apt_cache: yes 

当我运行命令:

 ansible-playbook -i development site.yml 

我的输出显示:

 PLAY [Provision an {{ env }} {{ env2 }} db server] ***************************** 

而不是取代瓦尔。

我也尝试使用include:来调用另一个YAML文件的site.yml ,但是这也不起作用。

我似乎无法弄清楚我在这里做错了什么,因为从文档看起来很简单。

我正在运行Ansible 2.2.1。


以上是我想要完成的一个简单的例子,如下所示:

 --- - name: Provision a {{ application_name }} web server hosts: all become: yes become_user: root remote_user: "{{ server_user }}" vars: - update_apt_cache: yes vars_files: - env_vars/{{ env }}.yml roles: - base - db - mysql - web - nginx 

这是相当复杂的,因为涉及几个方面。 但是,通过反复试验很容易。

答案

只要名称中使用的所有variables都在特定级别上定义并可用,就可以在播放和任务名称中使用variables。

在你的例子中, envenv2都是组variables,它们在播放级别不被replace。

在输出日志中打印播放名称时,Ansible不知道将运行哪个主机,因此它也不知道为这些主机定义了什么值(并且值可能因主机而异)。

然而,在任务层面,这些值是一致定义的。

考虑:

 --- - name: Here variables do not work {{ env }} {{ env2 }} hosts: localhost gather_facts: false tasks: - name: Here variables work {{ env }} {{ env2 }} debug: 

会产生:

 PLAY [Here variables do not work {{ env }} {{ env2 }}] ************************* TASK [Here variables work development server] ********************************** ok: [localhost] => { "msg": "Hello world!" } 

关于最后一个示例( Provision a {{ application_name }} web server ):

我不知道你从哪里得到它,但似乎不完整。 这里的一个非常相似的包含对variables文件的静态引用:

 vars_files: - env_vars/base.yml 

env_vars/base.yml定义的application_name的值因此在播放名称中一致呈现。

另一方面,您尝试使用组variables而不是静态值,这就是为什么值不被replace(它们尚未确定)。


额外的捕获

如果你在上面的例子中添加了一个未定义的variables,那么这个variables的作用是不同的,例如:

 - name: Here variables work {{ env }} {{ env2 }} {{ unknown }} debug: 

你会得到:

 TASK [These variables will not work {{ env }} {{ env2 }} {{ unknown }}] ******** 

即使是正确定义的variables也没有被替代。


同样尝试使用主机范围的事实,例如ansible_hostname也将失败:

 tasks: - name: These variables will not work {{ env }} {{ env2 }} {{ ansible_hostname }} debug: 

你会得到:

 TASK [These variables will not work {{ env }} {{ env2 }} {{ ansible_hostname }}] *** 

你的例子就像最后一个例子:

您尝试在播放名称中打印组variables,例如,尚未定义组variables的级别。