当前位置: 首页 > news >正文

Ansible的脚本------playbook剧本

一、剧本的前置知识点

1、主机清单

ansible默认的主机清单是/etc/ansible/hosts文件

主机清单可以手动设置,也可以通过Dynamic Inventory动态生成

一般主机名使用FQDN

vi /etc/ansible/hosts
[webserver]              #使用方括号设置组名
www1.example.org         #定义被监控主机,这边可以是主机名也可以是IP地址
www2.example.org:2222    #冒号后定义远程连接端口,默认是ssh的22端口

如果是名称类似的主机,可以使用列表的方式标识各个主机

[webserver]
//[01:50]表示匹配从01到50,后面跟着内置变量,这里定义了ssh的访问的用户名和密码,用于免交互登录
www[01:50].example.org ansible_ssh_user=root ansible_ssh_pass=abc123[dbbservers]
//[a:f]表示支持匹配a到f
db-[a:f].example.org

Inventory中的变量

主机变量

[webserver]
//定义变量http_port(开放的端口信息)和maxRequestsChild(最大进程数)
www1.magedu.com http_port=80 maxRequestsChild=808
www2.magedu.com http_port=8080 maxRequestsChild=909

组变量

[servers:vars]
ntp_server=ntp.example.org
nfs_server=nfs.example.org

组嵌套

[apache]
http1.example.org
http2.example.org[nginx]
ngx1.example.org
ngx2.example.org//定义一个组名,将刚才定义的两个组名放入,即webservers组包含apache组和nginx组的主机
[webservers]
apache
nginx

inventory变量参数

ansible_ssh_host #将要连接的远程主机名,与你想要设定的主机的别名不同的话,可以通过此变量设置。

ansible_ssh_port #ssh 端口号.如果不是默认的端口号,通过此变量设置。

ansible_ssh_user #默认的 ssh 用户名。

ansible_ssh_pass #ssh 密码(这种方式并不安全,强烈建议使用 --ask-pass 或SSH密钥)。

ansible_ssh_private_key_file #ssh使用的私钥文件,适用于有多个密钥,但你不想使用 SSH 代理的情况。

ansible_ssh_common_args #此设置附加到 sftp , scp 和ssh的缺省命令行。

ansible_sftp_extra_args #此设置附加到默认 sftp 命令行。

ansible_scp_extra_args #此设置附加到默认 scp 命令行。

ansible_ssh_extra_args #此设置附加到默认 ssh 命令行。

ansible_ssh_pipelining #确定是否使用SSH管道。这可以覆 ansible.cfg 中的设置。

ansible_shell_type #目标系统的shell类型。默认情况下,命令的执行使用 ’ sh ’ 语法,可设置为 ’ csh ’ 或 ’ fish '。

ansible_python_interpreter #目标主机的 python路径.适用于的情况: 系统中有多个 Python , 或者命令路径不是"/usr/bin/python",比如 *BSD, 或者 /usr/bin/python

ansible_*_interpreter #这里的" * "可以是 ruby 或 perl 或其他语言的解释器,作用和ansible_python_interpreter 类似。

ansible_shell_executable #这将设置 ansibie 控制器将在目标机器上使用的 shell ,覆盖 ansible.cfg 中的配置,默认为 /bin/sh。

2、YAML

YAML:另一种标记语言。是用来写配置文件的语言,非常简洁和强大。

YAML语法和其他语言类似,也可以表达散列表、标量等数据结构。

结构通过空格来展示;序列里配置项通过-来代表;Map里键值用:来分隔;YAML的扩展名为yaml

(1)基本语法规则

大小写敏感

使用缩进表示层级关系

缩进时不允许使用Tab键,只允许使用空格。

缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

(2)YAML支持的数据结构

对象

键值对的集合,又称为映射(mapping)/哈希(hashes)/字典(dictionary)

例如: name (键): Example(值)类class:(物品)对象1:(桌子)属性(名称,长、宽、高等)方法(动词,放东西)...对象2对象3

数组

一组按次序排列的值,又称为序列(sequence)/列表(list)

例如:-Apple-Orange

纯量

单个的、不可再分的值

例如:number: 12.30sure: true

二、Ansible的脚本------playbook

通过task调用ansible的模板将多个play组织在一个playbook中运行。

1、playbooks的组成部分

Tasks:任务,即调用模块完成的某操作;原理和事务一样,要么一起执行,要么一起不执行。

Variables:变量;声明变量的三个场景:hosts文件中定义、剧本中定义、在命令中加上-e定义。

Templates:模板;定义模板同一格式,解决每个服务可能因格式不一样而不兼容的问题。

Handlers:处理器,当某条件满足时,触发执行的操作。

