文件模板中使用的变量

template module在Ansible中非常常用,而它在使用的时候又没有显示的指定template文件中的值,所以有时候用户会对template文件中使用的变量感到困惑,所以在这里又重新强调下。

template变量的定义

在playbook中定义的变量,可以直接在template中使用,同时facts变量也可以直接在template中使用,当然也包含在inventory里面定义的host和group变量。只要是在playbook中可以访问的变量,都可以在template文件中使用。

下面的playbook脚本中使用了template module来拷贝文件index.html.j2,并且替换了index.html.j2中的变量为playbook中定义变量值。

  1. ---
  2. - hosts: web
  3. vars:
  4. http_port: 80
  5. defined_name: "Hello My name is Jingjng"
  6. remote_user: root
  7. tasks:
  8. - name: ensure apache is at the latest version
  9. yum: pkg=httpd state=latest
  10. - name: Write the configuration file
  11. template: src=templates/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
  12. notify:
  13. - restart apache
  14. - name: Write the default index.html file
  15. template: src=templates/index2.html.j2 dest=/var/www/html/index.html
  16. - name: ensure apache is running
  17. service: name=httpd state=started
  18. - name: insert firewalld rule for httpd
  19. firewalld: port={{ http_port }}/tcp permanent=true state=enabled immediate=yes
  20. handlers:
  21. - name: restart apache
  22. service: name=httpd state=restarted

template变量的使用

Ansible模版文件使用变量的语法是Python的template语言Jinja2

在下面的例子template index.html.j2中,直接使用了以下变量:

  • 系统变量 {{ ansible_hostname }} , {{ ansible_default_ipv4.address }}

  • 用户自定义的变量 {{ defined_name }}

index.html.j2文件:

  1. <html>
  2. <title>Demo</title>
  3. <body>
  4. <div class="block" style="height: 99%;">
  5. <div class="centered">
  6. <h1>#46 Demo {{ defined_name }}</h1>
  7. <p>Served by {{ ansible_hostname }} ({{ ansible_default_ipv4.address }}).</p>
  8. </div>
  9. </div>
  10. </body>
  11. </html>