Ansible-Playbook

前置

Playbook介绍
  1. playbook 剧本是由一个或多个“play”组成的列表
  2. Playbook 文件是采用YAML语言编写的
  3. 用户通过ansible命令直接调用yml语言写好的playbook,playbook由多条play组成,每条play都有一个任务(task)相对应的操作,然后调用模块modules,应用在主机清单上,通过ssh远程连接,从而控制远程主机或者网络设备
YAMl 语言介绍

YAML是一个可读性高的用来表达资料序列的格式。YAML 官方网站:http://www.yaml.org

YAML 语言特性
  • YAML的可读性好
  • YAML和脚本语言的交互性好
  • YAML使用实现语言的数据类型
  • YAML有一个一致的信息模型
  • YAML易于实现
  • YAML可以基于流来处理
  • YAML表达能力强,扩展性好
YAML语法简介
  • 在单一文件第一行,用连续三个连字号“-” 开始,还有选择性的连续三个点号( … )用来表示文件的结尾
  • 次行开始正常写Playbook的内容,一般建议写明该Playbook的功能
  • 使用#号注释代码
  • 缩进必须是统一的,不能空格和tab混用
  • 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的
    YAML文件内容是区别大小写的,key/value的值均需大小写敏感
  • 多个key/value可同行写也可换行写,同行使用,分隔
  • v可是个字符串,也可是另一个列表
  • 一个完整的代码块功能需最少元素需包括 name 和 task
  • 一个name只能包括一个task
  • YAML文件扩展名通常为yml或yaml

Playbook核心元素

  • Hosts 执行的远程主机列表
  • Tasks 任务集
  • Variables 内置变量或自定义变量在playbook中调用
  • Templates 模板,可替换模板文件中的变量并实现一些简单逻辑的文件
  • Handlers 和 notify 结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
  • tags 标签 指定某条任务执行,用于选择运行playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断

handlers和notify结合使用触发条件

task列表和action
  • play的主体部分是task list。task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个。在运行自上而下某playbook时,如果中途发生错误,所有已执行任务都将回滚,因此再更正playbook后重新执行一次即可。
  • task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致。
  • 每个task都应该有其name,用于playbook的执行结果输出,建议其内容尽可能清晰地描述任务执行步骤。如果未提供name,则action的结果将用于输出。
Handlers

        用于当关注的资源发生变化时,才会采取一定的操作。Notify可用于在每个play的最后被触发,这样可避免多次有改变发生时每次都执行指定的操作,仅在所有的变化发生完成后一次性地执行指定操作。在notify中列出的操作成为handler,也即notify中调用handler中定义的操作。

例如:方便直观看到变化,我们执行更新文件task(触发重启mysql服务的handler),然后执行关闭mysql服务task,最后观察重启的handler是否生效。

- hosts: yzbremote_user: roottasks:- name: task1file: path=/opt/testfilestate=touchnotify: restart mysqld- name: task2systemd:name: mysqldstate: stoppedhandlers:- name: restart mysqldsystemd:name: mysqldstate: restarted

可以看到此时mysql启动时间为18号17:15

我们使用ansible-playbook执行对应的playbook,可以看到连接成功,task对应颜色为黄色,表示执行成功且发生了变动。

此时我们回到被控制端,查看mysql状态,可以看到启动时间已经变为最近时间

由此我们可以得出结论,剧本是按照顺序执行的,但是handler仅在所有的变化发生完成后才会去一次性地执行指定操作。

handlers也可以触发多个

- hosts: yzbremote_user: roottasks:- name: task1file: path=/opt/testfilestate=touchnotify: - restart mysqld- restart nginx- name: task2systemd:name: mysqldstate: stoppedhandlers:- name: restart mysqldsystemd:name: mysqldstate: restarted- name: restart nginxsystemd:name: nginxstate: restarted

当然,也能实现立即执行对应handler,这要用到- meta: flush_handlers模块

tags标签

通过指定标签来执行特定的动作

        -t 指定执行某一标签对应的所有任务

        --skip-tags 表示要跳过的指定的标签任务

