Linux:ansible-playbook配置文件(剧本)(进阶)

Linux:ansible-playbook配置文件(剧本)_ansible-playbook -i参数-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/w14768855/article/details/132579492?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170930036016800215061982%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=170930036016800215061982&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-2-132579492-null-null.nonecase&utm_term=ansible&spm=1018.2226.3001.4450上面这个链接是基础文章


如果把ansible的模块比喻成linux命令,那么咱的playbook就好比是shell脚本


Playbook介绍 

Playbookad-hoc相比,是一种完全不同的运用ansible的方式,类似与saltstackstate状态文件。ad-hoc无法持久使用,playbook可以持久使用。
playbook是由一个或多个play组成的列表,play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来讲,所谓的task无非是调用ansible的一个module。将多个play组织在一个playbook中,即可以让它们联合起来按事先编排的机制完成某一任务


Playbook核心元素 

  • Hosts 执行的远程主机列表
  • Tasks 任务集
  • Variables 内置变量或自定义变量在playbook中调用
  • Templates 模板,即使用模板语法的文件,比如配置文件等
  • Handlers 和notity结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
  • tags 标签,指定某条任务执行,用于选择运行playbook中的部分代码。

Playbook语法 

playbook使用yaml语法格式,后缀可以是yaml,也可以是yml

  • 在单一一个playbook文件中,可以连续三个连子号(---)区分多个play。还有选择性的连续三个点好(...)用来表示play的结尾,也可省略。
  • 次行开始正常写playbook的内容,一般都会写上描述该playbook的功能。
  • 使用#号注释代码。
  • 缩进必须统一,不能空格和tab混用。
  • 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行实现的。
  • YAML文件内容和Linux系统大小写判断方式保持一致,是区分大小写的,k/v的值均需大小写敏感
  • k/v的值可同行写也可以换行写。同行使用:分隔。
  • v可以是个字符串,也可以是一个列表
  • 一个完整的代码块功能需要最少元素包括 name: task

1.简单的示例

由于这不是是基础章,里面的写法我就大概进行一个介绍了

 

hosts是指定哪些主机执行

remote_user是远程主机执行的用户

tasks下面就是一个任务列表,里面包含了一些任务模块

name就是一个类似声明的一个操作

name下面的就是各个模块加上他的参数 

---
- hosts : allremote_user : roottasks :- name : 写入开机自动挂载镜像mount : src=/dev/cdrom path=/mnt fstype=iso9660 state=present- name : 挂载镜像mount : src=/dev/cdrom path=/mnt fstype=iso9660 state=mounted- name : 搭建yum仓库yum_repository : name=local  description="local" baseurl=file:///mnt enabled=1 gpgcheck=no file=tarro- name : 下载httpdyum : name=httpd state=installed- name : 启动httpdservice : name=httpd state=started- name : 修改indexcopy : content="KALItarro" dest=/var/www/html/index.html
...


2.主机与用户

可以看到我们一开始写了在被管理机上执行的用户,我们除了在开头写还可以在下面写,如图

除了在里面可以指定某条模块执行的角色以外还可以使用sudo进行一个授权执行         

 


3.触发器与动作

Handlers(动作)与Notify(触发) 

 这俩非常好理解,触发器就是我们在某处触发,触发我们指定下面的某个动作

动作就是一般写在文件最下面,我们在上面通过动作名称去触发,触发了就执行指定的动作

很多时候当我们某一个配置发生改变,我们需要重启服务,(比如httpd配置文件文件发生改变了)这时候就可以用到handlers和notify了;(当发生改动时)notify actions会在playbook的每一个task结束时被触发,而且即使有多个不同task通知改动的发生,notify actions知会被触发一次;比如多个resources指出因为一个配置文件被改动,所以apache需要重启,但是重新启动的操作知会被执行一次

---
- hosts : allremote_user : roottasks:- name : "先对http的端口进行修改后,再通过触发器去执行动作"shell : sed -i 's/Listen 80/Listen 8080/g' /etc/httpd/conf/httpd.confnotify :- restart httpdhandlers :- name : restart httpdservice : name=httpd state=restarted
...

 通过在上面的触发,直接触发了下面的对应名称的动作


4.playbook中的变量

命令行指定变量 

执行playbook时候通过参数-e传入变量,这样传入的变量在整个playbook中都可以被调用,属于全局变量
---
- hosts: allremote_user: roottasks:- name : "安装指定的变量名的软件"yum : name={{ a }} state=installed
...
ansible-playbook -e "a=httpd" ins.yaml

