制作类网站,设计图片素材网站有哪些,桓台县城乡建设局网站,wordpress改造彩票相关文章ansible自动化运维#xff08;一#xff09;简介及清单,模块-CSDN博客ansible自动化运维#xff08;二#xff09;playbook模式详解-CSDN博客ansible自动化运维#xff08;四#xff09;运维实战-CSDN博客
三.Ansible jinja2模板
Jinja2是Python的全功能模板引…相关文章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基础语法
1playbook文件使用template模块
2模板文件里面变量使用{{名称}}比如{{PORT}}或使用facts
3{{}}也可以使用表达式比如{{35}}{{3 in[1,2,3,4,5]-}}
说明{{}}中的表达式其实就是python中的表达式可以包括比较运算算数运算逻辑运算成员运行。
该模板支持 字符串使用单引号或双引号 数字整数浮点数 列表[item1, item2, ...] 元组(item1, item2, ...) 字典{key1:value1, key2:value2, ...} 布尔型true/false 算术运算 , -, *, /, //, %, ** 比较操作 , !, , , , 逻辑运算 and, or, not
模板通常都是通过引用变量来运用的
【实例】
创建模板文件 首先需要一个包含jinja2模板的文件。这个文件通常包含要插入变量或表达式的位置。可以在文件中是使用 {{}} 来包裹变量或表达式。
例如创建一个名为my_template.j2的模板文件 [roothost1 jinja2]# cat my_template.j2 ServerName {{ hostname }} Listen {{ port }} Debug {{ debug_mode }} 2.在Playbook中使用模板
在 Ansible Playbook中可以使用template模块来加载模板文件并将变量传递给它。以下是一个示例Playbook [rootserver 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
运行上述PlaybookAnsible将使用模板文件生成 /etc/ansible/yml/jinja2/myapp.conf 配置文件并将模板中的{{ }}替换为变量的值。 [rootserver jinja2]# ansible-playbook jinja.yml 查看结果为 roothost1 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的区别
copy模块不替代参数template模块替代参数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通知与触发处理程序 创建一个自定义的Redis配置模板文件如redis_conf.j2,并在其中修改Redis绑定地址以侦听所有IP地址 [roothost1 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 [rootserver 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 # 检查语法 [rootlocalhost redis]# ansible-playbook --syntax-check redis.yml # 列出任务列表 [rootlocalhost redis]# ansible-playbook --list-tasks redis.yml # 列出所有tags标签 [rootlocalhost 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 repoUpload 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
执行yml脚本 #执行更新yum源 [rootserver redis]# ansible-playbook redis.yml -t upload_repo #检查是否安装过redis会有报错说找不到不会影响里面有 ignore_errors忽略错误 [rootserver redis]# ansible-playbook redis.yml -t check_redis # 执行安装 redis不能单独执行redis会报错因为有一个when判断需要调用上面的查询是否有redis服务 [rootserver redis]# ansible-playbook redis.yml -t check_redis,install_redis #执行更新redis配置文件 [rootserver redis]# ansible-playbook redis.yml -t upload_redis.conf #执行完毕可以查看redis状态及redis端口是否启动正常是都启动的 #执行停止redis [rootserver redis]# ansible-playbook redis.yml -t stop_redis # 执行完毕可以查看redis状态及redis端口是否启动如果没有那就是没问题因为这是停止 #执行卸载redis [rootserver redis]# ansible-playbook redis.yml -t uninstall_redis # 执行完可以使用 rpm -q redis 查看或使用 check_redis标签检查 # 执行一键安装redis [rootserver 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文件夹 对于以上所有方式有个缺点 就是无法实现同时部署web、database、keepalived等不同服务或者不同服务器组合不同的应用就需要写多个yaml文件很难实现灵活的调用roles用于层次性结构化地组织playbook。roles能够根据层次结果自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单来讲roles就是通过分别将变量vars、文件files、任务tasks、模块modules以及处理器handlers放置于单独的目录中并且可以便捷的include它们地一种机制。角色一般用于基于主机构建服务的场景中但是也可以用于构建守护进程等场景中。
4.2Roles的目录结构
建一个角色目录用于演示 [rootserver redis]# mkdir -pv /etc/ansible/roles/{nginx,mysql,httpd}/{files,templates,vars,tasks,handlers,meta,default} 看Roles的目录结构 [rootserver 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的目录结构 [rootserver redis]# ansible-galaxy init /etc/ansible/roles/webserver - Role /etc/ansible/roles/webserver was created successfully 2.安装别人写好的roles [rootserver 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 [rootserver etc]# cd ansible/roles/ [rootserver roles]# ls mysql default files handlers meta tasks templates vars 3.列出已安装的roles [rootserver 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的信息 [rootserver ~]# 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目录就可以 [rootserver ~]# ansible-galaxy remove /etc/ansible/roles/tenequm.mysql - successfully removed /etc/ansible/roles/tenequm.mysql 都看到这了留个一键三连呗谢谢你们啦