【星海出品】ansible入门(三) 深入playbook

news/2024/12/2 20:50:14/

Ansible playbook常用到模板驱动jinja2
都是python编写的。Jinja2 需要至少 Python 2.4 版本来运行。

jinja2过滤器
Jinja2中的过滤器可以把一个模板表达式转换为另一个.Jinja2附带了很多这样的功能。

jinja2源码
https://github.com/pallets/jinja/blob/main/

基本 API 使用

>>> from jinja2 import Template
>>> template = Template('Hello {{ name }}!')
>>> template.render(name='John Doe')
u'Hello John Doe!'

通过创建一个 Template 的实例,你会得到一个新的模板对象,提供一 个名为 render() 的方法
该方法在有字典或关键字参数时调用 扩充模板。字典或关键字参数会被传递到模板,即模板“上下文”。

渲染一个html

from jinja2 import PackageLoader,Environment
env = Environment(loader=PackageLoader('python_project','templates'))    # 创建一个包加载器对 
#PackageLoader()的两个参数为:python包的名称,以及模板目录名称。
template = env.get_template('bast.html')    # 获取一个模板文件
template.render(name='daxin',age=18)   # 渲染

jinja2是如何直接使用过滤器? 只需要在变量后面使用管道(|)分割,多个过滤器可以链式调用,前一个过滤器的输出会作为后一个过滤器的输入。

{{ 'abc' | captialize  }}
# Abc{{ 'abc' | upper  }}
# ABC{{ 'hello world' | title  }}
# Hello World{{ "hello world" | replace('world','daxin') | upper }}
# HELLO DAXIN{{ 18.18 | round | int }}
# 18

对列表和字典进行递归,生成模板

<ul>
{% for user in users %}
<li>{{ user.username|title }}</li>
{% endfor %}
</ul><dl>
{% for key, value in my_dict.iteritems() %}
<dt>{{ key }}</dt>
<dd>{{ value}}</dd>
{% endfor %}
</dl>

cat for-if.yml

        - hosts: myhostsremote_user: rootvars:hosts:- {listen_port: 8080,web: nginx1,name: web1.fz.com}- {listen_port: 8081,web: nginx2,name: web2.fz.com}- {listen_port: 8082,web: nginx3}tasks:- name: for-iftemplate: src=for-if.j2 dest=/root/for-if

cat templates/for-if.j2

        {% for host in hosts %}server{listen: {{host.listen_port}};{%if host.name is defined%}name: {{host.name}};{%endif%}web: {{host.web}};}{%endfor%}

#defined是找到的意思,也可以添加else

{% if variable is defined %}value of variable: {{ variable }}
{% else %}variable is not defined
{% endif %}

在vars.yml文件中定义变量

hi: hello
wd: world

编写playbook:

- hosts: myhostsremote_user: rootvars_files:- vars.ymltasks:- name: create filefile: name=/root/{{ hi }}-{{ wd }}.log state=touch

Ansible提供了notify指令和handlers功能。
如果在某个task中定义了notify指令,当Ansible在监控到该任务 changed=1时,会触发该notify指令所定义的handler,然后去执行handler。所谓handler,其实就是task

cat httpd.yml 
---
- name: play1hosts: allremote_user: rootgather_facts: falsetasks:- name: install httpdyum: name=httpd state=installed- name: copy httpd configcopy: src=/etc/httpd/conf/httpd.conf  dest=/etc/httpd/conf/httpd.confnotify:- restart httpd- name: start httpdservice: name=httpd state=started enabled=truehandlers:- name: restart httpdservice: name=httpd state=restarted
#这里只要对httpd.conf配置文件作出了修改,修改后需要重启生效,在tasks中定义了restart httpd这个action,然后在handlers中引用上面tasks中定义的notify。

ansible实现循环

[root@ansible-test1 ansible]# cat while.ymlhosts: testhost
user: root
tasks:name: change mode for filesfile: path=/tmp/{{ item }} mode=600with_items:1.txt2.txt3.txt执行while.yml。
[root@ansible-test1 ansible]# ansible-playbook while.yml

#说明: with_items为循环的对象