使用这条命令的时候使用了-e传入变量

hosts文件中定义变量 

/etc/ansible/hosts 

---
- hosts: 192.168.6.2remote_user: root tasks:- name: "b=lrzsz变量"yum: name={{ b }} state=installed
...
---
- hosts: allremote_user: root tasks:- name: "a=httpd"yum: name={{ a }} state=installed
...

playbook文件中定义变量

---
- hosts: allremote_user: rootvars:a: httpdb: lrzsztasks:- name: "a=httpd"yum: name={{ a }} state=installed- name: "b=lrzsz"yum: name={{ b }} state=installed
...

 

重新定义原有变量 

 

 我这里有个名为pkg的变量,默认是安装gcc的一个变量,我只需在执行时候去通过命令重新定义变量即可完成替换

ansible-playbook -e "pkg=httpd" 1.yaml

 

这样就被定义成为新变量了

在其他文件中定义变量

我创建了一个名为var.yaml的文件并写入了

 

这两个内容

我再去修改一下playbook文件导入一下变量

 

 模块自带变量

playbook同样可以调用内部的一些自带变量,如setup模块里的一些

 


标签

一个playbook文件中,执行时如果想执行某一个任务,那么可以给每个任务集进行打标签,这样在执行的时候可以通过-t选择指定标签执行,还可以通过--skip-tags选择除了某个标签外全部执行等。

 

tags下面的就是标签,并且可以搭配变量如in{{ na }}  就是inhttpd    ,还可以打多个标签

 当我们想正常依次执行playbook直接执行就行了

ansible-playbook 3.yaml

我这个playbook中包含了安装,开启,重启,假设我就像执行这个剧本里的开启,我可以通过标签这样操作

ansible-playbook -t sthttpd 3.yaml

这样就 只执行了一个

如果我们现在不想执行开启httpd

ansible-playbook --skip-tags sthttpd 3.yaml

 那么现在就只执行安装和重启

如果现在不想执行开启和重启

ansible-playbook --skip-tags sthttpd,rehttpd 3.yaml

 可以通过  “,” 去隔开


Playbook中模板的使用 

template模板为我们提供了动态配置服务,使用jinja2语言,里面支持多种条件判断、循环、逻辑运算、比较操作等。其实说白了也就是一个文件,和之前配置文件使用copy一样,只是使用copy,不能根据服务器配置不一样进行不同动态的配置。这样就不利于管理。说明:1、多数情况下都将template文件放在和playbook文件同级的templates目录下(手动创建),这样playbook文件中可以直接引用,会自动去找这个文件。如果放在别的地方,也可以通过绝对路径去指定。2、模板文件后缀名为.j2

实例:

 4.yaml里的内容是使用123.j2模板  将模板传输到被管机上的/opt目录下名为321

 

 123.j2里面的内容如下

执行一下playbook ,到被管理机器上看一下

 


 

template之when

条件测试:如果需要根据变量、facts或此前任务的执行结果来做为某task执行与否的前提时要用到条件测试,通过when语句执行,在task中使用jinja2的语法格式、when语句:在task后添加when子句即可使用条件测试;when语句支持jinja2表达式语法。

 

---
- hosts: testAtasks:- name: 我要输出dgfshell: echo -n "dgf"register: xingmingignore_errors: True- name: 我要判断file: name=/alex state=directorywhen: xingming is success

 修改playbook文件,通过setup模块获取系统版本去判断

---
- hosts: allremote_user: rootvars:- listen_port: 88tasks:- name: Install Httpdyum: name=httpd state=installed- name: Config System6 Httpdtemplate: src=httpd6.conf.j2 dest=/etc/httpd/conf/httpd.confwhen: ansible_distribution_major_version == "6"   #判断系统版本,为6便执行上面的template配置6的配置文件notify: Restart Httpd- name: Config System7 Httpdtemplate: src=httpd7.conf.j2 dest=/etc/httpd/conf/httpd.confwhen: ansible_distribution_major_version == "7"   #判断系统版本,为7便执行上面的template配置7的配置文件notify: Restart Httpd- name: Start Httpdservice: name=httpd state=startedhandlers:- name: Restart Httpdservice: name=httpd state=restarted

 


template之with_items

 

上面的意思就是依次安装httpd vsftpd  nginx

---
- hosts: allremote_user: roottasks:- name: Create New Groupgroup: name={{ item }} state=presentwith_items: - group1- group2- group3 - name: Create New Useruser: name={{ item.name }} group={{ item.group }} state=presentwith_items:- { name: 'user1', group: 'group1' } - { name: 'user2', group: 'group2' } - { name: 'user3', group: 'group3' }

 这个案例是把用户加入不同的用户组


