我无法弄清楚变数,我希望有人能指出我正确的方向。
我有三个文件:
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。
在你的例子中, env和env2都是组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的级别。