---
- hosts: websrvsremote_user: roottasks:- name: install httpd packageyum: name=httpdtags: inshttpd- name: copy conf filecopy: src=files/httpd.conf dest=/etc/httpd/conf/ backup=yesnotify: restart service- name: start serviceservice: name=httpd state=started enabled=yestags: rshttpdhandlers:- name: restart serviceservice: name=httpd state=restarted
执行启动服务的tags
[root@ansible145 ansible]# ansible-playbook -t rshttpd httpd.yml
也可以针对多个标签执行脚本
#执行多个tags
[root@ansible145 ansible]# ansible-playbook -t inshttpd,rshttpd httpd.yml 
跳过某个标签执行脚本
ansible-playbook httpd.yml --skip-tags rshttpd

变量

变量名:仅能由字母、数字和下划线组成,且只能以字母开头。

调用:通过“{{ variable_name }}”调用变量,且变量名前后建议加空格

批量操作
[root@120 ansible]# cat task-restart.yml 
- hosts: yzbremote_user: roottasks:- name: task1systemd:name: "{{ item }}"state: restartedloop:- mysqld- nfs
[root@120 ansible]#
变量来源:
1.通过命令行指定变量,优先级最高ansible-playbook -e varname=value2.在playbook文件中定义vars:- var1: value1- var2: value23.在独立的变量YAML文件中定义
- hosts: allvars_files:- vars.yml4.在 /etc/ansible/hosts 中定义主机变量:主机组中主机单独定义,优先级高于组变量组变量:针对主机组中所有主机定义统一变量
在playbook 命令行中定义变量

范例:

vim var2.yml
---
- hosts: websrvsremote_user: roottasks:- name: install packageyum: name={{ pkname }} state=presentansible-playbook  –e pkname=httpd  var2.yml
在playbook文件中定义变量

范例:

[root@120 ansible]# cat mysql-variables.yml 
- hosts: yzbremote_user: rootvars:- service: mysqldtasks:- name: task1file: path=/opt/testfilestate=touchnotify: restart mysqld- name: task2systemd:name: "{{ service }}"state: stoppedhandlers:- name: restart mysqldsystemd:name: "{{ service }}"state: restarted[root@120 ansible]# ansible-playbook mysql-variables.yml 
使用变量文件

可以在一个独立的playbook文件中定义变量,在另一个playbook文件中引用变量文件中的变量,比playbook中定义的变量优化级高

范例:

[root@120 ansible]# cat mysql-variables-2.yml 
- hosts: yzbremote_user: rootvars_files:- ./vars.yamltasks:- name: task1file: path=/opt/testfilestate=touchnotify: restart mysqld- name: task2systemd:name: "{{ service }}"state: stoppedhandlers:- name: restart mysqldsystemd:name: "{{ service }}"state: restarted
[root@120 ansible]# cat vars.yaml 
service: mysqld
[root@120 ansible]# ansible-playbook mysql-variables-2.yml 
主机清单文件中定义变量

范例:

vim /etc/ansible/hosts[websrvs]
192.168.0.101 hname=www1 
192.168.0.102 hname=www2 [websvrs:vars]
mark=“-”
domain=magedu.organsible  websvrs  –m hostname –a ‘name={{ hname }}{{ mark }}{{ domain }}’

templates

即用一个文件作为模板,传送到远程的被控机上去,并且针对被控机的配置去改写文件,一般是配置文件。template不能作为命令行调用,只能写在playbook中进行调用。

范例:以yum安装nginx为例

1.创建templates文件
[root@ansible ansible]# mkdir templates
2.复制nginx的配置文件到templates中,并重命名
[root@ansible ansible]# cp /etc/nginx/nginx.conf templates/nginx.conf.j2
3.编辑脚本
---
- hosts: websrvsremote_user: roottasks:- name: install packageyum: name=nginx- name: copy templatetemplate: src=/nginx.conf.j2 dest=/ect/nginx/nginx.conf- name: start serviceservice: name=nginx state=started enabled=yes

注意:

如果j2文件放在templates文件下,可以直接写template: src=nginx.conf.j2,ansible可以自动识别出来;

