我无法弄清楚变量,希望有好心人能给我指明正确的方向。
我有三个文件:
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 }}] ***
你的例子就像最后一个例子:
您尝试在剧本名称中打印组变量,即在尚未定义组变量的级别上。