ansible自动化运维(三)jinja2模板&&roles角色管理

相关文章
ansible自动化运维(一)简介及清单,模块-CSDN博客
ansible自动化运维(二)playbook模式详解-CSDN博客
ansible自动化运维(四)运维实战-CSDN博客

三.Ansible jinja2模板

Jinja2是Python的全功能模板引擎。在python的WEB开发中被广泛应用。

Ansible通常会使用jinja2模板来修改被管理主机的配置文件等。

3.1在Ansible 中的使用

使用Ansible的jinja2模板也就是使用template 模块,该模块和copy 模块一样,都是将文件复制到远端主机上去,但是区别在于,template 模块可以获取到文件中的变量,而copy则是原封不动的把文件内容复制过去。比如想把脚本中的变量名改成主机名,如果使用copy模块则推送过去的就是{{ ansible_fqdn }},不变,如果使用template,则会变成对应的主机名。

Ansible允许jinja2模板中使用条件判断和循环,但是不允许在playbook中使用。通常jinja2模板文件的后缀为.j2

3.2jinja2模板语法

3.2.1基础语法

(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 |

模板通常都是通过引用变量来运用的

【实例】

  1. 创建模板文件:

首先,需要一个包含jinja2模板的文件。这个文件通常包含要插入变量或表达式的位置。可以在文件中是使用 {{}} 来包裹变量或表达式。

例如,创建一个名为my_template.j2的模板文件:

|--------------------------------------------------------------------------------------------------------------|
| [root@host1 jinja2]# cat my_template.j2 ServerName {{ hostname }} Listen {{ port }} Debug {{ debug_mode }} |

2.在Playbook中使用模板:

在 Ansible Playbook中,可以使用template模块来加载模板文件并将变量传递给它。以下是一个示例Playbook:

|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [root@server jinja2]# cat jinja.yml --- - name: 使用Jinja2模板 hosts: node1 vars: hostname: example.com port: 8080 debug_mode: True tasks: - name: 生成配置文件 template: src: my_template.j2 dest: /etc/ansible/yml/jinja2/myapp.conf |

在这个示例中,我们使用了template模块,指定了模板文件的源(src)和目标(dest)。我们还传递了变量hostname、port和debug_mode,这些变量会在模板中替换 {{}} 中相应的位置。

3.运行Playbook:

运行上述Playbook,Ansible将使用模板文件生成 /etc/ansible/yml/jinja2/myapp.conf 配置文件,并将模板中的{{ }}替换为变量的值。

|----------------------------------------------------|
| [root@server jinja2]# ansible-playbook jinja.yml |

查看结果为

|-----------------------------------------------------------------------------------------------------------|
| root@host1 jinja2]# cat /etc/ansible/yml/jinja2/myapp.conf ServerName example.com Listen 8080 Debug True |

模板文件中的 {{ }} 不仅可以包含变量,还可以包含表达式,如您所述的比较运算、算数运算、逻辑运算等。这使得您可以把在模板中执行各种操作以生成需要的配置或文本。

3.2.2流程控制

条件判断

使用{% if %}和{% endif %}块来实现条件语句。以下是一个示例:

格式:

|------------------------------------------------|
| {% if EXPR %} 执行内容 {% else %} 执行内容 {% endif %} |

实例:

|------------------------------------------------------------------------------------------------|
| {% if is_production %} # 生产环境配置 DebugLevel: 0 {% else %} # 开发/测试环境配置 DebugLevel: 2 {% endif %} |

多条件判断

格式:

|---------------------------------------------------------------------|
| {% if EXPR %} 执行内容 {% elif EXPR %} 执行内容 {% else %} 执行内容 {% endif %} |

实例:

|------------------------------------------------------------------------------------------------------------------|
| {% if is_production %} DebugLevel: 0 {% elif is_production %} DebugLevel: 1 {% else %} DebugLevel: 2 {% endif %} |

在这个示例中,根据is_production变量的值,将生成不同的配置。

循环表达式

可以使用{% for %}和{% endfor %}块来实现循环。以下是一个示例:

格式:

