第三十七天:playbook Template 模板

news/2024/5/18 21:27:03

模板是一个文本文件,可以用于根据每个主机的不同环境而为生成不同的文件

模板文件中支持嵌套jinja2语言的指令,来实现变量,条件判断,循环等功能
需要使用template模块实现文件的复制到远程主机,但和copy模块不同,复制过去的文件每个主机可以会有所不同
一、jinja2语言
Jinja2 是一个现代的,设计者友好的,仿照 Django 模板的 Python 模板语言。 它速度快,被广泛使用,并且提供了可选的沙箱模板执行环境保证安全:
特性:
  沙箱中执行
  强大的 HTML 自动转义系统保护系统免受 XSS
  模板继承
  及时编译最优的 python 代码
  可选提前编译模板的时间
  易于调试。异常的行数直接指向模板中的对应行。
  可配置的语法
官方网站:
http://jinja.pocoo.org/
https://jinja.palletsprojects.com/en/2.11.x/
http://docs.jinkan.org/docs/jinja2/
https://www.w3cschool.cn/yshfid/
jinja2 语言支持多种数据类型和操作:
字面量,如: 字符串:使用单引号或双引号,数字:整数,浮点数
列表:[item1, item2, ...]
元组:(item1, item2, ...)
字典:{key1:value1, key2:value2, ...}
布尔型:true/false
算术运算:+, -, *, /, //, %, **
比较操作:==, !=, >, >=, <, <=
逻辑运算:and,or,not
流表达式:For,If,When
字面量:
表达式最简单的形式就是字面量。字面量表示诸如字符串和数值的 Python 对象。如"Hello World"
双引号或单引号中间的一切都是字符串。无论何时你需要在模板中使用一个字符串(比如函数调用、过
滤器或只是包含或继承一个模板的参数),如42,42.23
数值可以为整数和浮点数。如果有小数点,则为浮点数,否则为整数。在 Python 里, 42 和 42.0 是不
一样的
算术运算:
Jinja 允许用计算值。支持下面的运算符
+:把两个对象加到一起。通常对象是素质,但是如果两者是字符串或列表,你可以用这 种方式来衔接
它们。无论如何这不是首选的连接字符串的方式!连接字符串见 ~ 运算符。 {{ 1 + 1 }} 等于 2
-:用第一个数减去第二个数。 {{ 3 - 2 }} 等于 1
/:对两个数做除法。返回值会是一个浮点数。 {{ 1 / 2 }} 等于 0.5
//:对两个数做除法,返回整数商。 {{ 20 // 7 }} 等于 2
%:计算整数除法的余数。 {{ 11 % 7 }} 等于 4
*:用右边的数乘左边的操作数。 {{ 2 * 2 }} 会返回 4 。也可以用于重 复一个字符串多次。 {{ '=' * 80 }}
会打印 80 个等号的横条\
**:取左操作数的右操作数次幂。 {{ 2**3 }} 会返回 8
比较操作符
== 比较两个对象是否相等
!= 比较两个对象是否不等
> 如果左边大于右边,返回 true
>= 如果左边大于等于右边,返回 true
< 如果左边小于右边,返回 true
<= 如果左边小于等于右边,返回 true
逻辑运算符
对于 if 语句,在 for 过滤或 if 表达式中,它可以用于联合多个表达式
and 如果左操作数和右操作数同为真,返回 true
or 如果左操作数和右操作数有一个为真,返回 true
not 对一个表达式取反
(expr)表达式组
true / false true 永远是 true ,而 false 始终是 false
二、template
template功能:可以根据和参考模块文件,动态生成相类似的配置文件
template文件存建议放于templates目录下,且命名为 .j2 结尾
yaml/yml 文件和templates目录平级,此时playbook中指定模版文件时可不用指定路径, 目录结构如下
示例:
 ./├── temnginx.yml└── templates        └── nginx.conf.j2

三、template中使用流程控制 for 和 if

template中也可以使用流程控制 for 循环和 if 条件判断,实现动态生成文件功能
(1) for 循环
格式
{% for i in EXPR %}...
{% endfor %}
#示例:
{% for i in range(1,10) %}server_name web{{i}};
{% endfor %}
(2) if 条件判断
在模版文件中还可以使用 if条件判断,决定是否生成相关的配置信息
#templnginx6.yml
- hosts: websrvsremote_user: rootvars:  nginx_vhosts:    - web1:      listen: 8080      root: "/var/www/nginx/web1/"    - web2:      listen: 8080      server_name: "web2.wang.org"      root: "/var/www/nginx/web2/"    - web3:      listen: 8080      server_name: "web3.wang.org"      root: "/var/www/nginx/web3/"tasks:  - name: template config to     template: src=nginx.conf5.j2 dest=/data/nginx5.conf                  
#templates/nginx.conf6.j2
{% for vhost in nginx_vhosts %}
server {  listen {{ vhost.listen }}  {% if vhost.server_name is defined %}
server_name {{ vhost.server_name }}   #注意缩进  {% endif %}
root  {{ vhost.root }}                #注意缩进
}
{% endfor %}
 四、使用循环迭代