Roles:角色;将任务分类执行,彼此之间互不干扰。

我们先看一个playbook的示例简单了解一下

vim httpd.yaml
- hosts: webservervars:http_port: 80max_clients: 200user: roottasks:- name: ensure apache is at the latest versionyum: pkg=httpd state=latest- name: write the apache config filetemplate: src=/root/test/httpd.j2 dest=/etc/httpd/conf/httpd.confnotify:- restart apache- name: ensure apache is runningservice: name=httpd state=startedhandlers:- name: restart apacheservice: name=httpd state=restarted#---------------------playbook解释------------------------
- hosts: webserver      //定义的主机组,即应用的主机vars:                 //定义变量http_port: 80max_clients: 200user: root            //指定用户执行任务tasks:                //执行的任务- name: ensure apache is at the latest version   //自定义输出内容,任务名称yum: pkg=httpd state=latest        //yum模块:指定软件包和版本参数;即使用yum安装最新版的httpd- name: write the apache config filetemplate: src=/srv/httpd.j2 dest=/etc/httpd.conf  //定义一个httpd的模板(在管理端自己创建)notify:     //调用下面的操作- restart apache    //操作的名字,在handlers下定义- name: ensure apache is runningservice: name=httpd state=started  //输出httpd状态handlers:               //处理器- name: restart apache          //被调用的操作名字service: name=httpd state=restarted  //重启httpd服务

2、执行playbook

格式:
ansible-playbook [yaml文件名]
例如:ansible-playbook ping.yml
参数:-k(–ask-pass) 用来交互输入ssh密码-K(-ask-become-pass) 用来交互输入sudo密码-u 指定用户补充命令:
ansible-playbook XXXX.yaml --syntax-check   #检查yaml文件的语法是否正确
ansible-playbook XXXX.yaml --list-task      #检查tasks任务
ansible-playbook XXXX.yaml --list-hosts     #检查生效的主机
ansible-playbook XXXX.yaml --start-at-task='ensure apache is at the latest version'  #指定从某个task开始运行

3、hosts和users介绍

hosts: webserver #指定主机组,可以是一个或多个组。
remote_user: root #指定远程主机执行的用户名

还可以为每个任务定义远程执行用户:

vim mysql.yaml
- hosts: mysqlremote_user: roottasks:- name: test connectionping:remote_user: li #指定远程主机执行tasks的运行用户为li

指定远程主机sudo切换用户

vim mysql1.yaml
- hosts: mysqlremote_user: rootbecome: yes #2.6版本以后的参数,之前是sudo,意思为切换用户运行become_user: li #指定sudo用户为litasks:- name: copy textcopy: src=/root/test/abc.txt dest=/home/li/abc.txt

一个yaml文件中可以写多个hosts,定义多个主机组

vim hosts.yaml
- hosts: webserverremote_user: roottasks:- name: create nginx groupgroup: name=nginx system=yes gid=208- name: create nginx useruser: name=nginx uid=208 group=nginx system=yes
- hosts: mysqlremote_user: roottasks:- name: copy file to mysqlcopy: src=/etc/inittab dest=/opt/inittab.back

4、tasks列表和action

Play的主体部分是task列表,task列表中的各任务按次序逐个在hosts中指定的主机上执行,即在所有主机上完成第一个任务后再开始第二个任务。

在运行playbook时(从上到下执行),如果一个host执行task失败,整个tasks都会回滚,请修正playbook 中的错误,然后重新执行即可。

Task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量,模块执行时幂等的,这意味着多次执行是安全的,因为其结果一致。

每一个task必须有一个名称name,这样在运行playbook时,从其输出的任务执行信息中可以很好的辨别出是属于哪一个task的。如果没有定义name,‘action’的值将会用作输出信息中标记特定的task。

定义一个task,常见的格式:”module: options” 例如:yum: name=httpd

ansible的自带模块中,command模块和shell模块无需使用key=value格式

示例:

vim error.yaml
- hosts: webserverremote_user: roottasks:- name: disable selinuxcommand: '/sbin/setenforce 0'- name: make sure apache is runningservice: name=httpd state=started

修改如下

- hosts: webserverremote_user: roottasks:- name: disable selinuxcommand: '/sbin/setenforce 0'ignore_errors: True #忽略错误,强制返回成功- name: make sure apache is runningservice: name=httpd state=started

5、Handlers介绍

Handlers也是一些task的列表,和一般的task并没有什么区别。

是由通知者进行的notify,如果没有被notify,则Handlers不会执行,假如被notify了,则Handlers被执行

不管有多少个通知者进行了notify,等到play中的所有task执行完成之后,handlers也只会被执行一次

