zoukankan      html  css  js  c++  java
  • Ansible_使用jinja2模板部署自定义文件

    一、jinja2简介

    1、jinja2模板

    1️⃣:Ansiblejinja2模板系统用于模板文件,Ansible还使用jinja2语法来引用playbook中的变量

    2️⃣:变量和逻辑表达式置于标记或分隔符之间;

    • 例如,jinja2模板将{% EXPR %}用于表达式或逻辑(如循环),而{{ EXPR }}则用于向最终用户输出表达式或变量的结果

    3️⃣:使用{# COMMENT #}语法括起不应出现在最终文件中的注释

    • 演示实例:
      [root@localhost ~]# cat myplay.j2 
      {# This is test jinja2 #}
      {{ ansible_facts['default_ipv4']['address'] }}
      {{ ansible_facts['hostsname'] }}

     

    二、构建jinja2模板

    1、jinja2模板构成

    1️⃣:jinja2模板由多个元素组成:数据、变量和表达式,在呈现jinja2模板时,这些变量和表达式被替换为对应的值

    2️⃣:模板中使用的变量可以在playbookvars部分中指定,也可以将受管主机的事实用作模板中的变量

    3️⃣:可以使用ansible system_hostname -i inventory_file -m setup命令来获取与受管主机相关的事实

    4️⃣:注意:包含jinja2模板的文件不需要有任何特定的文件扩展名(例如.j2);但是,提供此类文件扩展名会让你更容易记住它是模板文件

    • 演示实例:
      [root@localhost ~]# cat myplay.j2 
      <VirtualHost {{ ansible_facts['default_ipv4']['address'] }}:80>
      	DocumentRoot /var/www/html/{{ dir_name }}
      </VirtualHost>

     

    三、部署jinja2模板

    1、使用template模块自定义模板

    1️⃣:jinja2模板是功能强大的工具,可用于自定义要在受管主机上部署的配置文件

    2️⃣:创建了适用于配置文件的jinja2模板后,它可以通过template模板部署到受管主机上,该模块支持将控制节点中的本地文件转移到受管主机

    • 演示实例:
      [root@localhost ~]# cat /opt/myplay.j2 
      <VirtualHost {{ ansible_facts['default_ipv4']['address'] }}:80>
      	DocumentRoot /var/www/html/{{ dir_name }}
      </VirtualHost>
      
      
      [root@localhost ~]# cat /opt/playbook.yaml 
      ---
      - hosts: all
        gather_facts: no
        tasks:
          - name: gat template
            template:
              src: /opt/myplay.j2
              dest: /tmp/myplay

    3️⃣:template模块还允许指定已部署文件的所有者、组、权限和SELINUX上下文,就像file模块一样

    4️⃣:也可以取用validate选项运行任意命令(如visudo -c),在将文件复制到位之前检查该文件的语法是否正确

     

    四、管理模板文件

    1、使用ansible_managed管理模板文件

    1️⃣:可使用ansible_managed指令中设置的"Ansible managed"字符串来给模板文件注释

    2️⃣:ansible_managed指令在ansible.cfg文件中设置

    • 演示实例:
      [root@localhost ~]# vim /etc/ansible/ansible.cfg 
      ansible_managed = Ansible managed           //取消该行全面的注释

    3️⃣:要将ansible_managed字符串包含在jinja2模板内,请使用下列语法

    • 演示实例:
      [root@localhost ~]# cat /opt/myplay.j2 
      {{ ansible_managed }}               //直接引用变量即可;也可以修改ansible.cfg文件中ansible managed指定的注释信息
      <VirtualHost {{ ansible_facts['default_ipv4']['address'] }}:80>
      	DocumentRoot /var/www/html/{{ dir_name }}
      </VirtualHost>

    五、控制结构

    1、使用for循环

    1️⃣:jinja2使用for语句来提供循环功能

    • 演示实例一:使用变量替换变量
        //先在playbook中定义users变量
      [root@localhost ~]# cat /opt/playbook.yaml 
      ---
      - hosts: all
        gather_facts: no
        vars:
          users:
            - zhangsan
            - lisi
            - wangwu
        tasks:
          - name: gat template
            template:
              src: /opt/myplay.j2
              dest: /tmp/myplay
      
       //查看jinja2模板文件
      [root@localhost ~]# cat /opt/myplay.j2 
      {% for user in users %}
      	{{ user }}
      {% endfor %}

    2️⃣:loop.index变量扩展至循环当前所处的索引号。它在循环第一次执行时值为1,每一次迭代递增1

    • 演示实例二:使用loop.index变量展示索引号
      [root@localhost opt]# cat myplay.j2 
      {% for user in users %}
      {{ loop.index }} - {{ user }}
      {% endfor %}
      
       //执行后,在受管主机上查看
      [root@localhost tmp]# cat myplay 
      1 - zhangsan
      2 - lisi
      3 - wangwu
    • 演示实例三:使用for语句,并添加条件判断
      [root@localhost opt]# cat myplay.j2 
      {% for user in users if user != "lisi" %}
      {{ loop.index }} - {{ user }}
      {% endfor %}
        //这样添加判断,就排除了lisi用户
      
       //执行play后,在受管主机上查看
      [root@localhost tmp]# cat myplay 
      1 - zhangsan
      2 - wangwu

    2、使用条件句

    1️⃣:jinja2使用if语句来提供条件控制,如果满足某些条件,这允许用户在已部署的文件中放置一行

    • 演示实例一:
       //现在playbook中定义user变量
      [root@localhost opt]# cat /opt/playbook.yaml 
      ---
      - hosts: all
        gather_facts: no
        vars:
          user:
            - zhangsan
            - lisi
            - wangwu
        tasks:
          - name: gat template
            template:
              src: /opt/myplay.j2
              dest: /tmp/myplay
      
       //查看jinja2模板文件
      [root@localhost opt]# cat /opt/myplay.j2 
      {% if True %}
      {{ user }}
      {% endif %}
      
       //执行play后,在受管主机上查看
      [root@localhost tmp]# cat myplay 
      ['zhangsan', 'lisi', 'wangwu']
    • 演示实例二:
      [root@localhost opt]# cat /opt/myplay.j2 
      {% if 2 > 1 %}
      {{ user }}
      {% endif %}
      
      
       //执行play后,在受管主机上查看
      [root@localhost tmp]# cat myplay 
      ['zhangsan', 'lisi', 'wangwu']

    2️⃣:注意,在Ansible模板中我们可以使用jinja2循环和条件,但不能在Ansible Playbook中使用(playbook中只能用loop和when)

    3、变量和过滤器

    1️⃣:jinja2提供了过滤器,更改模板表达式的输出格式(例如,输出到果JSON

    2️⃣:to_json过滤器使用JSON格式化表达式输出,to_yaml过滤器则使用YAML格式化表达式输出

    • 演示实例一:使用to_json过滤
       //查看jinja2模板文件
      [root@localhost opt]# cat /opt/myplay.j2 
      {{ ansible_facts['default_ipv4'] | to_json }}
      
      
       //查看playbook
      [root@localhost opt]# cat /opt/playbook.yaml 
      ---
      - hosts: all
        gather_facts: yes
        tasks:
          - name: gat template
            template:
              src: /opt/myplay.j2
              dest: /tmp/myplay
      
      
       //执行play后,在受管主机上查看
      [root@localhost tmp]# cat myplay 
      {"gateway": "192.168.121.2", "interface": "eth0", "address": "192.168.121.81", "broadcast": "192.168.121.255", "netmask": "255.255.255.0", "network": "192.168.121.0", "macaddress": "00:0c:29:35:75:fc", "mtu": 1500, "type": "ether", "alias": "eth0"} 
    • 演示实例二:使用to_yaml过滤
      [root@localhost opt]# cat myplay.j2 
      {{ ansible_facts['default_ipv4'] | to_yaml }}
      
      
       //执行play后,在受管主机上查看
      [root@localhost tmp]# cat myplay 
      {address: 192.168.121.81, alias: eth0, broadcast: 192.168.121.255, gateway: 192.168.121.2,
        interface: eth0, macaddress: '00:0c:29:35:75:fc', mtu: 1500, netmask: 255.255.255.0,
        network: 192.168.121.0, type: ether}

    3️⃣:也有其他过滤器,如to_nice_jsonto_nice_yaml过滤器,它们将表达式输出格式化为JSONYAML等人类可读格式

    • 演示实例一:使用to_nice_json过滤
      [root@localhost opt]# cat myplay.j2 
      {{ ansible_facts['default_ipv4'] | to_nice_json }}
      
      
       //执行play后,在受管主机上查看
      [root@localhost tmp]# cat myplay 
      {
          "address": "192.168.121.81",
          "alias": "eth0",
          "broadcast": "192.168.121.255",
          "gateway": "192.168.121.2",
          "interface": "eth0",
          "macaddress": "00:0c:29:35:75:fc",
          "mtu": 1500,
          "netmask": "255.255.255.0",
          "network": "192.168.121.0",
          "type": "ether"
      }
    • 演示实例二:使用to_nice_yaml过滤
      [root@localhost opt]# cat myplay.j2 
      {{ ansible_facts['default_ipv4'] | to_nice_yaml }}
      
      
       //执行paly后,在受管主机上查看
      [root@localhost tmp]# cat myplay 
      address: 192.168.121.81
      alias: eth0
      broadcast: 192.168.121.255
      gateway: 192.168.121.2
      interface: eth0
      macaddress: 00:0c:29:35:75:fc
      mtu: 1500
      netmask: 255.255.255.0
      network: 192.168.121.0
      type: ether

    4️⃣:from_jsonfrom_yaml过滤器相应要求JSON或YAML格式的字符串,并对它们进行解析

    4、变量测试

    1️⃣:在Ansible Playbook中与when子句一同使用的表达式是jinja2表达式;用于测试返回值的内置Ansible测试包括failedchangedsuccessdedskipped

  • 相关阅读:
    hdu 5101 Select
    hdu 5100 Chessboard
    cf B. I.O.U.
    cf C. Inna and Dima
    cf B. Inna and Nine
    cf C. Counting Kangaroos is Fun
    Radar Installation 贪心
    spfa模板
    Sequence
    棋盘问题
  • 原文地址:https://www.cnblogs.com/itwangqiang/p/13645346.html
Copyright © 2011-2022 走看看