迭代:当有需要重复性执行的任务时,可以使用迭代机制
1、迭代 loop (with_items)
对迭代项的引用,固定内置变量名为"item"
要在task中使用with_items给定要迭代的元素列表
注意: ansible2.5版本后,可以用loop代替with_items
列表元素格式:
  - 字符串
  - 字典
范例
---
- hosts: websrvsremote_user: root tasks:   - name: add several users    user: name={{ item }} state=present groups=wheel    with_items:       - testuser1       - testuser2       - testuser3       
#上面语句的功能等同于下面的语句   - name: add several users    user: name=testuser1 state=present groups=wheel   - name: add several users    user: name=testuser2 state=present groups=wheel   - name: add several users    user: name=testuser3 state=present groups=wheel

2、迭代嵌套子变量

在迭代中,还可以嵌套子变量,关联多个变量在一起使用
---
- hosts: websrvsremote_user: root
tasks:  - name: add some groups    group: name={{ item }} state=present    with_items:      - nginx      - mysql      - apache  - name: add some users    user: name={{ item.user }} group={{ item.group }} uid={{item.uid}}
state=present    with_items:      - { user: 'nginx', group: 'nginx',uid: "80" }      - { user: 'mysql', group: 'mysql' ,uid: "3306"}      - { user: 'apache', group: 'apache',uid: "8080"}

3、until 循环

#until为false时才会执行循环,为true则退出循环
[root@ansible ansible]#cat until.yml 
- hosts: localhostgather_facts: falsetasks:   - debug: msg="until"     until: false    retries: 3 #默认值即为3次    delay: 1
[root@ansible ansible]#ansible-playbook until.yml

4、with_lines 逐行处理

[root@ansible ansible]#cat with_lines.yml
- hosts: localhosttasks:   - debug: msg={{ item }}    with_lines: ps aux

五、条件判断 when

when语句可以实现条件测试。如果需要根据变量、facts或此前任务的执行结果来做为某task执行与否
的前提时要用到条件测试,通过在task后添加when子句即可使用jinja2的语法格式条件测试
范例:条件判断
---
- hosts: websrvsremote_user: roottasks:  - name: "shutdown RedHat flavored systems"    command: /sbin/shutdown -h now    when: ansible_os_family == "RedHat"

六、分组 block

当想在满足同样条件下,执行多个任务时,就需要分组。而不再针对每个任务都是用 when
[root@ansible ansible]#cat block.yml
---
- hosts: localhost tasks:   - block:       - debug: msg="first"       - debug: msg="second"    when:       - ansible_facts['distribution'] == "CentOS"       - ansible_facts['distribution_major_version'] == "8"

七、changed_when

1、关闭 changed 状态
当确定某个task不会对被控制端做修改时但执行结果却显示是黄色的changed状态,可以通过changed_when: false 关闭changed状态
[root@ansible ansible]#cat test_changed.yml
---
- hosts: websrvs tasks:    - name: check sshd service    shell: ps aux| grep sshd    changed_when: false  #关闭changed状态

2、利用 changed_when 检查task返回结果

changed_when 检查task返回结果,决定是否继续向下执行
[root@ansible ansible]#cat test_changed_when.yml
---
- hosts: websrvstasks:  - name: install nginx    yum: name=ng
- name: config file    template: src="nginx.conf.j2" dest="/etc/nginx/nginx.conf"    notify: restart nginx  - name: check config    shell: /usr/sbin/nginx -t    register: check_nginx_config     changed_when:      - check_nginx_config.stdout.find('successful') #如果执行结果中有successful
字符串,则继续执行,如果没有则停止向下执行      - false        #nginx -t 每次成功执行是changed状态,关闭此changed状态  - name: start service    service: name=nginx state=started enabled=yeshandlers:  - name: restart nginx    service: name=nginx state=restarted

八、滚动执行

管理节点过多导致的超时问题解决方法
默认情况下,Ansible将尝试并行管理playbook中所有的机器。对于滚动更新用例,可以使用serial关键
字定义Ansible一次应管理多少主机,还可以将serial关键字指定为百分比,表示每次并行执行的主机数
占总数的比例
范例:
#vim test_serial.yml
---
- hosts: allserial: 2  #每次只同时处理2个主机,将所有task执行完成后,再选下2个主机再执行所有task,直至所
有主机gather_facts: Falsetasks:  - name: task onecomand: hostname  - name: task two    command: hostname

九、委派至其它主机执行