如果j2文件没有放在templates文件下,需要加上绝对路径template: src=xx/xx/nginx.conf.j2

4.检查并执行脚本
[root@ansible145 ansible]# ansible-playbook -C testtempl.yml[root@ansible145 ansible]# ansible-playbook testtempl.yml

when

when 判断在用于控制在满足when所指定的条件的情况下 才执行相应的动作。

在when关键字中引用变量时,变量名不需要加"{{ }}",我们可以使用when关键字为任务指定条件,条件成立,则执行任务,条件不成立,则不执行任务。

示例1:

根据不同操作系统,安装不同软件

ansible_distribution 变量可以获取主机的发行版本[root@120 ansible]# ansible yzb -m setup -a 'filter=ansible_distribution'
192.168.255.123 | SUCCESS => {"ansible_facts": {"ansible_distribution": "CentOS", "discovered_interpreter_python": "/usr/bin/python"}, "changed": false
}playbook 如下
[root@120 ansible]# cat when.yml 
- hosts: yzbremote_user: roottasks:- name: Centos install httpdyum:name: httpdstate: installedwhen: ansible_distribution=="CentOS"   <==判断版本语句,此处变量不需要{{ }}引用。# when也可以使用and与or方式进行多项匹配。- name: Ubuntu install httpd2yum:name: httpd2state: presentwhen: (ansible_distribution == "CentOS")   <==判断版本语句,此处变量不需要{{ }}引用。
示例2:

判断kubelet.service 服务是否正常运行,运行就停止,不运行不作处理

[root@k8s-master-1 test]# vim when.yaml
---
- hosts: webremote_user: roottasks:- name: Check Nginx Statusshell: systemctl status kubelet.serviceregister: check_k8s- name: Print check_k8sdebug:var:"check_k8s"     <==#通过debug的var输出该变量的所有内容- name:service:name: kubelet.servicestate: stoppedwhen: check_k8s.rc == 0    <==.rc是check_nginx变量中的执行结果,见下面的执行过程

when_items

迭代:当有需要重复性执行的任务时,可以使用迭代机制。对迭代项的引用,固定变量名为“item”,要在task中使用when_items给定要迭代的元素列表。

示例1:

批量下载程序(和变量里使用loop一样)

[root@ansible ansible]# vim testitem.yml---
- hosts: yzbremote_user: roottasks:- name: create some filesfile: name=/data/{{ item }} state=touchwhen: ansible_distribution_major_version == "7"with_items:- file1- file2- file3- name: install some packagesyum: name={{ item }}with_items:- htop- sl- hping3
实例2:

迭代嵌套子变量——批量创建用户名

[root@ansible ansible]# vim testitem3.yml---
- hosts: yzbremote_user: roottasks:- name: create some groupgroup: name={{ item }}when: ansible_distribution_major_version == "7"with_items:- g1- g2- g3- name: create some useruser: name={{ item.name }} group {{ item.group }}with_items:- { name: 'user1', group: 'g1' }- { name: 'user2', group: 'g2' }- { name: 'user3', group: 'g3' }

ansible中的条件判断和tests

1、条件判断和tests

tests会将判断后的布尔值返回,如果条件成立,则返回true,如果条件不成立,tests会返回false,我们通常会在条件判断时使用到tests

示例:

---
- hosts: webremote_user: rootvars:testpath: /tmptasks:- name: testdebug:msg: "file exist"when: testpath is exists
"is exists"中的"exists"就是tests的一种,判断ansible主机中的对应路径是否存在(注意:是ansible控制主机中的路径,与目标主机没有关系),当对应的路径存在于ansible控制节点时,"is exists"为真。
"is not exists"表示对应路径不存在时返回真。
2、判断变量的tests
  • defined:判断变量是否已经定义,已经定义返回真
  • undefind:判断变量是否已经定义,没定义就返回真
  • none:判断变量值是否为空,如果变量已经定义,但变量值为空,则返回真

示例:

