RHCE8 资料整理(十二)

RHCE8 资料整理

    • 第 33 章 jinja2模板的使用
      • 31.1 if 判断
      • 33.2 for循环
      • 33.3 handlers

第 33 章 jinja2模板的使用

详细参考
https://blog.csdn.net/u010230019/article/details/128561872
https://blog.csdn.net/u010230019/article/details/128477679

假设目前Nginx的配置文件在所有的服务器上都是相同的,但我希望能根据每一台服务器的性能去定制服务的启动进程。 同时定制每一台Nginx服务的响应头,以便于当某台服务出现问题时能快速定位到具体的服务器。
要做这样的定制势必会导致一个问题,Nginx 在每台物理服务器上的配置文件都不一样,这样的配置文件如何管理呢? 再使用copy 模块去做管理显然已经不合适。此时使用Ansible 提供的另一个模块(template) 功能,它可以帮助我们完美的解决问题。

template 模块使用了Jinjia2格式作为文件模版,可以进行文档内变量的替换。 它的每次使用都会被ansible标记为”changed”状态。文件以 .j2 结尾,模块常用参数如下:

        backup 创建一个包含时间戳信息的备份文件,这样如果您以某种方式错误地破坏了原始文件,就可以将其恢复原状。yes/noforce 默认值是yes,当内容与源不同时,它将替换远程文件。如果no,仅在目标不存在时才传输文件。src 指定 Ansible 控制端的文件路径dest 指定 Ansible 被控端的文件路径owner 指定文件的属主group 指定文件的属组mode 指定文件的权限newline_sequence 指定新文件的换行符; \n,\r, 或 \r\n

