飞天使-linux操作的一些技巧与知识点6-ansible结合jinja2使用,可规范化进行自动化管控

文章目录

        • 在议playbook
        • 虚拟环境中安装ansible
        • playbook 结合变量的一些演示
          • 普通的vars_files 变量,在同级目录创建目录
          • 使用host_vars 定义变量
          • group_vars定义变量
          • 根据不同系统操作不同版本
          • 传递多个外置变量
          • 举例几个不同的示例
          • facts
          • when
          • loop
          • handlers 与 notify
          • tags 任务标签
          • 异常处理
            • nginx 的异常处理
          • jinja2
          • roles
            • roles 示范

在议playbook
主要是使用不同的模块进行编排
如果格式有问题,找chatgpt调整下格式输出就可以
缺点是比较死板,不能成体系 
虚拟环境中安装ansible
要在CentOS 7系统上让Ansible使用Python 3,你可以按照以下步骤进行操作:确认你的CentOS 7系统已安装Python 3。你可以通过在终端中运行python3 --version命令来检查是否已安装Python 3。安装Python 3的pip包管理工具。在CentOS 7上,你可以使用以下命令安装:sudo yum install python3-pip
安装python3-devel软件包以支持Python 3的开发库。运行以下命令进行安装:
sudo yum install python3-devel
创建一个Python 3虚拟环境(可选)。虚拟环境可以帮助你隔离Ansible所需的Python包与系统级安装的Python包。使用以下命令创建虚拟环境:
python3 -m venv ansible-env
激活虚拟环境:source ansible-env/bin/activate
安装Ansible和所需的Python包。在虚拟环境中运行以下命令:
pip install ansible
配置Ansible以使用Python 3。打开/etc/ansible/ansible.cfg文件,并找到以下行:
# interpreter_python = auto_silent
取消注释并将其更改为以下内容:interpreter_python = /usr/bin/python3
确认Ansible使用Python 3。运行以下命令来检查:
ansible --version
playbook 结合变量的一些演示
普通的vars_files 变量,在同级目录创建目录
- hosts: webserversvars_files:- ./test.ymltasks:- name: Output Varsdebug:msg:- "{{ http_packages }}"- "{{ db_packages }}"$cat test.yml
test: ansible_vars_files
http_packages: 123
db_packages: 123r返回结果
=> {"msg": [123,null]
}
注意: test.yml 一定要有这个变量,哪怕为空,否则报错test.yml 可以被多个playbook 引用vars_files:- ./test.yml
使用host_vars 定义变量
hosts 配置文件为 
[webservers]
1.1.1.1 aaa=2 bbb=master[webservers:vars]
port=80---
- hosts: webserverstasks:- name: output variablesdebug:msg: "{{ aaa }} {{ bbb }} {{ port }}"> {"msg": "2 master 80"
}
group_vars定义变量
在项目目录中创建 group_vars 目录,然后在创建一个文件,文件的文件名称要与
inventory 清单中的组名称保持完全一致;在 group_vars 目录中创建 webservers 文件,为 webservers 主机组设定变
量;"msg": [11,22]
}$cat group_vars/all
web: 11
web1: 22
(ansible-env)$cat t5.yml
- hosts: webserverstasks:- name: Output Vaiables"debug:msg:- "{{ web }}"- "{{ web1 }}"
根据不同系统操作不同版本

