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.rhkb.cn/news/269713.html

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

相关文章

linux系统Jenkins工具配置webhook自动部署

Jenkins工具webhook自动部署 webhook自动部署webhook的意义操作流程jenkins页面操作gitlab页面操作 webhook自动部署 webhook的意义 自动化部署:Webhook 可以在代码提交、合并请求或其他特定事件发生时自动触发 Jenkins 构建和部署任务,从而实现自动化…

【Java EE 】认识文件与Java文件操作

目录 🍀认识文件🌸树型结构组织 和 目录🌸文件路径(Path)🌸其他知识 🌳Java 中操作文件🌸File 概述🌻属性🌻构造方法🌻方法 🌸代码示例…

放弃了字节32k的工作,回老家拿了8K的offer,我不后悔!

字节一年,人间三年。 虽然之前反复纠结和犹豫,在飞书的流程也是点了又关,但真正到了离开的这一刻,我居然没有太多不舍了。 可能是确实太累了,在字节工作的五百多个日夜里,基本没有在8点之前下过班&#xff…

小米澎湃和华为原生鸿蒙,那个更有发展前景?

小米的澎湃系统暂时不了解,但华为的鸿蒙系统值得一说。 就目前鸿蒙而言;24年初鸿蒙星河版面向开发者开放申请。其底座全线自研,去掉了传统的 Linux 内核以及 AOSP 安卓开放源代码项目等代码,仅支持鸿蒙内核和鸿蒙系统的应用。星河…

网络协议栈--应用层--HTTPS协议

目录 一、HTTPS协议原理1.1 HTTPS协议是什么?1.2 概念准备1.2.1 什么是“加密”?1.2.2 为什么要加密?1.2.3 常见的加密方式1.2.3.1 对称加密1.2.3.2 非对称加密 1.2.4 数据摘要&&数据指纹1.2.5 数字签名1.2.6 理解链-承上启下 1.3 HT…

职场卷王:我用可视化大屏模板做工作汇报,惊艳了同事和领导。

2023结束了,我和我的小伙伴们纷纷开始忙碌的年终总结和汇报。 正忙着汇总Excel数据、写word讲稿、找PPT模板时,我发现隔壁组的老王独自在大会议室偷偷调试起了那台汇报用的电视机。 不会吧不会吧,年终汇报还有一周呢,这家伙PPT都…

yum 和 rpm

rpm说明 rpm -qa :列出所有已安装的软件包 [roothub ~] rpm -qa geoipupdate-2.5.0-1.el7.x86_64 ncurses-base-5.9-14.20130511.el7_4.noarch libndp-1.2-9.el7.x86_64 libfastjson-0.99.4-3.el7.x86_64 。。。 rpm -qf FILENAME :查找提供 FILENAME…

HCIA-HarmonyOS设备开发V2.0证书

目录 一、不墨迹,上证书二、考试总结三、习题四、知识点五、坚持就有收获 HCIA-HarmonyOS Device Developer V2.0 开发者能力认证考试已通过。 一、不墨迹,上证书 一个多月的努力,验证了自己的学习成果,也认识到自己有待提升之处…

用边缘计算网关解决离散行业数采问题-天拓四方

一、引言 随着工业4.0时代的来临,离散制造行业正面临数字化转型的关键节点。离散制造的特点是小批量、多品种、高复杂度,如何实现高效、精准的数据采集与分析,提升生产效率和产品质量,成为行业亟待解决的问题。边缘计算网关作为一…

C#高级:Winform桌面开发中DataGridView的详解

一、每条数据增加一个按钮&#xff0c;点击输出对应实体 请先确保正确添加实体的名称和文本&#xff1a; private void button6_Click(object sender, EventArgs e) {//SQL查询到数据&#xff0c;存于list中List<InforMessage> list bll.QueryInforMessage();//含有字段…

xss.haozi:0x00

0x00没有什么过滤所以怎么写都没有关系有很多解 <script>alert(1)</script>

Java基于微信小程序的4S店汽车保养小程序

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

Ubuntu下安装Scala

前言 弄了一下终于成功装上了&#xff0c;这里对此进行一下总结 安装虚拟机 VMware虚拟机安装Ubuntu&#xff08;超详细图文教程&#xff09;_vmware安装ubuntu-CSDN博客https://blog.csdn.net/qq_43374681/article/details/129248167Download Ubuntu Desktop | Download | …

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:图片边框设置)

设置容器组件的图片边框样式。 说明&#xff1a; 从API Version 9开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 borderImage borderImage(value: BorderImageOption) 设置组件的图片边框。 卡片能力&#xff1a; 从API version 9开始…

2024年软考-官方最新考试安排出来了,软考新调整,很重要,但也很惹人气愤

官方最新通知&#xff0c;关于2024年度计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试工作计划 笔试改机考后&#xff0c;必然会迎来调整&#xff0c;但有点让人费解。 这次调整变动主要是每年考试的次数调整&#xff0c;很多改为了一年一考&#xff0c;具体…

android开发框架qmui,View的这些基础知识你必须要知道

今天在浏览技术新闻的时候&#xff0c;发现腾讯就在今天开源了一套 Android 原生的 UI 框架。你们有没有发现&#xff0c;腾讯特别喜欢干这种事&#xff0c;哪一种事呢&#xff1f;喜欢开源 UI 框架&#xff0c;小程序也是这样的。 我看到这个新闻后&#xff0c;第一时间就下载…

kohya_ss, stable diffusion 显示MaxRetryError: HTTPSConnectionPool()的解决方法

说白了就是访问huggingface.co下载模型、json配置失败&#xff0c;需要挂梯子。 然而有时候明明开了梯子&#xff0c;网页端可以访问google、huggingface.co却依然报上述错。 这时候说明没有开代理&#xff0c;执行的脚本没有连接上梯子对应的端口。 解决办法&#xff1a;手…

稀碎从零算法笔记Day7-LeetCode:罗马数字转整数

题型&#xff1a;字符串转化、找规律 链接&#xff1a;13. 罗马数字转整数 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 …

工具函数模板题(蓝桥杯 C++ 代码 注解)

目录 一、Vector容器&#xff1a; 二、Queue队列 三、Map映射 四、题目&#xff08;快递分拣 vector&#xff09;&#xff1a; 代码&#xff1a; 五、题目&#xff08;CLZ银行问题 queue&#xff09;&#xff1a; 代码&#xff1a; 六、题目&#xff08;费里的语言 map&…

索引下推 INDEX CONDITION PUSHDOWN

索引下推 (INDEX CONDITION PUSHDOWN&#xff0c;简称ICP)是在 MySQL5.6 针对扫描索引下推二级索引的一项优化改进。 用来在范围查询时减少回表的次数。ICP适用于 MYISAM和INNODB.