Linux Ansible-Jinjia2模板
目录
jinja2模板语法
部署jinja2模板
jinja2逻辑表达式
jinja2是基于Python书写的模块引擎,ansible通常会使用jinja2模块结合template模块来修改被管理主机的配置文件
一般使用ansible的事实变量或魔法变量编写一个jinja2模板文件,然后使用template模板调用jinja2模板文件,在渲染jinja2模板时将其变量替换为此被管理节点上的此变量对应的值
注意事项
Ansible允许jinja2模板使用条件判断语句和循环语句,但是不允许在playbook中使用(剧本中通过loop对象来实现)
jinja2模板语法
jinja2模板以.j2为后缀(也可以不写后缀)
jinja2模板主要由注释、变量和逻辑表达式组成
注释包含在{# #}中
变量被包含在 {{ var }} 中
逻辑表达式通过 {% %}书写
部署jinja2模板
通过在jinja2模板引用事实变量,提取出主机事实变量所对应的值
vim host.j2 Welcome to {{ ansible_facts['fqdn'] }} {{ ansible_facts['default_ipv4']['address'] }}
通过template模块部署到受管主机上(支持将控制节点中的本地文件转移到受管主机)
Template模块语法: src:指定来源jinja2模板 dest:指定要在目标主机上创建的文件 vim hosts.yml --- - name: template and jinja2 hosts: web tasks: - name: template template: src: host.j2 dest: /etc/hosts.txt
进行验证
ansible web -m shell -a "cat /etc/hosts.txt"
jinja2逻辑表达式
条件判断语句(使用if语句提供判断)
#格式 {% if 判断条件 %} {{ 满足条件执行的内容 }} {% elif 判断条件 %} {{ 满足条件执行的内容 }} {% else %} {{ 以上条件都不满足执行的内容 }} {% endif%} #例子-如果被管理节点的主机fqdn为node1,则输出echo node1;如果不为node1,则输出此管理节点的fqdn和ipv4地址 {% if ansible_facts.fqdn == “node1” %} echo node1 {% else %} hosts is {{ ansible_facts.fqdn }} and {{ ansible_facts.default_ipv4.address }} {% endif %}
循环控制语句(使用for语句提供循环)
#格式 {% for 循环语句 %} {{ 每次循环执行的内容 }} {% endfor%} #例子 提取所有主机各自对应的hostname值 {% for host in groups['all'] %} {{ hostvars[host]['ansible_facts']['hostname']}} {% endfor %}