注意 www 用户是有sudo 权限 ---
- hosts: webserversbecome: yesbecome_user: wwwtasks:# 通过fact变量判断系统为centos才会安装httpd- name: Centos Install httpdyum: name=httpd state=presentwhen: (ansible_distribution == "CentOS")# 通过fact变量判断系统为ubuntu才会安装httpd2- name: Ubuntu Install httpdyum: name=httpd2 state=presentwhen: (ansible_distribution == "Ubuntu")
传递多个外置变量
ansible-playbook f5.yml -i hosts -e
"web_packages=GeoIP" -e "ftp_packages=telnet"
举例几个不同的示例
- hosts: alltasks:- name:shell: netstat -lntpregister: System_Status- name: Get System Statusdebug: msg={{System_Status.stdout_lines}}
- hosts: webserverstasks:- name: Output variables ansible factsdebug:msg: >this default IPv4 address "{{ ansible_fqdn}}" is "{{ ansible_default_ipv4.address }}"- hosts: alltasks:- name: Ignore Falsecommand: /bin/falseignore_errors: yes- name: touch new filefile: path=/tmp/old state=touch
facts
用来采集客户端信息,
ansible localhost -m setup -a "filter="ansible_default_ipv4""
when
when 判断在 Ansible 中的使用频率非常高;比如 yum 模块可以自动检测软件包是
否已被安装,而无需人为干涉,但对于有些任务则是需要进行判断才可以实现的。
比如: web 节点都需要配置 nginx 仓库,但其他节点并不需要,此时就会用到
when 判断。
比如: Centos 与 Ubuntu 都需要安装 Apache ,而 Centos 系统软件包为
httpd ,而 Ubuntu 系统软件包为 httpd2 ,那么此时就需要判断主机系统,然
后为不同的主机系统安装不同的软件包。hen: (ansible_hostname is match("web*"))
主机名不为web的不做任何处理
loop
loop 是重复
- hosts: web
tasks:
- name: Add Users
user:
name: {{ item.name }}
groups: {{ item.groups }}
state: present
loop:
- { name: 'testuser1', groups: 'bin' }
- { name: 'testuser2', groups: 'root' }- hosts: all
tasks:
- name: Configure Rsync Server
copy: src={{ item.src }} dest=/etc/{{ item.dest }} mode={{
item.mode }}
with_items:
- {src: "rsyncd.conf", dest: "rsyncd.conf", mode: "0644"}
- {src: "rsync.passwd", dest: "rsync.passwd", mode:
"0600"}
handlers 与 notify
Handlers 是一个触发器,同时是一个特殊的 tasks ,它无法直接运行,它需要被
tasks 通知后才会运行。比如: httpd 服务配置文件发生变更,我们则可通过
Notify 通知给指定的 handlers 触发器,然后执行相应重启服务的操作,如果配
置文件不发生变更操作,则不会触发 Handlers 任务的执行;如果配置文件发生变化会调用该handlers下面的对应名称的task
handlers:- name: Restart Httpd Serverservice: name=httpd state=restartedhandlers 注意事项
1.无论多少个 task 通知了相同的 handlers , handlers 仅会在所有
tasks 结束后运行一次。
2.只有 task 发生改变了才会通知 handlers ,没有改变则不会触发
handlers
3.不能使用 handlers 替代 tasks 、因为 handlers 是一个特殊的 tasks
tags 任务标签
默认情况下, Ansible 在执行一个 playbook 时,会执行 playbook 中所有的任
务。而标签功能是用来指定要运行 playbook 中的某个特定的任务;
1.为 playbook 添加标签的方式有如下几种:
对一个 task 打一个标签
对一个 task 打多个标签
对多个 task 打一个标签
2. task 打完标签使用的几种方式
-t 执行指定tag标签对应的任务
--skip-tags 执行除 --skip-tags 标签之外的所有任务ansible-playbook --skip-tags install_server
xxx.yml标签结合include  
[root@ansible ~]# cat main.yml
- hosts: localhost
tasks:
- name: Installed Tomcat8 Version
include: install_tomcat8.yml
tags: tomcat8
- name: Installed Tomcat9 Version
include: install_tomcat9.yml
tags: tomcat9
异常处理
- hosts: webserverstasks:- name: configure httpd servertemplate:src: ./httpd.conf.j2dest: /etc/httpd/conf/httpd.confnotify: Restart Httpd Server- name: Check HTTPDshell: /usr/sbin/httpd -tregister: httpd_checkfailed_when: httpd_check.rc != 0 or '"OK"' not in httpd_check.stdout- name: start httpd serverservice:name: httpdstate: startedenabled: yeshandlers:- name: Restart Httpd Serversystemd:name: httpdstate: restarted
nginx 的异常处理
- hosts: webservertasks:- name: Install Nginx Serveryum:name: nginxstate: present- name: Configure Nginx Servertemplate:src: ./nginx.conf.j2dest: /etc/nginx/nginx.confnotify: Restart Nginx Server- name: Check Nginx Servershell: /usr/sbin/nginx -tregister: check_nginxchanged_when: '"successful" in check_nginx.stdout'- name: Start Nginx Serverservice:name: nginxstate: startedenabled: yeshandlers:- name: Restart Nginx Serversystemd:name: nginxstate: restarted在这个标准格式的 Playbook 中,我们在"hosts"中指定了目标主机组,并定义了多个任务。每个任务都有一个名称以及对应的模块和参数。要解决场景1,即要求每台主机的端口都不一样,可以在 Jinja2 模板文件 (nginx.conf.j2) 中使用变量来动态设置端口号。例如,可以通过定义一个名为nginx_port的变量,并在模板文件中使用它来设置 Nginx 的监听端口。要解决场景2,即使用 Jinja2 模板来修改被管理主机的配置文件,我们使用了template模块。该模块会将指定的模板文件复制到远程主机,并在复制过程中解析文件中的变量值。在"Check Nginx Server"任务中,我们使用了changed_when来定义任务的改变条件。只有当检查 Nginx 配置的输出中包含"successful"时,任务才会被标记为已改变。最后,在处理程序部分,我们定义了一个名为"Restart Nginx Server"的处理程序,它会在被通知时使用systemd模块重启 Nginx 服务。请注意,Ansible Playbook 的格式要求严格,正确的缩进和符号使用非常重要。以上提供的输出已经按照标准格式进行了调整。
jinja2
Jinja2 是 Python 的全功能模板引擎
Ansible 需要使用 Jinja2 模板来修改被管理主机的配置文件。
ansible 使用 jinja2 模板需要借助 template 模块实现,那 template 模块是用
来做什么的?
template 模块和 copy 模块完全一样,都是拷贝文件至远程主机,区别在于
template 模块会解析要拷贝的文件中变量的值,而 copy 则是原封不动的将文件拷
贝至被控端。
roles
更加规范,更加标准的去灵活安排你维护的业务
roles 示范
$tree base_module/
base_module/
├── files
├── handlers
├── tasks
│   ├── main.yml
│   └── main.yml_bak
└── templatestree nginx/
nginx/
├── files
├── handlers
│   └── main.yml
├── meta
├── tasks
│   ├── main1.yml
│   ├── main2.yml
│   └── main.yml
└── templates└── nginx.conf.j2cat site.yml
- hosts: allroles:- base_module- name: Install and Configure Nginxhosts: your_hostbecome: yesbecome_user: wwwroles:- nginx$cat base_module/tasks/main.yml
- name: Disable Selinuxselinux:state: disabled- name: Disable Firewalldsystemd:name: firewalldstate: stoppedenabled: no- name: Installed Base SoftWareyum:name: "{{ item }}"state: presentloop:- wget- lrzsz- bind-utils- net-tools- unzip- vim

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

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