ansible条件判断
when的值是一个条件表达式,如果条件判断成立,这个task就执行,如果判断不成立,则task不执行。

---
- hosts: mysql
- remote_user: roottasks:- name: "shutdown C6 systems"command: /sbin/shutdown -t nowwhen: (ansible_distribution == CentOS and ansible_distribution_major_version == "6") or(ansible_distribution == CentOS and ansible_distribution_major_version == "7")

role风格的入口

- hosts: 192.168.0.2remote_user: rootgather_facts: falseroles:- nginx- hosts: testremote_user: rootgather_facts: falseroles:- mysql

如果想要有区别的执行,而不是全部执行,可以加tag标记

role风格的排版
在这里插入图片描述

仿写playbook,可参照其他作者的该文章
https://www.bilibili.com/read/cv24358297/


http://www.ppmy.cn/news/1140118.html

相关文章

数字人直播软件排名推荐,铭顺科技数字人品牌抢占“日不落”流量新技能

在今年的618中&#xff0c;相信大家能明显感受到&#xff0c;现如今已经有越来越多的品牌商都在使用AI营销工具&#xff0c;如AI营销工具、AI电话、AI虚拟主播。据京东战报显示&#xff0c;在今年的618中&#xff0c;使用AI数字人直播比去年双11增幅近5倍。 7*24小时不间断直播…

vue3前端开发-flex布局篇

文章目录 1.传统布局与flex布局优缺点传统布局flex布局建议 2. flex布局原理2.1 布局原理 3. flex常见属性3.1 父项常见属性3.2 子项常见属性 4.案例实战(携程网首页) 1.传统布局与flex布局优缺点 传统布局 兼容性好布局繁琐局限性&#xff0c;不能再移动端很好的布局 flex布…

吃鸡达人必备!超实用干货激爽分享!

大家好&#xff01;作为一名专业吃鸡行家&#xff0c;今天我将为大家分享一些关于提高游戏战斗力和分享顶级游戏作战干货的秘诀&#xff0c;还有一些方便吃鸡作图、装备皮肤库存展示和查询的技巧&#xff01; 首先&#xff0c;让我们来介绍一些吃鸡作图工具推荐。无论是新手还是…

华为云云耀云服务器L实例评测|部署私有网盘 Nextcloud

华为云云耀云服务器L实例评测&#xff5c;部署私有网盘 Nextcloud 一、云耀云服务器L实例介绍1.1 云服务器介绍1.2 产品规格1.3 应用场景 二、云耀云服务器L实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置 三、部署 Nextcloud3.1 Nextcloud 介绍3.2 Docker 环境搭建3.3 Nex…

ElasticSearch新增IK扩展词后,让历史数据生效方法

ElasticSearch新增IK扩展词后,让历史数据生效方法 一、前言 ES词库新增一个关键词、同义词、简繁体和停止词之后&#xff0c;发现只有新数据进入到索引才会生效&#xff0c;对于之前已经存储到索引的数据&#xff0c;还是按照之前的方式来做分词&#xff0c;这个问题应该如何…

数据库:Hive转Presto(三)

继续上节代码。 import re import os import tkinter.filedialog from tkinter import *class Hive2Presto:def __int__(self):self.t_funcs [substr, nvl, substring, unix_timestamp] \[to_date, concat, sum, avg, abs, year, month, ceiling, floor]self.time_funcs [d…

JS逆向实战23——某市wss URL加密+请求头+ws收发

声明 本文章中所有内容仅供学习交流&#xff0c;抓包内容、敏感网址、数据接口均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c;若有侵权&#xff0c;请联系我立即删除&#xff01; 本文首发链接为: https://…

嵌入式养成计划-35------C++绪论------C++数据类型------array容器------命名空间

七十三、 工具QT 73.1 安装步骤 73.2 什么是 Qt Qt 是一个跨平台的 C图形用户界面应用程序框架。 它为应用程序开发者提供建立艺术级图形界面所需的所有功能。 它是完全面向对象的&#xff0c;很容易扩展&#xff0c;并且允许真正的组件编程。 73.3 Qt 的优点 跨平台&…