Jinja2模板、Roles角色详解
Ansible自动化运维这部分我将会分为五个部分来为大家讲解
(一)介绍、无密钥登录、安装部署、设置主机清单
(二)Ansible 中的 ad-hoc 模式 模块详解(15)个
(三)Playbook 模式详解
(四)jinja2 模板 Roles角色详解
(五)运维实战
相关文章大家在最后可以看到(包含链接)
一、Jinja2模板
jinja2是Python的全功能模板引擎。在python的WEB开发中被广泛应用。
Ansible通常会使用jinja2模板来修改被管理主机的配置文件等。
jinja2模块概念:
在 Ansible 中,Jinja2 模板引擎用于动态生成配置文件、脚本和其他文本内容。Ansible Playbook 使用 Jinja2 模板来创建灵活且可重用的任务定义,特别是在 template 模块中。
在ansible中的作用
使用Ansible的jinja2模板也就是使用template 模块,该模块和copy 模块一样,都是将文件复制到远端主机上去,但是区别在于,template 模块可以获取到文件中的变量,而copy则是原封不动的把文件内容复制过去。比如想把脚本中的变量名改成主机名,如果使用copy模块则推送过去的就是{{ ansible_fqdn }},不变,如果使用template,则会变成对应的主机名。
Ansible允许jinja2模板中使用条件判断和循环,但是不允许在playbook中使用。通常jinja2模板文件的后缀为.j2
jinja2模板的语法
基础语法
1)playbook文件使用template模块
2)模板文件里面变量使用{{名称}},比如{{PORT}}或使用facts
3){{}}也可以使用表达式,比如{{ 3+5 }} {{3 in [1,2,3,4,5] -}}
说明:{{}}中的表达式其实就是python中的表达式,可以包括比较运算,算数运算,逻辑运算,成员运行。
该模板支持:
字符串:使用单引号或双引号;数字:整数,浮点数;列表:[item1, item2, ...]元组:(item1, item2, ...)字典:{key1:value1, key2:value2, ...}布尔型:true/false算术运算:+, -, *, /, //, %, **比较操作:==, !=, >, >=, <, <=逻辑运算:and, or, not
模板通常都是通过引用变量来运用的
template模块在jinja2中的作用
copy与template的区别:
copy模块不替代参数,template模块替代参数
template的参数几乎与copy的参数完全相同
常用参数:
参数 | 解析 |
src | 指定本地jinja2模板文件的位置 |
dest | 指定目标远程主机路径 |
backup | 指定是否备份,默认值no |
mode | 设置权限 |
user | 设置用户 |
group | 设置用户组 |
实例
1、创建模板文件:
首先,需要创建一个包含Jinja2模板的文件。这个文件通常包含要插入变量或表达式的位置。可以在文件中使用{{ }}来包裹变量或表达式。
例如,创建一个名为 my_jinja.j2 的模板文件:
[root@server ansible]# cat my_jinja.j2
Welcome to {{ ansible_fqdn }}
This system total mem is : {{ ansible_memtotal_mb }} MB
This system free mem is : {{ ansible_memfree_mb }} MB
2、在playbook中使用模板:
在 Ansible Playbook中,可以使用template模块来加载模板文件并将变量传递给它。
以下是一个示例Playbook:
创建文件:
[root@server ansible]# cat jinja2.yml
---
- name: 使用jingja2模板hosts: node1tasks: - name: jinja2信息template:src: /etc/ansible/my_jinja.j2dest: /opt/hhh
在这个示例中,我们使用了template模块,指定了模板文件的源 (src) 和目标 (dest)。
3、执行 playbook
ansible-playbook -i inventory.ini jinja2.yml
检查一下:
ansible node1 -m command -a "ls /opt/"
ansible node1 -m command -a "cat /opt/hhh"
模板文件中的{{ }}不仅可以包含变量,还可以包含表达式,如您所述的比较运算、算术运算、逻辑运算等。这使得您可以在模板中执行各种操作以生成需要的配置或文本。
Jinja2模板的强大之处在于它允许创建灵活和动态的配置文件,以适应不同的场景和变量值。
二、Roles角色管理
介绍与优势:
一般情况下将roles写在 /etc/ansible/roles 中,也可以写在其他任意位置(写在其他位置要自己手动建立一个roles文件夹)
1、对于以上所有方式有个缺点就是无法实现同时部署web、database、keepalived等不同服务或者不同服务器组合不同的应用就需要写多个yaml文件,很难实现灵活的调用
2、roles用于层次性,结构化地组织playbook。roles能够根据层次结果自动装载变量文件、tasks以及handlers等。
3、要使用roles只需要在playbook中使用include指令即可。
4、简单来讲,roles就是通过分别将变量(vars)、文件(files)、任务(tasks)、模块(modules)以及处理器(handlers)放置于单独的目录中,并且可以便捷的include它们地一种机制。
roles模块概念:
在roles能够根据层次型结构自动装载变量文件、task以及handlers等。
简单来讲,roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中、并可以便捷地include他们的一种机制。角色一般用于基于主机构建服务的场景中、但也可以是用于构建守护进程等场景中。
其主要作用有以下几点:
1、模块化任务和变量管理:允许将相关任务、处理程序、变量和模板等组织到一个独立的角色中,以便更好地管理和维护代码。
2、重复使用:角色允许将常见的任务和功能打包到可重用的单元中,可以在不同的 Playbook 中多次引用,提高了代码的重用性。
3、结构化组织:角色允许按照应用程序的不同组件或功能模块来组织任务,使代码更易于理解和维护。
4、简化playbook:通过将复杂的任务拆分成多个角色,可以使playbook 更为清晰简洁,提高代码的可读性和可维护性
5、自动化部署:角色可以包含特定应用程序或服务的安装、配置和部署等任务,简化了自动化部署过程
roles的目录结构:
[root@server ~]# tree /etc/ansible/roles
/etc/ansible/roles
└── nginx
├── default
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── roles.yml
├── tasks
│ └── main.yml
├── templates
│ ├── nginx.conf.j2
│ └── systemctl.nginx.j2
└── vars
└── main.yml
8 directories, 8 files
创造一个角色目录,用于演示:
mkdir -pv /etc/ansible/roles/nginx/{files,templates,vars,tasks,handlers,meta,default}
然后除了files目录和templates目录,其他都需要再建一个main.yml的文件用于写东西的
使用tree命令来进行查看,没有的先进行下载
yum -y install tree
进入/etc/ansible/目录下查看
[root@server ansible]# tree roles
Roles内各目录作用:
Roles模块可以含有files、templates、tasks、handlers、vars、defaults、meta七个目录(可以根据情况自行进行删减)
每个目录的作用如下:
files: 用来存放由 copy 模块或script模块调用的文件。
templates: 用来存放jinjia2模板,template模块会 自动在此目录中寻找jinjia2模板文件。
tasks: 此目录应当包含一个main.yml文件, 用于定义此角色的任务列表,此文件可以使用 include包含其它的位于此目录的 task 文件。
handlers: 此目录应当包含一个main.yml文件,用于定义此角色中触发条件时执行的动作。
vars: 此目录应当包含一个main.yml文件,用于定义此角色用到的变量。
defaults: 此目录应当包含一个main.yml文件,用于为当前角色设定默认变量。
meta: 此目录应当包含一个main.yml文件,用于定义此角色的特殊设定及其依赖关系
使用方式
Roles在playbook中使用方式:
先创建roles命令的目录以及创建全局变量目录,然后在roles目录中分别创建以各角色名称命令的目录(如httpd在每个角色命令的目录中分别创建file、handlers、tasks、templates、meta、defaults和vars目录,用不到的目录可以创建为空),接着在每个角色的handlers、tasks、meta、defaults、vars、目录下创建main.yml文件,不能自定义。最后在playbook文件中调用各角色。
接下来我来为大家写一份非常简单的一个安装nginx服务的小案例:
编辑变量:
[root@server ansible]# vi /etc/ansible/roles/nginx/vars/main.yml[root@server ansible]# cat /etc/ansible/roles/nginx/tasks/main.yml- name: nginxyum:name: "{{ nginx_packet }}"state: present
编辑任务:
[root@server ansible]# vi /etc/ansible/roles/nginx/tasks/main.yml[root@server ansible]# cat /etc/ansible/roles/nginx/tasks/main.yml- name: nginxyum:name: "{{ nginx_packet }}"state: present
执行:
ansible-playbook -i inventory.ini roles1.yml
三、相关文章:
相关文章标题以及链接 |
---|
Ansible自动化运维(一)介绍、无密钥登录、安装部署_ansible 免密登录-CSDN博客 |
Ansible自动化运维(二) ad-hoc 模式 模块详解_ansible ad-hoc-CSDN博客 |
Ansible自动化运维(三)playbook剧本详解-CSDN博客 |
Jinja2模板、Roles角色详解-CSDN博客 |
Ansible自动化运维(五) 运维实战-CSDN博客 |