示例

vim handler.yaml
- hosts: webserverremote_user: roottasks:- name: install httpd packageyum: name=httpd state=latest- name: install configuration file for httpdcopy: src=/root/handler/httpd.conf dest=/etc/httpd/conf/httpd.confnotify:- restart httpd- name: start httpd serviceservice: enabled=true name=httpd state=startedhandlers:- name: restart httpdservice: name=httpd state=restarted

6、playbook使用变量

(1)通过ansible命令传递

例如:编辑如下yaml

vim test1.yml
- hosts: mysqlremote_user: rootvars:- user:tasks:- name: add new useruser: name={{user}}

(2)直接在yaml中定义变量

vim test2.yml
- hosts: webserverremote_user: rootvars:package: httpdservice: httpdtasks:- name: install httpd packageyum: name={{package}} state=latest- name: install configuration file for httpdcopy: src=/root/handler/httpd.conf dest=/etc/httpd/conf/httpd.confnotify:- restart httpd- name: start httpd serviceservice: enabled=true name={{service}} state=startedhandlers:- name: restart httpdservice: name={{service}} state=restarted

(3)直接引用一些变量

引用ansible的固定变量

vim test3.yml
- hosts: mysqlremote_user: roottasks:- name: copy filecopy: content="{{ansible_all_ipv4_addresses}}," dest=/opt/vars.txt

引用主机变量

vim /etc/ansible/hosts
在mysql组的主机后面添加如下
[mysql]
192.168.163.200 testvar="163.200" #定义testvar变量的值为163.200vim test3.yml #添加{{testvar}}主机变量
- hosts: mysqlremote_user: roottasks:- name: copy filecopy: content="{{ansible_all_ipv4_addresses}},{{testvar}}" dest=/opt/vars.txt

7、条件测试

如果需要根据变量、facts(setup)或此前任务的执行结果来作为某task执行与否的前提时要用到条件测试,在Playbook中条件测试使用when子句。

在task后添加when子句即可使用条件测试:when子句支持jinjia2表达式或语法,例如:

vim when.yml
- hosts: mysqlremote_user: roottasks:- name: "shutdown CentOS"command: /sbin/shutdown -h nowwhen: ansible_distribution == "CentOS"

多条件判断

vim when.yml
- hosts: mysqlremote_user: roottasks:- name: "shutdown CentOS 7 systems"command: /sbin/shutdown -r nowwhen:- ansible_distribution == "CentOS"- ansible_distribution_major_version == "7"

8、迭代

当有需要重复性执行的任务时,可以使用迭代机制。其使用格式为将需要迭代的内容定义为item变量引用,并通过with_items语句指明迭代的元素列表即可。例如:

vim install.yaml
- hosts: webserverremote_user: roottasks:- name:command: rpm -Uvh http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm- name: "Install Packages"yum: name={{ item }}with_items:- httpd- mysql-server- php

相关文章:

Ansible的脚本------playbook剧本

一、剧本的前置知识点1、主机清单ansible默认的主机清单是/etc/ansible/hosts文件主机清单可以手动设置,也可以通过Dynamic Inventory动态生成一般主机名使用FQDNvi /etc/ansible/hosts [webserver] #使用方括号设置组名 www1.example.org #定…...

实验5-计算中值及分治技术

目录 1.寻找中位数(利用快速排序来寻找中位数) 2.分治方法求数组的和 3.合并排序...

dbeaver从excel导入数据笔记

场景 有excel的数据,需要做到数据库里。 方案一: 开发代码来实现。缺点是需要开发成本。 方案二: 数据库导入工具导入。不用开发,相对快速一些。 这里说下数据库工具导入。 操作过程 1、拿到excel数据文件,根据标题…...

PyTorch学习笔记:nn.MarginRankingLoss——排序损失

PyTorch学习笔记:nn.MarginRankingLoss——排序损失 torch.nn.MarginRankingLoss(margin0.0, size_averageNone, reduceNone, reductionmean)功能:创建一个排序损失函数,用于衡量输入x1x_1x1​与x2x_2x2​之间的排序损失(Ranking Loss)&…...

【JavaScript】34_Date对象 ,日期的格式化

8、Date Date 在JS中所有的和时间相关的数据都由Date对象来表示 对象的方法: getFullYear() 获取4位年份 getMonth() 返当前日期的月份(0-11) getDate() 返回当前是几日 getDay() 返回当前日期是周几(0-6) 0表示周日…...

计算机视觉 对比学习13篇经典论文、解读、代码