|---------------------------------------|
| {% for i in EXPR %} 执行内容 {% endfor %} |

实例:

|--------------------------------------------------------|
| {% for item in list_items %} - {{ item }} {% endfor %} |

在这个示例中,list_items 是一个包含多个元素的列表,模板将循环遍历列表中的每个元素并生成相应的输出。

说明:默认不支持break和continue的,但是可以使用ansible的扩展选项,在配置/etc/ansible/ansible.cfg中的132行中:

jinja2_extensions = jinja2.ext.do,jinja2.ext.i18n,jinja2.ext.loopcontrols

3.2.3 过滤器

Jinja2还支持过滤器,可以使用过滤器来对变量进行操作。例如,可以使用default过滤器来设置默认值:

|--------------------------------------------|
| {{ variable | default("default_value") }} |

或者,您可以使用length过滤器来获取列表的长度:

|------------------------------------------------|
| The list has {{ list_items | length }} items. |

3.2.4其他控制结构

Jinja2还支持其他控制结构,如{% include %}用于包含其他模板文件,以及{% macro %}和{% call %}用于定义和调用宏。

请注意,Jinja2语法和功能非常强大,支持许多高级用例,例如宏、继承、自定义过滤器等。要更深入地了解Jinja2模板的流程控制和功能,请查看Jinja2的官方文档。在Ansible中,可以将这些模板用于生成配置文件、编排任务等,以满足不同的需求和环境。

3.3template模板

template模块与copy模块的用法十分类似,只是更多用于jinja2模板的渲染,也就是模板文件中可以引用变量,实现对不同主机有定制化的配置。

copy与template的区别

  1. copy模块不替代参数,template模块替代参数
  2. template的参数几乎与copy的参数完全相同

常用参数

|--------|-------------------|
| 参数 | 解析 |
| src | 指定本地jinja2模板文件的位置 |
| dest | 指定目标远程主机路径 |
| backup | 指定是否备份,默认值no |
| mode | 设置权限 |
| user | 设置用户 |
| group | 设置用户组 |

3.4jinja2使用案例

比如需要实现对被控端主机安装redis服务,默认的redis服务只监听本地的127.0.0.1端口,换句话说,其他主机是不可以访问该redis服务器的,如何来解决这个问题呢?此时就可以使用jinja2的模板,在其中引用变量,使用template模块进行渲染。

本案例使用了:jinja2模板、templates模块、copy模块、yum模块、shell模块、service模块、vars定义变量、register变量注册、ignore_errors忽略错误、tags标签、when判断、notify 和 handlers通知与触发(处理程序)

  1. 创建一个自定义的Redis配置模板文件,如redis_conf.j2,并在其中修改Redis绑定地址以侦听所有IP地址;

|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [root@host1 redis]# cat redis_conf.j2 bind {{ ansible_host }} 127.0.0.1 port {{ redis_port }} protected-mode no tcp-backlog 511 timeout 0 tcp-keepalive 300 daemonize yes supervised no pidfile /var/run/redis_6379.pid loglevel notice |

在此示例中,我们使用了 bind {{ ansible_host }} 127.0.0.1 来告诉Redis服务只接受本地IP连接,并使用变量 redis_port 来指定Redis端口。

2.在Ansible Playbook中,使用template模块加载该模板并渲染它,然后将渲染后的配置文件复制到Redis配置文件目录。以下是一个示例Playbook:

|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [root@server redis]# cat redis.yml --- - name: 配置Redis服务器 hosts: node1 become: yes gather_facts: yes tasks: - name: 安装并启动Redis服务 service: name: redis state: started enabled: yes tags: - start_redis - redis_server - name: 重启Redis服务 service: name: redis state: restarted tags: - restart_redis - name: 停止Redis服务 service: name: redis state: stopped tags: - stop_redis - uninstall_redis - name: 卸载Redis服务 yum: name: redis state: absent tags: - uninstall_redis handlers: - name: 重启Redis service: name: redis state: restarted |