---
- hosts: webremote_user: rootvars:test1: vltest2:tasks:- debug:msg: "test1 is defined"when: test1 is defined- debug:msg: "test1 is undefind"when: test2 is undefined
3、判断执行结果的一些tests

success或者succeeded:通过任务的返回信息判断任务的执行状态,任务执行成功则返回真

failure 或 failed:通过任务的返回信息判断任务的执行状态,任务执行失败则返回真

change 或 changed:通过任务的返回信息判断任务的执行状态,任务执行状态为changed则返回真

skip 或 skipped:通过任务的返回信息判断任务的执行状态,当任务没有满足条件,而被跳过执行时,则返回真

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

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

相关文章

Rocky Linux archive下载地址

Index of /vault/rocky/https://dl.rockylinux.org/vault/rocky/

Linux中的全局环境变量和局部环境变量

Linux中的全局环境变量和局部环境变量 一、全局环境变量二、局部环境变量三、 设置全局环境变量 bash shell用一个叫作环境变量 &#xff08;environment variable&#xff09;的特性来存储有关shell会话和工作环境的信息&#xff08;这也是它们被称作环境变量的原 因&#xff…

VUE3实现个人网站模板源码

文章目录 1.设计来源1.1 网站首页页面1.2 个人工具页面1.3 个人日志页面1.4 个人相册页面1.5 给我留言页面 2.效果和源码2.1 动态效果2.2 目录结构 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;xcLeigh 文章地址&#xff1…

认识LogBack.xml

一、logback的三个主要模块 1.logback-core&#xff1a;提供基本的日志功能&#xff1b; 2.logback-classic&#xff1a;建立在logback-core之上&#xff0c;兼容SLF4和log4jAPI&#xff0c;提供一套强大的日志框架&#xff1b; 3.logback-access&#xff1a;允许通过servlet容…

防封防红短链接系统

功能很强大的一款防封防红短链接系统 功能列表&#xff1a; 1、支持设置套餐&#xff0c;选择不同的功能的集合作为套餐的功能&#xff0c;可设置包年包月 2、强大的短链接数据统计功能&#xff0c;包括统计点击次数、国家分布情况、浏览器分布情况、语言分布情况等 3、支持…

GWO-CNN-SVM,基于GWO灰狼优化算法优化卷积神经网络CNN结合支持向量机SVM数据分类(多特征输入多分类)

GWO-CNN-SVM&#xff0c;基于GWO灰狼优化算法优化卷积神经网络CNN结合支持向量机SVM数据分类(多特征输入多分类) 1. GWO灰狼优化算法 灰狼优化算法&#xff08;Grey Wolf Optimizer, GWO&#xff09;是一种启发式优化算法&#xff0c;模拟了灰狼群体的社会行为&#xff0c;包…

哈夫曼树及其应用

目录 一、哈夫曼树 1.1基本概念 1.2构造方法 1.3构造算法的实现 二、哈夫曼树的应用 2.1哈夫曼编码 2.2文件的编码和解码 2.2.1编码 2.2.2解码 一、哈夫曼树 1.1基本概念 哈夫曼树又称为最优树&#xff0c;是一类带权路径长度最短的树。 最优二叉树&#xff1a;带权…

vue3-openlayers 点击多边形弹框,高亮多边形,自定义属性传递,鼠标悬浮多边形上动态修改鼠标样式

本篇介绍一下使用vue3-openlayers点击多边形弹框&#xff0c;高亮多边形&#xff0c;自定义属性传递&#xff0c;鼠标悬浮多边形上动态修改鼠标样式 1 需求 加载天地图&#xff0c;polygon传递自定义属性标悬浮在polygon上&#xff0c;根据自定义属性&#xff0c;动态修改鼠标…

vue中的状态管理

第1部分&#xff1a;引言 状态管理是应用中数据流动和变更的核心机制。在Vue应用中&#xff0c;状态管理不仅涉及到组件间的数据共享&#xff0c;还包括了数据的持久化、异步操作的处理等复杂场景。良好的状态管理策略可以提高应用的响应速度&#xff0c;降低组件间的耦合度&a…

四边形不等式优化

