一,jinja2模板管理
1,jinja2简介
Ansible将jinja2模板系统用于模板文件。Ansible还使用jinja2语法来引用playbook中的变量。
变量和逻辑表达式置于标记或分隔符之间。例如,jinja2模板将{% EXPR %}用于表达式或逻辑(如循环),而{}则用于向最终用户输出表达式或变量的结果。后一标记在呈现时将被替换为一个或多个值,对最终用户可见。使用{# COMMENT #}语法括起不应出现在最终文件中的注释。
[root@lry files]# cat hosts.j2
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
{# 注释 #}
{{ ansible_facts['default_ipv4']['address'] }} {{ ansible_facts['hostname'] }}
//copy模块 内容会被原封不动的复制过去
[root@lry ansible]# cat test.yml
---
- hosts: 192.168.14.10
tasks:
- name: lry
copy:
src: files/hosts.j2
dest: /etc/hosts
//template模块 把该替换的内容替换成对应的内容
[root@lry ansible]# cat test.yml
---
- hosts: 192.168.14.10
tasks:
- name: lry
template:
src: files/hosts.j2
dest: /etc/hosts
2,部署jinja2模板
jinja2模板是功能强大的工具,可用于自定义要在受管主机上部署的配置文件。创建了适用于配置文件的jinja2模板后,它可以通过template模板部署到受管主机上,该模块支持将控制节点中的本地文件转移到受管主机。
若要使用template模块,请使用下列语法。与src键关联的值指定来源jinja2模板,而与dest键关联的值指定要在目标主机上创建的文件。
tasks:
- name: template render
template:
src: /tmp/j2-template.j2
dest: /tmp/dest-config-file.txt
template模块还允许指定已部署文件的所有者、组、权限和SELINUX上下文,就像file模块一样。它也可以取用validate选项运行任意命令(如visudo -c),在将文件复制到位之前检查该文件的语法是否正确。
3,管理模板文件
为避免系统管理员修改Ansible部署的文件,最好在模板顶部包含注释,以指示不应手动编辑该文件。
可使用ansible_managed指令中设置的"Ansible managed"字符串来执行此操作。这不是正常变量,但可以在模板中用作一个变量。
[root@lry ansible]# cat test.yml
---
- hosts: 192.168.14.10
tasks:
- name: lry
template:
src: files/hosts.j2
dest: /etc/hosts
4,控制结构
用户可以在模板文件中使用jinja2控制结构,以减少重复输入,为play中的每个主机动态输入条目,或者有条件地将文本插入到文件中。
循环语句
jinja2使用for语句来提供循环功能。
[root@lry ansible]# cat test.yml
---
- hosts: 192.168.14.10
gather_facts: no
vars_files: //引用变量文件
- vars/user.yml
tasks:
- name: lry
template:
src: files/test.j2
dest: /tmp/abc
// playbook中引用的文件
[root@lry ansible]# cat files/test.j2
{% for msg in info %}
{{ msg }}
=========
{% endfor %}
loop.index变量扩展至循环当前所处的索引号。它在循环第一次执行时值为1,每一次迭代递增1
//if判断条件
[root@lry ansible]# cat files/test.j2
{% for msg in info if msg == "hello wang" %} //只显示wang,如果不要wang就在if后面加个not,或者!=不等于
{{ msg }}
=========
{% endfor %}
//循环里面加判断语句,在for循环里面去判断
[root@lry ansible]# cat files/test.j2
{% for msg in info %}
{% if msg == "hello lry" %}
{{ msg }}
=========
{% endif %}
{% endfor %}
使用条件句
jinja2使用if语句来提供条件控制。如果满足某些条件,这允许用户在已部署的文件中放置一行。
[root@lry ansible]# cat clown.j2
{{ ansible_facts['default_ipv4'] | to_json }}
[root@lry ansible]# cat playbook.yml
---
- hosts: 192.168.14.10
gather_facts: yes
tasks:
- name: template
template:
src: /etc/ansible/clown.j2
dest: /opt/clown
变量过滤器
jinja2提供了过滤器,更改模板表达式的输出格式
to_nice_json过滤器使用JSON格式化表达式输出
[root@ansible playbook]# cat vars/user.yml
info:
- name: xuan
age: 21
- name: yi
age: 20
[root@ansible playbook]# cat files/test.j2
{% if " " %}
{{ info | to_nice_json }}
{% endif %}
二,管理大项目
1,引用清单主机
主机模式用于指定要作为play或临时命令的目标的主机。在最简单的形式中,清单中受管主机或主机组的名称就是指定该主机或主机组的主机模式。
在play中,hosts指定要针对其运行play的受管主机。对于临时命令,以命令行参数形式将主机模式提供给ansible命令。
[root@lry ansible]# cat inventory
[apache]
192.168.14.10
[mysql]
192.168.14.11
[php]
192.168.14.12
可以通过IP或者组名去ping受控主机
[root@lry ansible]# ansible 192.168.14.10 -m ping
192.168.14.10 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
[root@lry ansible]# ansible apache -m ping
192.168.14.10 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}