|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| # 检查语法 [root@localhost redis]# ansible-playbook --syntax-check redis.yml # 列出任务列表 [root@localhost redis]# ansible-playbook --list-tasks redis.yml # 列出所有tags标签 [root@localhost redis]# ansible-playbook --list-tags redis.yml |

asks 解析:(列出tasks任务的时候后面也会包含tags标签,每个任务用的标签都有哪些)

|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| tasks: Upload yum repo # 更新yum源 Upload epel repo # 更新yum扩展源 Check redis install # 检查是否安装过 redis Install redis server # 安装 redis Upload redis.conf # 更新 redis 配置文件 Start Redis server # 启动 redis Restart Redis server # 重启 redis Stop Redis Server # 停止 redis uninstall Redis Server # 卸载 redis |

tags 解析:(列出tasks任务的时候后面也会包含tags标签,每个任务用的标签都有哪些)

|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| TASK TAGS: upload_repo # 更新yum源,包含:Upload yum repo,Upload epel repo upload_yum # 更新yum源 upload_epel # 更新yum扩展源 redis_server # 一键安装redis,包含:Upload yum repo、Upload epel repo、Check redis install、Install redis server、Upload redis.conf、Start Redis server check_redis # 检查是否安装 redis upload_redis.conf # 更新 redis 配置文件 install_redis # 安装 redis restart_redis # 重启 redis start_redis # 启动 redis stop_redis # 停止 redis uninstall_redis # 卸载 redis |

  1. 执行yml脚本

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| #执行更新yum源 [root@server redis]# ansible-playbook redis.yml -t upload_repo #检查是否安装过redis,会有报错说找不到,不会影响,里面有 ignore_errors忽略错误; [root@server redis]# ansible-playbook redis.yml -t check_redis # 执行安装 redis(不能单独执行redis,会报错,因为有一个when判断需要调用上面的查询是否有redis服务) [root@server redis]# ansible-playbook redis.yml -t check_redis,install_redis #执行更新redis配置文件 [root@server redis]# ansible-playbook redis.yml -t upload_redis.conf #执行完毕可以查看redis状态及redis端口是否启动,正常是都启动的; #执行停止redis [root@server redis]# ansible-playbook redis.yml -t stop_redis # 执行完毕可以查看redis状态及redis端口是否启动,如果没有那就是没问题,因为这是停止; #执行卸载redis [root@server redis]# ansible-playbook redis.yml -t uninstall_redis # 执行完可以使用: rpm -q redis 查看或使用 check_redis标签检查 # 执行一键安装redis [root@server redis]# ansible-playbook redis.yml -t redis_server # 执行完毕可以查看redis状态及redis端口是否启动,正常是都启动的; |

四.roles角色管理

在Ansible中,有一个roles的概念。roles并不是指定具体的东西,而是一种规范,将复杂的Playbook分割为多个文件的机制,简化复杂的Playbook编写,并且使Playbook的复用变得简单。

建议:每个roles最好只使用一个tasks这样方便调用,能够很好的做到解耦;

4.1Roles介绍与优势

一般情况下将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它们地一种机制。
  5. 角色一般用于基于主机构建服务的场景中,但是也可以用于构建守护进程等场景中。

4.2Roles的目录结构

建一个角色目录,用于演示:

|----------------------------------------------------------------------------------------------------------------------------|
| [root@server redis]# mkdir -pv /etc/ansible/roles/{nginx,mysql,httpd}/{files,templates,vars,tasks,handlers,meta,default} |

看Roles的目录结构:

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [root@server redis]# tree /etc/ansible/roles/ /etc/ansible/roles/ ├── httpd │ ├── default │ ├── files │ ├── handlers │ ├── meta │ ├── tasks │ ├── templates │ └── vars ├── mysql │ ├── default │ ├── files │ ├── handlers │ ├── meta │ ├── tasks │ ├── templates │ └── vars └── nginx ├── default ├── files ├── handlers ├── meta ├── tasks ├── templates └── vars 24 directories, 0 files |

目录解析:

/etc/ansible/roles/:存放roles的文件路径


httpd:存放apached服务的yml文件


mysql:存放mysql服务的yml文件