template之for if

 实例:

---
- hosts: allremote_user: rootvars:nginx_vhosts:- web1:listen: 8081server_name: "web1.example.com"root: "/var/www/nginx/web1"- web2:listen: 8082server_name: "web2.example.com"root: "/var/www/nginx/web2"- web3:listen: 8083server_name: "web3.example.com"root: "/var/www/nginx/web3"tasks:- name: Templage Nginx Configtemplate: src=nginx.conf.j2 dest=/tmp/nginx_vhost.conf

模板文件编写

{% for vhost in nginx_vhosts %}server{listen:    {{ vhost.listen }};server_name:    {{ vhost.server_name }};root:   {{ vhost.root }}; 
}
{% endfor %}

 

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

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

相关文章

LaTeX排版论文的常见问题汇总(持续更新中)

文章目录 LaTeX排版论文的常见问题汇总(持续更新中)1.如何上传期刊或会议提供的LaTeX模板?2.模板中各文件的说明3.LaTeX中如何设置字体大小?3.1如何设置表格中的字体大小?3.2如何设置表格、图片标题的字体大小&#xf…

A/D转换

硬件电路模型 模数转换代码 main.c #include <REGX52.H> #include "LCD1602.h" #include "Delay.h" #include "XPT2046.h"unsigned int ADValue; int main(){LCD_Init();LCD_ShowString(1,1,"ADJ NTC RG");while(1){ADValue …

什么是Vue的服务端渲染(SSR)?它有什么作用?

Vue的服务端渲染&#xff08;SSR&#xff09;是指将Vue组件在服务器端进行渲染&#xff0c;然后将已经渲染好的页面返回给浏览器&#xff0c;相比于传统的客户端渲染&#xff0c;SSR可以更好地优化SEO和加速首屏加载速度。在传统的客户端渲染中&#xff0c;浏览器需要加载所有的…

【MySQL系列】在 MacOS 上安装 MySQL

在 MacOS 上有两种方式安装 MySQL 服务器&#xff1a;通过 brew 安装和通过安装包安装。 文章目录 1、通过 brew 安装 MySQL1.1、安装 MySQL1.2、启动 MySQL 服务器1.3、配置 MySQL 服务器1.4、MySQL 服务器管理命令 2、通过安装包安装 MySQL2.1、下载安装包2.2、安装 MySQL2.3…

深入理解快速排序算法:从原理到实现

目录 1. 引言 2. 快速排序算法原理 3. 快速排序的时间复杂度分析 4. 快速排序的应用场景 5. 快速排序的优缺点分析 5.1 优点&#xff1a; 5.2 缺点&#xff1a; 6. Java、JavaScript 和 Python 实现快速排序算法 6.1 Java 实现&#xff1a; 6.2 JavaScript 实现&#…

30、类和接口

文章目录 接口概念接口和类之间有何关系&#xff1f; 可以使用接口来约束类接口继承接口接口还可以继承类接口为什么可以继承类内层原因&#xff1a;接口为什么可以继承类 用得出的结论解释最初的demo接口继承类的一些限制 接口概念 接口&#xff08;Interfaces&#xff09;可…

【大厂AI课学习笔记NO.61】环境部署的选择

主要是选择单机和分布式、生产和开发环境的规划等。 开发环境、测试环境、预发布环境和生产环境是软件开发和部署过程中常见的几个环境&#xff0c;它们各自的定义、区别、联系以及实现的关键技术如下&#xff1a; 1. 开发环境&#xff08;Development Environment&#xff09…

完全解析淘宝天猫详情接口API:购物小白也能秒变高手

在如今的电商领域中&#xff0c;淘宝和天猫是最为重要和热门的平台之一。作为购物平台的用户&#xff0c;我们通常只是浏览商品的页面&#xff0c;点击购买和支付&#xff0c;却未能深入了解背后的技术信息。然而&#xff0c;淘宝天猫详情接口API的了解和运用&#xff0c;联讯数…

力扣hot4--双指针

题目&#xff1a; 双指针想法&#xff1a; i 指针在数组不为 0 的地方停留&#xff0c;j 指针在每个地方停留&#xff0c;依次交换 i 和 j 指针。当 i 指针遍历完所有数组元素时&#xff0c;j 指针指向的元素及后面的元素都为0。 代码如下&#xff1a; C版本 class Solution …

