我正在练习ansible。我已经基本完成了所有工作,现在我正在构建jinja2模板并使用它。当我需要为组建立报告并将其上传并上传到各自的dns服务器时,有一个练习。美国组中所有服务器的报告将上载到dns_server_america,亚洲也是如此。
dns_server_america ansible_host=172.20.1.100 ansible_ssh_pass=Passw0rd ansible_user=root
dns_server_asia ansible_host=172.20.1.101 ansible_ssh_pass=Passw0rd ansible_user=root
[america]
web0001 ansible_hostname=web0001.company.com ansible_host=10.1.1.101
web0002 ansible_hostname=web0002.company.com ansible_host=10.1.1.102
[asia]
web2001 ansible_hostname=web2001.company.com ansible_host=10.1.1.201
web2002 ansible_hostname=web2002.company.com ansible_host=10.1.1.202
这是YAML。
- name: Generate dns hosts files on americas servers
hosts: dns_server_america
tasks:
- template: src=templates/hosts.j2 dest=/tmp/hosts.txt
vars:
GROUP_NAME: america
- name: Generate dns hosts files on asia servers
hosts: dns_server_asia
tasks:
- template: src=templates/hosts.j2 dest=/tmp/hosts.txt
vars:
GROUP_NAME: asia
这是jinja2模板。
{% for host in groups[GROUP_NAME] %}
{{ host }} {{ hostvars[host]['ansible_host'] }}
{% endfor %}
我们为什么不在jinja2模板中引用[host]和[GROUP_NAME]。 Ansible说,将变量放在方括号中时,应该将它们用引号引起来。当我用引号将其括起来时,会收到一条错误消息“未定义的变量”,当我删除引号时,便能够成功运行该剧本。请告知,我可能遗漏了一些东西,或者我对变量的理解理论可能是错误的。
Q:“为什么不在jinja2模板中引用[host]和[GROUP_NAME]?”
A:主机和GROUP_NAME都是变量。索引中需要变量的值。如果变量名用'host'或'GROUP_NAME'引起来,则使用变量名代替变量的值。