如何从库存文件中读取 Ansible 变量?

如何从库存文件中读取 Ansible 变量?

我无法弄清楚变量,希望有好心人能给我指明正确的方向。

我有三个文件:

  • 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] *****************************  

而不是替换变量。

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

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

我正在运行 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

答案1

这相当复杂,因为涉及多个方面。但通过反复试验很容易检查。

答案

您可以在游戏和任务名称中使用变量,只要名称中使用的所有变量都已定义且在特定级别可用即可。

在您的示例中,和env都是env2组变量,并且它们不会在游戏级别被替换。

在输出日志中打印播放名称时,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):

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

vars_files:
  - env_vars/base.yml

因此,在剧名中一致呈现了application_name在中定义的值。env_vars/base.yml

另一方面,您尝试使用组变量而不是静态值,这就是为什么值没有被替换(它们尚未确定)的原因。


额外捕获量

如果您在上面的示例中向任务名称添加了未定义的变量,则其有效,例如:

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

您将获得:

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

甚至正确定义的变量也没有被替换。


类似地,尝试使用主机范围的事实ansible_hostname也将失败:

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

您将获得:

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

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

您尝试在剧本名称中打印组变量,即在尚未定义组变量的级别上。

相关内容