Jiaja2是Flask默认支持的模板引擎,它的主要作用是渲染模板

  1. jinja2 文件以 .j2 为后缀, 也可以不写后缀。
  2. jinja2 中存在三种定界符
        注释: {# 注释内容 #}变量引用: {{ var }}逻辑表达: {% %}

示例,

[root@node-137 ansible]# cat templates/aa.j2
myIP: {{ansible_default_ipv4.address}}[root@node-137 ansible]# cat jinja2-1.yml
---
- hosts: db1gather_facts: truetasks:- template: src=aa.j2 dest=/home/yurq/aa.txt[root@node-137 ansible]# ansible-playbook jinja2-1.yml
PLAY [db1] ****************************************************************************************************************************TASK [Gathering Facts] ****************************************************************************************************************
ok: [node-138]TASK [template] ***********************************************************************************************************************
ok: [node-138]PLAY RECAP ****************************************************************************************************************************
node-138                   : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0[root@node-137 ansible]# ansible db1 -m shell -a "cat /home/yurq/aa.txt"
node-138 | CHANGED | rc=0 >>
myIP: 192.168.81.138

如果jinja2模板文件中没有写路径,则会优先当前目录的templates中查找

31.1 if 判断

{# 如果定义了 idc 变量, 则输出 #}	
{% if 判断1 %}	内容1
{% elif 判断2 %}内容2
{% else %}	内容3
{% endif %}

注意:

  1. %两边有没有空格都可以,不过所有的%前后空格要保持一致
  2. ifelif中的内容过多,可以另起一行
  3. elifelse不是必需的
  4. 如果判断1成立,则打印内容1,后面的条件不再执行,直接跳到endif后面的内容;如果判断1不成立,则执行elif后面的判断2,成功则跳到endif后面的内容,如果判断2不成立,则执行else后面内容3。如果ifelif都不成立,则打印else后面内容3

示例,

[root@node-137 ansible]# cat templates/if-1.j2
{% if ansible_default_ipv4.address=='192.168.17.138' %}{{ ansible_default_ipv4.address }}
{% elif ansible_fqdn=="node-138" %}{{ ansible_fqdn }}
{% else %}{{ ansible_distribution_major_version }}
{% endif %}"end"[root@node-137 ansible]# cat if-1.yml
---
- hosts: db1gather_facts: truetasks:- template: src=if-1.j2 dest=/home/yurq/if.txt[root@node-137 ansible]# ansible-playbook if-1.ymlPLAY [db1] ****************************************************************************************************************************TASK [template] ***********************************************************************************************************************
fatal: [node-138]: FAILED! => {"changed": false, "msg": "AnsibleUndefinedVariable: 'ansible_default_ipv4' is undefined"}PLAY RECAP ****************************************************************************************************************************
node-138                   : ok=0    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0[root@node-137 ansible]# ansible db1 -m shell -a "cat /home/yurq/if.txt"
node-138 | CHANGED | rc=0 >>node-138"end"

33.2 for循环

一个列表中有多个元素,如果需要依次对列表中的每个元素操作,则可以使用for循环来实现,语法,

{% for i in 列表名%}{{i}}
{% endfor %}

示例,

[root@node-137 ansible]# cat templates/for-1.j2
{% set list1=['aa','bb','cc'] %}
111
{% for i in list1 %}
{{i}}
{% endfor %}
222
[root@node-137 ansible]# cat for-1.yml
---
- hosts: db1gather_facts: falsetasks:- template: src=for-1.j2 dest=/home/yurq/for-1.txt
[root@node-137 ansible]# ansible-playbook for-1.ymlPLAY [db1] ****************************************************************************************************************************TASK [template] ***********************************************************************************************************************
changed: [node-138]PLAY RECAP ****************************************************************************************************************************
node-138                   : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0[root@node-137 ansible]# ansible db1 -m shell -a "cat /home/yurq/for-1.txt"
node-138 | CHANGED | rc=0 >>
111
aa
bb
cc
222

除了jinja2模板中手动定义的列表,一般情况下,我们会在playbook中定义列表,然后对列表中的元素进行循环

[root@node-137 ansible]# cat templates/ee.j2
{% for i in users %}
{{i.uname}}
{% endfor %}
[root@node-137 ansible]# cat user_list.txt
users:- uname: "tom"age: 18- uname: "jerry"age: 19- uname: "jacky"age: 18
[root@node-137 ansible]# cat for-2.yml
---
- hosts: db1gather_facts: falsevars_files:- user_list.txttasks:- template: src=ee.j2 dest=/home/yurq/for-2.txt
[root@node-137 ansible]# ansible-playbook for-2.ymlPLAY [db1] ****************************************************************************************************************************TASK [template] ***********************************************************************************************************************
ok: [node-138]PLAY RECAP ****************************************************************************************************************************
node-138                   : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0[root@node-137 ansible]# ansible db1 -m shell -a "cat /home/yurq/for-2.txt"
node-138 | CHANGED | rc=0 >>
tom
jerry
jacky

33.3 handlers

Handlers是Ansible Playbooks中的一种特殊任务类型。它们类似于事件处理程序,用于在特定条件下触发和执行任务。Handlers通常与任务关联,当任务的状态发生变化时,Handlers会被触发执行。Handlers可以用于执行各种操作,如重启服务、重新加载配置文件等。

1.handlers是ansible提供的条件机制之一,handlers和tasks很类似,但是只在被tasks通知的时候才会触发执行;
2.handlers只会在任务执行完成后执行。即使被通知了很多次,也只会执行一次。
3.当一个tasks中有多个notify,只会执行最后一个。
4.当tasks所有需要执行的任务执行完毕,才会执行handlers中的任务,并非跳转执行

[root@node-137 ansible]# cat hand-1.yml
---
- hosts: db1gather_facts: falsevars:myport: 8080tasks:- template: src=httpd.conf1.j2 dest=/etc/httpd/conf/httpd.confnotify: stop httpd1- shell: "systemctl is-active httpd"ignore_errors: trueregister: a- debug: msg={{a.rc}}- service: name=httpd state=started- shell: "systemctl is-active httpd"register: b- debug: msg={{b.rc}}handlers:- name: stop httpd1service: name=httpd state=stopped
- hosts: db1gather_facts: falsetasks:- shell: "systemctl is-active httpd"ignore_errors: trueregister: a- debug: msg={{a.rc}}
[root@node-137 ansible]# ansible-playbook hand-1.ymlPLAY [db1] ****************************************************************************************************************************TASK [template] ***********************************************************************************************************************
changed: [node-138]TASK [shell] **************************************************************************************************************************
fatal: [node-138]: FAILED! => {"changed": true, "cmd": "systemctl is-active httpd", "delta": "0:00:00.037178", "end": "2023-12-21 16:20:43.782274", "msg": "non-zero return code", "rc": 3, "start": "2023-12-21 16:20:43.745096", "stderr": "", "stderr_lines": [], "stdout": "unknown", "stdout_lines": ["unknown"]}
...ignoringTASK [debug] **************************************************************************************************************************
ok: [node-138] => {"msg": "3"
}TASK [service] ************************************************************************************************************************
changed: [node-138]TASK [shell] **************************************************************************************************************************
changed: [node-138]TASK [debug] **************************************************************************************************************************
ok: [node-138] => {"msg": "0"
}RUNNING HANDLER [stop httpd1] *********************************************************************************************************
changed: [node-138]PLAY [db1] ****************************************************************************************************************************TASK [shell] **************************************************************************************************************************
fatal: [node-138]: FAILED! => {"changed": true, "cmd": "systemctl is-active httpd", "delta": "0:00:00.034846", "end": "2023-12-21 16:20:48.079788", "msg": "non-zero return code", "rc": 3, "start": "2023-12-21 16:20:48.044942", "stderr": "", "stderr_lines": [], "stdout": "unknown", "stdout_lines": ["unknown"]}
...ignoringTASK [debug] **************************************************************************************************************************
ok: [node-138] => {"msg": "3"
}PLAY RECAP ****************************************************************************************************************************
node-138                   : ok=9    changed=6    unreachable=0    failed=0    skipped=0    rescued=0    ignored=2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/236587.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

未来仓储新玩法小空间做大文章

身处智能消费时代的大家都应该有深刻感受,物流速度在逐年增快。根据国家邮政局预估,2020 年快递业务吞吐量超 740 亿件,同比增长 18%。 面对日益增加的商品交付量,不得不重新定义产品分销方式,从而满足当今互联网消费…

从零开始学HBase:打造你的大数据技能库!

介绍:HBase是一个分布式的、面向列的开源数据库,源于Fay Chang所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。类似于Bigtable利用了Google文件系统(File System)提供的分布式数据存储,H…

<八>JavaScript中的对象及对像的增删改查

使用基本数据变量所创建的变量都是独立的,不能成为一个整体,对象属于复合型的数据类型,在对象中可以保存多个不同的数据类型的属性。 一、对象的分类 1.1内建对象 由ES标准中定义的对象 比如:Match、String、Number、Boolean、…

【Qt】Qt Creator 警告: Unused parameter ‘xxx‘

1. 问题 Qt开发中,有些函数参数没有使用,会报Unused parameter xxx警告,这个警告不影响代码正常运行。 2. 屏蔽这个警告的方法 2.1 方法1 函数中添加 Q_UNUSED(arg); TestClass::TestClass(QObject *parent) {Q_UNUSED(parent); }2.2 方…

【AI-2】深度学习框架详解

目前,有许多流行的深度学习框架可供选择,下面列举一些常见的深度学习框架: TensorFlow(Google) TensorFlow:由Google开发的开源深度学习框架,提供了丰富的工具和库,支持各种深度学…

IP查询类API接口查询,含各精度IP归属地查询接口

IP查询 IP归属地-IPv4高精版:根据IP地址查询归属地信息,支持到中国地区(不含港台地区)街道级别,包含国家、省、市、区县、详细地址和运营商等信息。IP归属地-IPv4区县级:根据IP地址查询归属地信息&#xf…

华为atlas300安装教程

1、安装包位置: /data/ai_install_packages 2、添加HwHiAiUser用户: groupadd -g 1000 HwHiAiUser useradd -g HwHiAiUser -u 1000 -d /home/HwHiAiUser -m HwHiAiUser -s /bin/bash 3、安装驱动: ./Ascend-hdk-310p-npu-driver_6.0.0_l…

前端FLV视频直播解决方案

项目背景: 1. 后台给出一个地址,持续不断的推送flv视频流。 2.前端需要接收视频流,并寻找合适的播放插件。 一开始: 其实用的是xgplayer(西瓜视频)。 官网地址:西瓜播放器 使用的是直播&a…

【10大专题,2.8w字详解】:从张量开始到GPT的《动手学深度学习》要点笔记

《动手学深度学习PyTorch版》复习要点全记录 📘 🎯 专注于查漏补缺、巩固基础,这份笔记将带你深入理解深度学习的核心概念。通过一系列精心整理的小专题,逐步构建起你的AI知识框架。 🧠 从最基础的张量操作&#xff0c…

DELL MD3600F更换控制器电池

1、存储左上角闪红灯,管理软件提示控制器1电池故障,需取出控制器更换上新电池。 2、通过管理软件确认两个控制器编号;确认到下面的是控制器1 3、拔掉控制器上插的线(SAS线、网线、光纤线),打好标签&#xf…

外贸SEO建站系统有哪些?海洋建站的优势?

外贸SEO建站怎么做比较好?如何做谷歌独立站SEO优化? 外贸企业越来越需要建立自己的在线形象,以吸引更多的潜在客户。而要实现这一目标,外贸SEO建站系统是一种非常有效的手段。那么,外贸SEO建站系统有哪些呢&#xff1…

常见 平滑函数

平滑函数是指具有较为连续和缓和性质的数学函数。这类函数通常在局部小范围内变化不大,避免了突变或者急剧的波动。以下是一些常见的平滑函数: 高斯函数(Gaussian Function) 高斯函数是一种常见的平滑函数,具有钟形曲…

LeetCode day28

LeetCode day28 由于一点小意外,今天就来搞搞滑动窗口(ง •_•)ง 1423. 可获得的最大点数 几张卡牌 排成一行,每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出。 每次行动,你可以从行的开头或者末尾拿一张卡牌,…

五、从0开始卷出一个新项目瑞萨RZN2L之RZT2L BaseProject coremark的移植

感谢来自b站热心帅气的同学分享的RZT2L移植经验总结的md文档 1 需要注意的小点 1.1 使用Flash运行调试前,新板子需要erase 1.2 在线debug,需要修改startup.c 2 coremark工程建立 2.1 工程创建 2.2 src 用户c代码移植 2.3 debug调试 …

HAL TIM2的PWM

main函数跑下面代码就行 懂的就懂,不讲原理,自己看 MX_TIM2_Init(7,999);__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,500);__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_2,500);__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_3,500);__HAL_TIM_…