冒泡、插入、希尔、选择、堆排序、快速排序(附源码)

目录 插入排序&#xff1a; 核心思想&#xff1a; 时间复杂度&#xff1a; 冒泡排序&#xff1a; 核心思想&#xff1a; 时间复杂度&#xff1a; 希尔排序&#xff1a; 核心思想&#xff1a; 时间复杂度&#xff1a; 选择排序&#xff1a; 核心思想&#xff1a; 时间…

告别手动填写邀请码,这款App数据统计工具帮你轻松实现

在移动互联网时代&#xff0c;App的推广和运营已成为各大企业的必修课。然而&#xff0c;面对错综复杂的推广渠道和浩如烟海的数据&#xff0c;如何精准地追踪用户来源、优化推广策略&#xff0c;一直是困扰着运营者的难题。今天&#xff0c;我们就来聊聊一款能够帮助你轻松解决…

新火种AI|AI商业中的里程碑事件已敲定! 欧盟27国一致通过《人工智能法案》。

作者&#xff1a;小岩 编辑&#xff1a;彩云 根据路透社2月2日消息&#xff0c;欧盟国家就《人工智能法案》立法正式达成协议。 此次立法的成功堪称AI商业领域上的里程碑事件。因为单从商业视角来看&#xff0c;这一法案的通过率先为欧盟内部的人工智能创新提供了明确的法律…

在 Linux 上用 zram 替代传统交换空间 | Linux 中国

我在我的电脑上花了很多时间&#xff08;我是说工作&#xff09;&#xff0c;我发现了很多有趣的东西。其中最近引起我注意的是 zram0 设备。我是在几个月前写一篇文章时第一次注意到它&#xff0c;它显示在 lsblk 命令的输出中&#xff1a; # lsblk NAME MAJ:MIN RM…

【VPX637】基于XCKU115 FPGA+ZU15EG MPSOC的6U VPX双FMC接口通用信号处理平台

VPX637是一款基于6U VPX总线架构的通用实时信号处理平台&#xff0c;该平台采用一片Xilinx的高性能Kintex UltraScale系列FPGA&#xff08;XCKU115-2FLVF1924I&#xff09;作为预处理单元&#xff0c;外挂2个FMC扩展接口&#xff0c;来完成数据采集、数据回放以及实时信号处理算…

Java---文件,流✨❤️

文章目录 1.遍历文件夹2.遍历子文件夹3.练习流4.以字节流的形式读取文件内容5.以字节流的形式向文件写入数据顶折纠问6 .写入数据到文件 1.遍历文件夹 一般说来操作系统都会安装在C盘&#xff0c;所以会有一个 C:\WINDOWS目录。 遍历这个目录下所有的文件(不用遍历子目录) 找出…

HTTP/2、HTTP/3分别解决了什么问题

总的来说就是HTTP/1.1是请求-响应模型导致队头阻塞问题&#xff0c;HTTP2是TCP层面导致队头阻塞问题 HTTP/2 多路复用&#xff0c;解决了HTTP/1.1队头阻塞问题 HTTP/1.1 的实现是基于请求-响应模型的。同一个连接中&#xff0c;HTTP 完成一个事务&#xff08;请求与响应&…

3.4作业

课上代码复习&#xff1a; 广播接收端代码: #include<myhead.h> int main(int argc, const char *argv[]) {//创建套接字int rfd socket(AF_INET,SOCK_DGRAM,0);if(rfd -1){perror("socket error");return -1;}printf("rfd %d\n",rfd);//填充地…

台式电脑电源各线的电压和电流输出和输出电流

台式电脑电源是电脑硬件的重要组成部分。 它为计算机的各个部件提供所需的电压和电流。 不同的硬件设备和组件有不同的电压和电流输出。 下面详细介绍台式电脑电源各线的电压&#xff0c;包括3.3V、5V、12V、-12V、-5V和5VSB&#xff0c;以及它们的输出电流和用途。 3.3V&#…

【AI+CAD】(一)ezdxf 解析DXF文件

DXF文件格式理解 DXF文件格式是矢量图形文件格式&#xff0c;其详细说明了如何表示不同的图形元素。 DXF是一个矢量图形文件&#xff0c;它捕获CAD图形的所有元素&#xff0c;例如文本&#xff0c;线条和形状。更重要的是&#xff0c;DXF是用于在CAD应用程序之间传输数据的图形…

STM32自学☞I2C

这里只是大体介绍&#xff0c;具体的可参考STM32数据手册