相关文章

个人养老金知多少?

个人养老金政策你了解吗?税优政策你知道吗?你会计算能退多少税吗?… 点这里看一看

橘子学K8S01之容器中所谓的隔离

我们一直都在说容器就是一个沙盒,沙盒技术顾名思义就是像一个集装箱一样,把应用(服务,进程之类的)装起来的技术,这样每个进程在自己的沙盒中和其他的沙盒隔离开来,每个沙盒之间存在一个边界使得他们互不干扰&#xff0…

NFTScan 获得比特丛林 (BitJungle) 公司战略投资

近日,NFT 数据基础设施服务商 NFTScan 获得知名区块链安全公司比特丛林 (BitJungle) 战略投资。未来,双方将在链上数据和区块链安全领域展开战略合作,高效联动,让区块链大数据发挥更大价值。 关于 BitJungle 比特丛林 (BitJungle…

删除指定文件夹下的所有文件

要删除指定文件所在的文件夹下的所有文件(不包括文件夹本身),你可以使用Python的os模块和os.path模块。下面是一个示例代码,演示如何删除文件夹下的所有文件,但保留文件夹本身: import osdef delete_files…

鸿鹄云商:Java商城引领商业模式的潮流,免费搭建多种商城模式

java SpringCloud版本b2b2c鸿鹄云商平台全套解决方案 使用技术: Spring CloudSpring BootMybatis微服务服务监控可视化运营 B2B2C平台: 平台管理端(包含自营) 商家平台端(多商户入驻) PC买家端、手机wap/公众号买家端 微服务(30个通用…

idea插件开发报错: ZipException opening “slf4j.jar“: zip END header not found

错误信息 E:\idea-workspace\#idea-plugin\JSON2Object\src\main\java\com\hgy\plugin\json2object\GenerateAction.java:1: 错误: 无法访问com.hgy.plugin.json2object package com.hgy.plugin.json2object; ^ZipException opening "slf4j.jar": zip END header no…

在 Python 中,assert 是一个断言语句

在 Python 中,assert 是一个断言语句,用于测试代码中的条件是否为真。它的语法如下: assert condition, message其中,condition 是要测试的条件,如果条件为真(True),则程序继续执行…

湖南开放大学形成性考核 平时作业 参考试题

试卷代号:1292 企业集团财务管理 参考试题(开卷) 一、单项选择题(将正确答案的字母序号填入括号内。每小题2分,共20分) 1.当投资企业拥有被投资企业有表决权的资本比例超过50%以上时,母公司…

MyBatisPlus常用注解

TableName 描述:表名注解,标识实体类对应的表 使用位置:实体类 MyBatis-Plus在确定操作的表时,由BaseMapper的泛型决定,即实体类型决定,且默认操作的表名和实体类型的类名一致。 此时可通过TableName注解直…

用23种设计模式打造一个cocos creator的游戏框架----(十六)亨元模式

1、模式标准 模式名称:亨元模式 模式分类:结构型 模式意图:运用共享技术有效地支持大量细粒度的对象 结构图: 适用于: 1、一个应用程序使用了大量的对象. 2、完全由于使用大量的对象,造成很大的存储开…

铭飞CMS list 接口 SQL注入漏洞复现

0x01 产品简介 铭飞CMS是一款基于java开发的一套轻量级开源内容管理系统,铭飞CMS简洁、安全、开源、免费,可运行在Linux、Windows、MacOSX、Solaris等各种平台上,专注为公司企业、个人站长快速建站提供解决方案 0x02 漏洞概述 铭飞CMS在5.2.10版本以前list 接口处存在sql注入…

什么是CAS(比较并交换-乐观锁机制-锁自旋)

什么是 CAS(比较并交换-乐观锁机制-锁自旋) 概念及特性 CAS(Compare And Swap/Set)比较并交换,CAS 算法的过程是这样:它包含 3 个参数CAS(V,E,N)。V 表示要更新的变量(内存值),E 表示预期值(旧…

嵌入式开发板qt gdb调试

1) 启动 gdbserver ssh 或者 telnet 登陆扬创平板 192.168.0.253, 进入命令行执行如下: chmod 777 /home/HelloWorld (2) 打 开 QTcreator->Debug->StartDebugging->Attach to Running Debug Server 进行…

Nginx-nginx-1.18.0编译时默认包含哪些模块?nginx-1.18.0有哪些模块和配置语句,各有什么作用?

目录 01-如何查看 Nginx-nginx-1.18.0编译时默认包含哪些模块?02-如何查看Nginx有哪些自己可以手动设置添加或不添加的模块03-各配置语句和模块功能简介03-001:--pid-pathPATH03-002:--lock-pathPATH 03-003:select_module 03-004…

利息的来源与本质是什么,股市跌的钱去哪里了

目录 利息的来源与本质是什么 股市跌的钱去哪里了 利息的来源与本质是什么 利息的来源是资金所有者由于借出资金而取得的报酬,它来自生产者使用该笔资金发挥营运职能而形成的利润的一部分。这样看来,没有借贷便没有利息。 利息的本质是指货币持有者因贷出货币或货币资本而…

[湖湘杯 2021 final]MultistaeAgency

题目是给了源码,我们先来看web的main.go package mainimport ("bytes""crypto/md5""encoding/json""fmt""io""io/ioutil""log""math/rand""net/http""os"&q…

Python全局变量示例用法

Python全局变量示例用法:在函数体内定义全局变量。即使用global 关键字对变量进行修饰后,该变量就会变为全局变量。 # Author : 小红牛 # 微信公众号:WdPython # 定义全局变量 x 10 y 20print(1.在函数外,打印全局变量xy的值.c…

工作之踩坑记录

1.i386架构之atol函数使用导致的业务程序错误: 情景:将框架传递的链接地址采用整形保存传输,在i386架构上导致地址比较大,采用atol转型可能导致数据被截断出现异常。 方案:采用atoll更大的数据类型进行处理即可避免该问题。 2.Json库使用注意long int问…

汽车IVI中控开发入门及进阶(十二):V4L2视频

前言 汽车中控也被称为车机、车载多媒体、车载娱乐等,其中音频视频是非常重要的部分,比如播放各种格式的音乐文件、播放蓝牙接口的音乐、播放U盘或TF卡中的音视频文件,看起来很简单。如果说音频来源于振动,那么图片图像就是光反射的一种表象。模拟信号表示在空间上是连续…

ASP.NET Core 8 在 Windows 上各种部署模型的性能测试

ASP.NET Core 8 在 Windows 上各种部署模型的性能测试 我们知道 Asp.net Core 在 windows 服务器上部署的方案有 4 种之多。这些部署方案对性能的影响一直以来都是靠经验。比如如果是部署在 IIS 下,那么 In Process 会比 Out Process 快;如果是 Self Hos…