四边形不等式优化 应用于类似以下dp转移方程。 f i min ⁡ 1 ≤ j ≤ i ( w i , j , f i ) f_{i}\min_{1\le j\le i}(w_{i,j},f_{i}) fi​1≤j≤imin​(wi,j​,fi​) 假设 w i , j w_{i,j} wi,j​ 可以在 O ( 1 ) O(1) O(1) 的时间内进行计算。 在正常情况下&#xff0c;…

ctfshow 2023 愚人杯 web

easy_signin 观察url&#xff0c;发现base64 &#xff0c;进行解码&#xff0c;原来可以访问文件路径&#xff0c;那我们访问一下index.php ?imgaW5kZXgucGhw查看源代码发现还是base64 解码得到flag 被遗忘的反序列化 <?php# 当前目录中有一个txt文件哦 error_reporti…

华为数通题库HCIP-821——最新最全(带答案解析)

单选11、某台路由器运行IS—IS,其输出信息如图所示&#xff0c;下列说法错误的是? A、邻居路由器的System-ID为0002.0200.2002 B、本路由器是DIS C、本路由器的区域号为49.0001 D、本路由器System-ID为0100.0000.1001 解析&#xff1a;根据输出信…

java获取指定目录,所有类及其注释名称

场景&#xff1a;获取所有类及名称 &#xff08;整理或填写表格需要&#xff09; 效果&#xff1a; 代码&#xff1a; public static void main(final String[] args) {final File currentDirectory new File("D:\\workspace\\petro-bcenter\\src\\main\\java\\com&quo…

【Android WebView】WebView基础

一、简介 WebView是一个基于webkit引擎、展现web页面的控件。Android的Webview在低版本和高版本采用了不同的webkit版本内核&#xff0c;4.4后直接使用了Chrome。 二、重要类 以WebView类为基础&#xff0c;WebSettings、WebViewClient、WebChromeClient为辅助共同完成安卓段加…

经典游戏案例:植物大战僵尸

学习目标&#xff1a;植物大战僵尸核心玩法实现 游戏画面 项目结构目录 部分核心代码 using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; using Random UnityEngine.Random;public enum Z…

可解释机器学习之SHAP方法

以Breast cancer wisconsin (diagnostic) dataset数据集为例。 # Built-in libraries import math import numpy as np import pandas as pd# Visualization libraries import matplotlib.pyplot as plt import seaborn as sns# Sklearn libraries # from skle…

vivado、vitis2022安装及其注意事项(省时、省空间)

1、下载 AMD官网-资源与支持-vivado ML开发者工具&#xff0c;或者vitis平台&#xff0c; 下载的时候有个官网推荐web安装&#xff0c;亲测这个耗时非常久&#xff0c;不建议使用&#xff0c;还是直接下载89G的安装包快。 注意&#xff1a;安装vitis平台会默认安装vivado&…

基于大型语言模型的全双工语音对话方案

摘要解读 我们提出了一种能够以全双工方式运行的生成性对话系统&#xff0c;实现了无缝互动。该系统基于一个精心调整的大型语言模型&#xff08;LLM&#xff09;&#xff0c;使其能够感知模块、运动功能模块以及一个具有两种状态&#xff08;称为神经有限状态机&#xff0c;n…

SpringMVC系列六: 视图和视图解析器

视图和视图解析器 &#x1f49e;基本介绍&#x1f49e; 自定义视图为什么需要自定义视图自定义试图实例-代码实现自定义视图工作流程小结Debug源码默认视图解析器执行流程多个视图解析器执行流程 &#x1f49e;目标方法直接指定转发或重定向使用实例指定请求转发流程-Debug源码…

考前刷题练手感(北航期末往年数据结构编程题)

本次因为是考前一天极速刷题&#xff0c;所以没有讲解&#xff0c;若有问题可私信。 目录 一、 查找同时空人员二、 老鼠回家-无回路三、函数调⽤关系四、东二食堂模拟五、栈帧 一、 查找同时空人员 【问题描述】 假设一共有6个手机基站&#xff0c;都具有记录手机连接基站状…