利用委托技术,可以在非当前被控主机的其它主机上执行指定操作
范例: 将任务委派给指定的主机执行
[root@ansible ~]#cat delegate.yml 
#在10.0.0.8上执行hostname -I,而非当前主机localhost
- hosts: localhost tasks:  - name: show ip address     command: hostname -I    delegate_to: 10.0.0.8 #指定当前任务被委派给的目标主机    delegate_facts: true #收集被委派的目标主机的facts信息

十、只执行一次

利用 run_once 指令可以只执行一次,而非在所有被控主机都执行
[root@ansible ~]#cat run_once.yml 
- hosts: websrvstasks:   - command: hostname    run_once: true
[root@ansible ~]#ansible-playbook run_once.yml --list-hosts

十一、环境变量

临时修改环境变量
[root@ansible ~]#cat environment.yml
- hosts: localhosttasks:   - shell: echo $PATH    environment:      PATH: /usr/local/app/bin:{{ ansible_env.PATH }}
[root@ansible ~]#ansible-playbook environment.yml -v

十二、Yaml 文件的相互调用

1、include
利用include 或 include_tasks 可以在某个task中调用其它的只有task内容的yaml文件
[root@ansible ansible]#cat a.yml 
---
- hosts: websrvs tasks:  - name: run a job    command: wall run a job  - name: excute b.yml    include: b.yml    #调用另一个yaml文件     #include_tasks: b.yml #另一种写法
[root@ansible ansible]#cat b.yml 
- name: run b jobcommand: wall run b job

2、import_playbook

还可以将多个包含完整内容的yml文件由一个yml统一调用
[root@ansible ansible]#cat main.yml 
- import_playbook: tasks1.yml
- import_playbook: tasks2.yml
[root@ansible ansible]#cat tasks1.yml

 

 
 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

Phone List

题目描述输入格式输出格式样例 样例输入 2 3 911 97625999 91125426 5 113 12340 123440 12345 98346 样例输出 NO YES 数据范围与提示这道题的三条判断是否存在前缀的标准:当在建树字符串已经到结尾时,如果该点有结束标记,那肯定是前缀(不是真前缀)当在建树字符串已经到结…

SSM教务管理系统设计与实现(附源码下载地址)

@目录01 项目背景02 使用技术03 运行环境04 功能分析05 数据库设计06 项目工程结构07 部分功能展示及源码7.1 登录页7.2 管理员端--首页7.3 管理员端--课程管理7.4 管理员端--学生管理7.5 教师端--首页7.6 教师端--个人信息7.7 学生端--已修课程7.8 学生端--公告管理08 运行教程…

AutoCAD C# 两不平行直线倒圆弧算法

参考的博客:https://www.cnblogs.com/JJBox/p/14300098.html 下面是计算示例主要计算代码:var peo = new PromptEntityOptions("选择直线1"){AllowNone = false,AllowObjectOnLockedLayer = false};peo.SetRejectMessage("请选择直线Line");peo.AddAllow…

挖矿流量分析之Stratum挖矿协议

目录前言区块链和挖矿相关概念挖矿木马挖矿协议StratumStratum工作过程 前言 之前做了一个关于“挖矿行为检测”的大创训练项目,在这里记录一下我关于挖矿检测相关内容的学习。 区块链和挖矿相关概念 区块链 首先需要了解一些关于区块链的内容。注意,区块链和挖矿是两个紧密相…

sublime设置默认打开侧边栏(失败)

描述 每次使用sublime打开某个目录,总是不显示侧边栏,还得手动打开。 过程 在设置里找了半天似乎没有这个选项,有点离谱,网上搜到的全是手动打开侧边栏。看来只能Ctrl+KB按得勤快些了。// Display the toggle sidebar button in the status bar"show_sidebar_button&q…

C++模板

C++模板 C++是一个面向对象编程的语言,提供了类的继承和组合机制,虽然在层次结构上很简单,但使用起来非常糟糕。C++使用关键字template,告诉编译器声明的类或者对象是一个模板。模板不是像继承和组合那样重用目标代码,而是重用源代码。容器不再包含名为 Object 的泛型基类…

Matlab安装教程(Linux)

解压安装包 在虚拟机中,文件直接通过拖拽文件的方式将安装包拉入虚拟机时,文件通常存放在/tmp/VMwareDnD中,因此需要将存放文件位置的文件转移到/home/<用户名>/<存放目录>中 参考命令如下: mv /tmp/VMwareDnD/<文件存放目录>/* /home/<用户名>/&l…

2. 基础配置

1. 配置文件格式 1.1 配置文件自动提示功能消失解决方案 ​​ 1.2 SpringBoot配置文件加载顺序(了解) application.properties > application.yml > application.yaml 1.3 注意事项 SpringBoot核心配置文件名为application SpringBoot内置属性过多,且所有属性集中…