ansible使用jinja2模板

摘要:
jinja2的基本语法控制结构{%%}中的for循环用于迭代Python的数据类型,包括列表、元组和字典。2.变量值{{}}在jinja2模板中使用{}}语法来表示变量,这是一个特殊的占位符。使用jinja2渲染时,它将填充/替换这些特殊占位符。jinja2支持Python中的所有Python数据类型,如列表、字段、对象等。

jinja2基本语法

  1. 控制结构 {% %}

            jinja2中的for循环用于迭代Python的数据类型,包括列表,元组和字典

         2.变量取值 {{ }}

            jinja2模板中使用 {{ }} 语法表示一个变量,它是一种特殊的占位符。当利用jinja2进行渲染的时候,它会把这些特殊的占位符进行填充/替换,jinja2支持python中所有的Python数据类型比如列表、字段、对象等。

            所有对变量的操作都必须在{{}}代码块中,{% %}只能使用一些控制语句

        3.注释 {# #}

        4.过滤器

            safe: 渲染时值不转义

           capitialize: 把值的首字母转换成大写,其他子母转换为小写

           lower: 把值转换成小写形式

           upper: 把值转换成大写形式

           title: 把值中每个单词的首字母都转换成大写

           trim: 把值的首尾空格去掉

           striptags: 渲染之前把值中所有的HTML标签都删掉

           join: 拼接多个值为字符串

           replace: 替换字符串的值

           round: 默认对数字进行四舍五入,也可以用参数进行控制

           int: 把值转换成整型

          只需要在变量后面使用管道(|)分割,多个过滤器可以链式调用,前一个过滤器的输出会作为后一个过滤器的输入

模板实例

ansible使用jinja2模板第1张ansible使用jinja2模板第2张
cluster.name: es-cluster
node.name: node-{{ ansible_default_ipv4['address'].split('.')| last }}
cluster.initial_master_nodes: node-{{ ansible_default_ipv4['address'].split('.')| last }}
path.data: {{ es_path_data }}
path.logs: {{ es_path_logs }}
network.host: 0.0.0.0
{% set hosts = [] %} #定义一个Python列表变量
{% for host in groups['elastic-master'] %} #使用循环控制语句遍历列表 
  {{ hosts.append(host) }}  #对Python列表变量进行操作
{% endfor %}
discovery.seed_hosts: {{ hosts }} #输出变量的值
xpack.security.enabled: true
xpack.security.http.ssl.enabled: true
正确模板

     ansible使用jinja2模板第3张

ansible使用jinja2模板第4张ansible使用jinja2模板第5张
cluster.name: es-cluster
node.name: node-{{ ansible_default_ipv4['address'].split('.')| last }}
cluster.initial_master_nodes: node-{{ ansible_default_ipv4['address'].split('.')| last }}
path.data: {{ es_path_data }}
path.logs: {{ es_path_logs }}
network.host: 0.0.0.0

{% set seed_hosts = [] %}
{% for host in groups['elastic'] %}
    {% seed_hosts.append("{{ host }}") %} 
    
{% endfor %}

discovery.seed_hosts: {{ seed_hosts }}
 
xpack.security.enabled: true
xpack.security.http.ssl.enabled: true
错误模板

   ansible使用jinja2模板第6张

ansible使用jinja2模板第7张ansible使用jinja2模板第8张
cluster.name: es-cluster
node.name: node-{{ ansible_default_ipv4['address'].split('.')| last }}
cluster.initial_master_nodes: node-{{ ansible_default_ipv4['address'].split('.')| last }}
path.data: {{ es_path_data }}
path.logs: {{ es_path_logs }}
network.host: 0.0.0.0
{% set hosts = [] %}
{% for host in groups['elastic'] %}
  {%  if hosts.append("{{ host }}") %} 
  {% endif %}
{% endfor %}
discovery.seed_hosts: {{ hosts }}
xpack.security.enabled: true
xpack.security.http.ssl.enabled: true
错误模板2

   ansible使用jinja2模板第9张

jinjia2字符串处理

    使用和python的strip一样,{{ string | trim }} == string.strip()
    python使用函数调用符号.号来进行调用string.strip
    jinjia2使用 | 符号进行调用 {{ string | trim }}

   把一个列表变量拼接成字符串       join函数遍历数组返回一个新的字符串

   zookeeper.connect={{ groups['zookeeper'] |  join(':2181,')  }}:2181 拼接结果:zookeeper.connect=192.168.30.174:2181,192.168.30.175:2181,192.168.30.176:2181

    ansible使用jinja2模板第10张

 ansible变量声明注意事项

     ansible在vars中声明的变量名称中不能带有横线-号,只能带有下划线_
     flink-history-dir 是错误的,ansible在读取的时候会报错
     flink_history_dir 这样声明变量才可以

     ansible使用jinja2模板第11张

     ansible使用jinja2模板第12张

    变量声明不能带.号

     ansible使用jinja2模板第13张

  变量声明其他规则

          ansible的模板变量渲染后带u(unicode).用template模块渲染,渲染后成了unicode的字符串。这样对应的前端服务无法解析该配置

          - name: Copy setuptools-24.0.2.tar.gz to {{ groups["all"] | to_json }}     ['192.168.1.1','192.168.1.2']

          - name: Copy setuptools-24.0.2.tar.gz to {{ groups["all"]  }}                   [u'192.168.1.1',u'192.168.1.2']

  变量解析带to_json和不带to_json的区别

      ansible使用jinja2模板第14张

      ansible使用jinja2模板第15张

    jinjia2遍历数组并操作数组元素

      string方法返回一个新的数组

      ansible使用jinja2模板第16张 

     {% set hosts = [] %}
     {% for host in groups["all"] %}
     {{ hosts.append(host|string+":9100") }}
     {% endfor %}
    - targets: {{ hosts | to_json }}
    labels:
      group: 'client-node-exporter'

jinjia2过滤模板

     

免责声明:文章转载自《ansible使用jinja2模板》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ActiveMQ从入门到精通(一)【Oracle】CentOS7/CentOS8命令行重启Oracle 11G R2下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

上传下载后台函数以及前端脚本(webuploader) 备份

1 import java.io.BufferedOutputStream; 2 import java.io.IOException; 3 import java.io.InputStream; 4 import java.io.PrintWriter; 5 import java.io.UnsupportedEncodingExce...

C#中String跟string的“区别”

  string是c#中的类,String是.net Framework的类(在C# IDE中不会显示蓝色) C# string映射为.net Framework的String 如果用string,编译器会把它编译成String,所以如果直接用String就可以让编译器少做一点点工作。   如果使用C#,建议使用string,比较符合规范 string始终...

第七部分(二) 动态渲染页面爬取(Splash的安装和使用、Scrapy的安装、Docker的安装、Scrapy-Splash的安装,在Windows及Linux平台的安装)

二、 Splash的使用Splash是一个JavaSscript渲染服务,一个带有HTTP API的轻量级浏览器,同时对接了Python中的Twisted和QT库。使用它同样可以实现动态渲页面的抓取。Splash可以实现下面的这些功能:异步方式处理多个网页渲染过程;获取渲染后的页面的源代码或截图;通过关闭图片渲染或者使用Adblock规则来加快页面渲染速度...

DELPHI字符串、数组操作函数(转)

对字符串及数组的操作,是每个程序员必须要掌握的。熟练的使用Delphi的这些函数,在编程时能更加得心应手。   1.Copy   功能说明:该函数用于从字符串中复制指定范围中的字符。该函数有3个参数。第一个参数是数据源(即被复制的字符串),第二个参数是从字符串某一处开始复制,第三个参数是要复制字符串的长度(   即个数)。最后函数返回一个新的字符串(即是我...

C语言32个关键字(2)

二、C语言中的9中控制语句 goto语句:无条件转向; if语句:判断语句; while循环语句; do-while语句:先执行循环体,然后判断循环条件是否成立.之后继续循环; for语句:循环,可替代while语句;只是用法不同; break语句跳出本层的循环;(只跳出包含此语句的循环) continue语句:继续(一般放到循环语句里,不在执行它下面的语...

python定时任务-sched模块

通过sched模块可以实现通过自定义时间,自定义函数,自定义优先级来执行函数。 范例一 1 importtime 2 importsched 3 4 schedule =sched.scheduler( time.time,time.sleep) 5 6 deffunc(string1): 7 print "now excuted...