Ansible-06-模板

Posted shark_西瓜甜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ansible-06-模板相关的知识,希望对你有一定的参考价值。

模板介绍

Ansible使用Jinja2模板来启用动态表达式和访问变量。

比如:

模板文件内容如下:

IP 地址: {{ ip }}

当定义 ip=192.168.122.10 这个变量时候,通过上面的模板文件可以产生出如下内容的新文件

IP 地址: 192.168.122.10

原来的模板文件不变。

在目标计算机上发送和执行任务之前,所有模板都在Ansible控制器上进行。

Jinja2 模板基本语法

Jinja模板只是一个文本文件,一般文件名使用 .j2 为后缀。模板包含变量和或表达式,在渲染模板时将其替换为值。

有几种分隔符。默认的Jinja分隔符配置如下:

  • {% ... %} 声明逻辑表达式
  • {{ ... }} 用于将变量输出
  • {# ... #} 用于模板的注释

JinJa2 逻辑控制

条件表达

{% if %}
...
{% elif %}
...
{% else %}
...
{% endif %}

Example

{# 如果定义了 idc 变量, 则输出 #}
{% if idc is defined %}
{{ idc }}
{% elif %}
   没有定义
{% endif %}

循环控制

{% for %}
...
...
{% endfor %}

Example

{# 列举出 dbservers 这个 group 中的所有主机 #}
{% for host in groups['dbservers'] %}
{{ host }}
{% endfor %}
{#与Python 语法不通,模板中的循环内不能break或continue。但你可以在迭代中过滤序列来跳过某些项#}
{#打印dbservers 组中的所有主机,但是不打印1.1.1.1 这台主机#}
{% for host in groups['dbservers'] if host != "1.1.1.1" %}
{{host}}
{% endfor %}

Ansible 中使用

首先在管理节点创建模板文件

{# 我是注释  #}

这里输出了自定义变量的内容: {{ ip }}

循环输出目前执行任务的主机 {{ inventory_hostname }} 属于下列组:

{% for g in group_names %}

组名: {{ g }}

{% endfor %}

{% if n > 10 %}
这个值是 {{ n }}
{% endif %}

YAML 文档内容如下:

- name: 测试变量
  hosts: slb
  gather_facts: no
  vars:
     ip: 192.168.122.26
     n: 20
  tasks:
    - name: 模板文件测试
      template:
        src: test.j2
        dest: /tmp/test.conf

输出的文件内容如下

[root@master ~]# cat /tmp/test.conf

这里输出了自定义变量的内容: 192.168.122.26

循环输出目前执行任务的主机 192.168.122.26 属于下列组:


组名: nginx


组名: slb


  这个值是 20

以上是关于Ansible-06-模板的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段1——vue主模板

VSCode自定义代码片段2——.vue文件的模板

VSCode自定义代码片段(vue主模板)

Eclipse 中的通用代码片段或模板

调用模板化成员函数:帮助我理解另一个 *** 帖子中的代码片段

vscode代码片段生成vue模板