为了快速对 机器视觉中的对比学习有一个快速了解,或者后续复习,此处收录了 13篇经典论文、一些讲解地较好的博客和相应的Github代码,用不同颜色标记。 ​ 对比学习 13篇经典论文 论文代码和博客http://​www.webhub123.com/#/home/detail?p…...

MySQL 选择数据库

在你连接到 MySQL 数据库后,可能有多个可以操作的数据库,所以你需要选择你要操作的数据库。 在 MySQL 中就有很多系统自带的数据库,那么在操作数据库之前就必须要确定是哪一个数据库。 在 MySQL 中,USE 语句用来完成一个数据库到…...

雅思经验(9)

写作:关于趋势的上升和下降在小作文中,真的是非常常见的,所以还是要积累一下。下面给出了很多词,但是在雅思写作中并不是词越丰富,分数就越高的。雅思写作强调的是准确性:在合适的地方用合适的词和句法。不…...

java面试题(二十)中间件redis

1.1 Redis可以用来做什么? 参考答案 Redis最常用来做缓存,是实现分布式缓存的首先中间件;Redis可以作为数据库,实现诸如点赞、关注、排行等对性能要求极高的互联网需求;Redis可以作为计算工具,能用很小的…...

JavaWEB必知必会-Servlet

目录 Servlet简介Servlet快速入门Servlet配置详解ServletContext 1 Servlet简介 Servlet 运行在服务端的Java小程序,是sun公司提供一套规范(接口),用来处理客户端请求、响应给浏览器的动态资源。但servlet的实质就是java代码&a…...

oralce查找返回不同的值,寻找不同的表(原创)

查找返回不同的值,寻找不同的表 select case a_id when 1 then (select b_id|| ||b_desc from b where b.b_ida.a_id) else (select e_id || ||e_desc from e where e.e_ida.a_id) end from a; 以上方法的缺陷是单表,判断。今天来了个挑战&#…...

Python-第四天 Python循环语句

Python-第四天 Python循环语句一、while循环1.while循环的基础语法2.while循环的基础案例3.while循环的嵌套应用4.while循环的嵌套案例二、for循环1.for循环的基础语法1.1基础语法1.2 range语句2.for循环的嵌套应用三、循环中断 : break和continue1.continue2.break四、 综合案…...

spring中bean的生命周期(简单5步)

目录 一、概念 1.生命是bean的生命周期? 2.知道bean生命周期的意义? 3.bean的生命周期按照粗略的五步 二、例子讲解 一、概念 1.生命是bean的生命周期? 答:spring其实就是管理bean对象的工厂,它负责对象的创建&…...

10 个最难理解的 Python 概念

文章目录技术提升面向对象编程 (OOP)装饰器生成器多线程异常处理正则表达式异步/等待函数式编程元编程网络编程大家好,与其他编程语言相比,Python 是一门相对简单的编程语言,如果你想真正学透这门语言,其实可能并不容易。 今天我…...

【linux】线程概念

概念 什么是线程 在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列” 一切进程至少都有一个执行线程,线程在进程内部运行,本质是在进程地址空间内运行 在Linux系统中&a…...

Leg转Goh引擎和架设单机+配置登陆器教程

教程准备1、Leg版本一个2、Goh引擎一套3、电脑一台(最好联网)前言:BLUE/LEGS/Gob/Goh/九龍、4K、AspM2第一步:更换引擎1、把版本自带的LEG引擎换成Goh引擎2、删除服务端里面的exe、dll文件(也可以直接更新)3、清理登录和游戏网关里面的配置文件4、更新引…...

idea整合svn

idea整合svn svn下载 链接:https://pan.baidu.com/s/1yS3R3lEE8lm9c9Ap-ndDKg 提取码:65ur 基础步骤 IDED中配置SVN没有svn.exe解决办法 以下是两种解决方案 需要卸载原 svn(不推荐) 参考网址: https://blog.csdn.…...

字节青训前端笔记 | 数据可视化基础

本课程主要内容可以分为三个章节: 数据可视化的基本概念可视化设计的基本原则面向前端的可视化工具 本手册可以作为学生学习数据可视化的“学习指南”,按照手册所列内容,结合扩展资料进行系统的学习和实践。本课程没有讨论更为前沿的可视化…...

ROS运行机C++程序,移动

流程: 1.创建工作空间 mkdir catkin_ws cd catkin_ws mkdir src cd src catkin_init_workspace 2编译工作空间 cd ~/catkin_ws/ catkin_make catkin_make install 首先对ROS进行创建一个元功能包 3.设置环境变量 source devel/setup.bash source devel/setup.b…...

C++中编译静态库与动态库

1.库的理解库就是写好的现有的,成熟的,可复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。本质上来说库是一种可执行代码的二进制形式,是预编译代码的集…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...