<sa8650>sa8650 qcxser-之-串行解串器ADC使用

<sa8650>sa8650 qcxser-之-串行解串器GPIO输入输出 <sa8650>sa8650 qcxser-之-串行解串器GPIO的map <sa8650>sa8650 qcxser-之-串行解串器ERRB的map <sa8650>sa8650 qcxser-之-串行解串器ADC使用 <sa8650>sa8650 qcxser-之-串行解串器ADC使用 一 前言二 ADC配置三 验…

SpringBoot数据校验

后端在进行数据请求时,通常会校验前端传递过来的参数是否是空值或者是null。通常会通过if判断值是否满足条件,不满足就返回。但如果前端传递的是表单,那么要进行判断的条件就比较多了,太多的if会让代码变得臃肿,而且也…

DshanMCU-R128s2芯片手册与资料

CPU手册 Arm Cortex-M33 核心手册: Arm Cortex-M33 Processor Technical Reference ManualXuanTie C906 核心手册:T-Head XuanTie C906 Processor Datasheet DSP 相关 HIFI 5 DSP 相关:HiFi 5 DSPXtensa Xplorer 下载地址:Xplo…

【python】进阶--->网络编程(一)

一、网络编程 网络 : 为了联络多方然后进行通信,将数据从一方传递给另一方. 网络协议 : 不同计算机只需要通过联网,那么就可以相互进行传递数据,那么不同种类的计算机之间就和不同语言的人之间沟通一样,需要一种大家都认可都遵循的协议即可. 那么计算机都遵循的网络通信协议叫…

apache poi_5.2.5 实现对表格单元格的自定义变量名进行图片替换

apache poi_5.2.5 实现对表格单元格的自定义变量名进行图片替换 实现思路 1.首先定位到自定义变量名 2.然后先清除自定义变量名,可利用setText(null,0)来清除 3.在自定义变量名的位置添加图片,使用下面的代码 4.对于图片布局有要求的,利用C…