nginx:存放nginx服务的yml文件


default:此目录至少应该有一个名为main.yml的文件,用于设定默认变量;


files:存储由copy或者script等模块调用的文件或者脚本;


handlers:此目录中至少应该有一个名为main.yml的文件,用于定义各个handler;其他文件需要由main.yml进行包含调用;


meta:此目录中至少应该有一个名为main.yml的文件,定义当前角色的特殊设定以及依赖关系,其他文件需要由main.yml进行包含调用;


tasks:此目录中至少应该有一个名为main.yml的文件,用于定义各个task;其他文件需要由main.yml进行包含调用;


templates:存储由templates模块调用的模板文件;


vars:此目录至少应该有一个名为main,yml的文件,用于定义各个variable;其他的文件需要由main.yml进行包含调用;


4.3ansible-galaxy命令

ansible-galaxy命令用于管理roles,同时也可以在galaxy.ansible.com上下载别人写好的roles。

1,初始化roles的目录结构

|--------------------------------------------------------------------------------------------------------------------------------------|
| [root@server redis]# ansible-galaxy init /etc/ansible/roles/webserver - Role /etc/ansible/roles/webserver was created successfully |

2.安装别人写好的roles

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [root@server redis]# ansible-galaxy role install -p /etc/ansible/roles tenequm.mysql - downloading role 'mysql', owned by tenequm - downloading role from https://github.com/tenequm/ansible-mysql/archive/1.0.1.tar.gz - extracting tenequm.mysql to /etc/ansible/roles/tenequm.mysql - tenequm.mysql (1.0.1) was installed successfully [root@server etc]# cd ansible/roles/ [root@server roles]# ls mysql default files handlers meta tasks templates vars |

3.列出已安装的roles

|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [root@server roles]# ansible-galaxy list # /usr/share/ansible/roles # /etc/ansible/roles - webserver, (unknown version) - tenequm.mysql, 1.0.1 [WARNING]: - the configured path /root/.ansible/roles does not exist. |

4.查看指定roles的信息

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [root@server ~]# ansible-galaxy info tenequm.mysql Role: tenequm.mysql description: Simply installs MySQL 5.7 on Xenial. commit: b3a7139ba44a91e9568345565e861e326e9d401e commit_message: Added priveleges configs for users. created: 2023-05-08T20:18:24.338543Z download_count: 238 github_branch: master github_repo: ansible-mysql github_user: tenequm id: 103 imported: 2017-06-08T21:57:26.659770-04:00 modified: 2023-10-10T00:48:33.420438Z path: (u'/root/.ansible/roles', u'/usr/share/ansible/roles', u'/etc/ansible/roles') upstream_id: 17029 username: tenequm |

5.删除一个roles

如果是使用的wget拉取的,那么删除他的哪个roles目录就可以;

|------------------------------------------------------------------------------------------------------------------------------------|
| [root@server ~]# ansible-galaxy remove /etc/ansible/roles/tenequm.mysql - successfully removed /etc/ansible/roles/tenequm.mysql |

都看到这了留个一键三连呗,谢谢你们啦

相关推荐
草莓熊Lotso6 小时前
Linux 文件描述符与重定向实战:从原理到 minishell 实现
android·linux·运维·服务器·数据库·c++·人工智能
历程里程碑6 小时前
Linux22 文件系统
linux·运维·c语言·开发语言·数据结构·c++·算法
七夜zippoe14 小时前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann
Fcy64815 小时前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满15 小时前
Linux怎么查看最新下载的文件
linux·运维·服务器
代码游侠16 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
Harvey90316 小时前
通过 Helm 部署 Nginx 应用的完整标准化步骤
linux·运维·nginx·k8s
珠海西格电力科技17 小时前
微电网能量平衡理论的实现条件在不同场景下有哪些差异?
运维·服务器·网络·人工智能·云计算·智慧城市
释怀不想释怀17 小时前
Linux环境变量
linux·运维·服务器
zzzsde17 小时前
【Linux】进程(4):进程优先级&&调度队列
linux·运维·服务器