自动化运维工具Ansible之playbook剧本

news2024/11/26 12:38:33

目录

一、playbook

1、playbook简述

2、playbook剧本格式

3、playbook组成部分

4、playbook启动及检测

5、playbook模块实战实例1

6、vars模块实战实例2 

7、when模块实战实例3

8、with_items循环模块实战实例4

9、template模块实战实例5

10、tags模块实战实例6


一、playbook

1、playbook简述

playbook是ansible用于配置,部署,和管理被控节点的剧本。通过playbook的详细描述,执行其中的tasks,可以让远端主机达到预期的状态。playbook是由一个或多个”play”组成的列表。 当对一台机器做环境初始化的时候往往需要不止做一件事情,这时使用playbook会更加适合。通过playbook你可以一次在多台机器执行多个指令。通过这种预先设计的配置保持了机器的配置统一,并很简单的执行日常任务。

ansible通过不同的模块实现相应的管理,管理的方式通过定义的清单文件(hosts)所管理的主机包括认证的方式连接的端口等。所有的功能都是通过调用不同的模块(modules)来完成不同的功能的。不管是执行单条命令还是play-book都是基于清单文件。

2、playbook剧本格式

playbook由YMAL语言编写,YMAL格式是类似于JSON的文件格式,一个文件中有多个play,一个play中只能有一个tasks,一个tasks中可以有多个name任务。

注意事项:

①大小写明个

②通过缩进表示层级关系

③不支持制表符tab键缩进,只能使用空格缩进

④缩进的空格数目不重要,只要相同层级左右对齐,通常开头缩进2个空格

⑤#号注释

⑥符号字符后缩进1个空格,如冒号:逗号,横杠-后面空一个格

⑦如果包含特殊字符用单引号和双引号引起来会作为字符串处理,单引号不识别变量,双引号识别变量。

3、playbook组成部分

模块名作用
tasks任务,即通过task调用ansible的模块将多个操作组织在一个playbook中运行
variables变量,使用{{}}调用,可简写vars
templates模板
handlers处理器,当changed状态条带满足时,notify触发执行的操作,不会立即执行notify,要等playbook中的所有任务完成才会执行notify,好处是可以多次触发notify单最后只执行一次对应的handlers。
roles角色
ignore_errors如果执行命令的返回值不为0则报错tasks停止默认,如果需要忽略报错则设置为false
notify如果上面的条件成立则执行handlers模块的内容
whit_item定义循环的内容即列表,使用{{item}}调用每一次的值,即名称为item。遍历内容直到结束
when条件判断,提供唯一通用的条件判断,true时执行,否则不执行
become2.6版本以后的参数,之前是sudo,意思为切换用户运行
tags为某个或某些任务定义标签,playbook执行时可以指定只执行某个标签,若标签为always则无论执行此playbook的那个标签都会将有always标签的name一起执行

4、playbook启动及检测

ansible-playbook  文件名.yaml 
ansible-playbook     文件.yaml   --start-at-task='任务名/标签'    #从某个task开始执行或只执行某个标签的name
#启动此文件
补充参数:-k(-ask-pass):用来交互式输入ssh密码

​		 -K(-ask-become-pass):用来交互式输入sudo密码

​		 -U:指定用户
ansible-playbook    文件.yaml  --list-task      #检查yml文件

ansible-playbook    文件.yaml  --list-hosts    #检测主机

ansible-playbook     文件.yaml  --syntax-check #检测语法

5、playbook模块实战实例1

vim test1.yaml
#新建编辑yaml文件,内容如下
---
#ymal文件开头,可不写
- name: test
#定义play名称,可不写
  gather_facts: false
#设置不进行facts信息收集,这可以加快执行速度,可省略默认开启
  hosts: webservers
#要执行的组或者主机,webservers为组名需要在/etc/ansible/hosts中配置
  remote_user: root
#执行时所使用的用户
  tasks:
#定义任务列表,列表中任务按顺序执行
   - name: test ping
#自定义name的任务名称
     ping:
#第一个任务执行内容为使用ping模块ping,webservers组的主机
   - name: test selinux
     command: /sbin/setenforce 0
#第二个任务执行内容为使用command模块关闭selinux
     ignore_errors: false
#若出现错误,忽略继续运行下面的任务,默认为true出错立即停止playbook
   - name: test stop firewalld
     service: name=firewalld state=stopped
#第三个任务执行内容为使用service模块关闭firewalld防火墙
   - name: test yum
     yum: name=httpd state=latest
#第四个任务执行内容为使用yum模块安装httpd服务状态为latest
   - name: test copy
     copy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf
#第五个任务为使用copy模块将ansible上的/etc/httpd.conf文件拷贝到指定组的主配置文件下替换,注意此处需要在ansible的/opt目录上有一个httpd.conf的模版否则会报错
     notify: "restart httpd"
#如果上面的copy任务成功,则调用handlers模块的restart httpd,注意要与下面handlers的name名称相同
   - name: test start httpd
     service: enabled=yes name=httpd state=started
#第六个任务执行内容为使用service模块启动httpd服务并设置开机自启
  handlers:
   - name: restart httpd
     service: name=httpd state=restarted
#handlers模块,若notify成立则执行此模块内容调用service模块重启httpd服务。注意使用name名称调用

6、vars模块实战实例2 

---
- name:
  hosts: webservers
  remote_user: root
  ignore_errors: false
  vars:
#使用变量模块
   - groupname: testgroup
#定义变量groupname的值为testgroup
   - username: testuser
#定义变量username的值为testuser
  tasks:
   - name: create group
     group: name={{groupname}} gid=111
#第一个任务使用group模块调用定义的groupname变量创建组
   - name: create user
     user: name={{username}}  uid=10086 group={{groupname}}
#第二个任务使用user模块调用定义的username变量创建用户指定uid和组

 

7、when模块实战实例3

---
 - hosts: webservers
   remote_user: root
   tasks:
    - name: test when
      service: name=httpd state=stopped
      when: ansible_default_ipv4.address == "192.168.30.12"
#当内置的变量ipv4.address等于192.168.30.12时调用service模块关闭httpd服务

8、with_items循环模块实战实例4

---
 - name: test1
   hosts: webservers
   gather_facts: false
   tasks:
    - name: create directories
      file:
        path: "{{item}}"
        state: directory
#路径调用变量item,变量值为下面的with_items的内容,一次执行一个有几个值执行几次,state为创建类型为目录
      with_items:
        - /tmp/test1
        - /tmp/test2
    - name: create file
      file:
        path: "{{item}}"
        state: touch
#路径调用变量item,变量值为下面的with_items的内容,一次执行一个有几个值执行几次,state为创建类型为文件
      with_items:
        - /tmp/test1/a.txt
        - /tmp/test2/b.txt

9、template模块实战实例5

1.先准备一个以 .j2 为后缀的 template 模板文件,设置引用的变量
cp /etc/httpd/conf/httpd.conf /opt/httpd.conf.j2
#注意ansible本身要安装httpd,其他2台被控制的不能安装httpd
vim /opt/httpd.conf.j2
Listen {{http_port}}				#42行,修改
ServerName {{server_name}}			#95行,修改
DocumentRoot "{{root_dir}}"          #119行,修改
#修改template配置文件模块的端口和主机名、根目录为变量
2.修改主机清单文件,使用主机变量定义一个变量名相同,而值不同的变量
vim /etc/ansible/hosts
[webservers1]
192.168.30.12 http_port=192.168.30.12:80 server_name=www.lhj1.com:80 root_dir=/var/www/html
[webservers2]
192.168.30.13 http_port=192.168.30.13:80 server_name=www.lhj2.com:80 root_dir=/var/www/html
3.主机添加hosts
vim /etc/hosts
192.168.30.12 www.lhj1.com
192.168.30.13 www.lhj2.com
4.编写playbook文件
vim httpd.yaml
---
- hosts: all
  remote_user: root
  gather_facts: false
  vars:
  - package: httpd
  - service: httpd
  tasks:
    - name: install httpd
      yum: name={{package}} state=latest
    - name: con test
      template: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
#配置文件模板拷贝到httpd的子配置文件中
      notify:
        - restart httpd
    - name: start httpd
      service: name={{service}} state=started
  handlers:
    - name: restart httpd
      service: name={{service}} state=restarted
5.最后在ansible上curl访问2个域名验证

10、tags模块实战实例6

---
- hosts: webservers1
  remote_user: root
  gather_facts: false
  tasks:
    - name: copy hosts
      copy: src=/etc/hosts dest=/opt/hosts
      tags:
      - tags1
#自定义标签名,可以在执行yaml文件时使用 --tag="tags1"只执行此任务,always标签任务除外
    - name: touch file
      file: path=/opt/testhost state=touch
      tags:
      - always
#always标签,无论执行那个标签都会将此标签的任务内容执行

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

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

相关文章

VM中kali虚拟机创建docker部署WebGoat

这里选择在docker中配置(因为方便) 首先下载docker sudo apt-get install docker.io 然后从Docker Hub下载WebGoat 8.0 的docker镜像 使用命令 docker pull webgoat/webgoat-8.0 完成后查看现在kali虚拟机中的docker镜像列表 输入命令 docker images …

0704一阶线性微分方程-微分方程

文章目录 1 线性方程1.1 定义1.2 解法(常数变易法)1.3 例题 2伯努利方程3 简单变量替换解方程结语 1 线性方程 1.1 定义 一阶微分方程:形式上能化成 d y d x P ( x ) y Q ( x ) \frac{dy}{dx}P(x)yQ(x) dxdy​P(x)yQ(x)的方程,…

树莓派CSI摄像头使用python调用opencv库函数进行运动检测识别

目录 一、完成摄像头的调用 二、利用python调用opencv库函数对图像进行处理 2.1 图像处理大体流程 2.2 opencv调用函数的参数以及含义 2.2.1 ret, img cap.read() 读取帧图像 2.2.2 cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 灰度图像 2.2.3 gray_diff_img cv2.absdiff(g…

详解子网划分练习题(32道)

目录 1 子网划分概念: 2 划分方法: 子网划分方法:段,块,数的计算三步。 段就是确定ip地址段中既有网络地址,又有主机地址的那一段是四段中的那一段? 块就确定上一步中确定的那一段中的主机…

【Linux】网络配置详细步骤及其相关基础知识介绍

一、Linux网络配置步骤 1、登录root账户 进行网络配置需要使用root权限,因此需要先登录root用户 2、输入ip addr查看网络信息 只有一个本机地址127.0.0.1,因为Linux操作系统的网卡开关还没有打开。 3、输入cd /etc/sysconfig/network-scripts/进入目录…

R语言 | 列表

目录 一、建立列表 1.1 建立列表对象——对象元素不含名称 1.2 建立列表对象——对象元素含名称 1.3 处理列表内对象的元素名称 1.4 获得列表的对象元素个数 二、获取列表内对象的元素内容 2.1 使用"$"符号取得列表对象的元素内容 2.2 使用"[[ ]]"符…

关于GeoServer发布服务时数据源设置的避坑指南

题外话 时光任然,一年一度的五一劳动节已然来到。作为疫情之后迎来的第一个五一,不知道各位小伙伴们怎么度过这个劳动节呢?是决定去另一个城市,观察体验一下不一样的风景,或者去旅游,给自己放假。昨天被123…

three.js进阶之动画系统

我曾在three.js进阶之骨骼绑定文章中提到了AnimationMixer、AnimationAction等内容,其实这些应该属于Three.js的动画系统,本文就系统的介绍一下动画系统(Animation System)。 前言 一般情况下,我们很少会使用three.j…

【学习视频】阅读开源工业软件和工业智能实战上线B站

图片来源:https://metrology.news/a-i-for-smarter-factories-the-world-of-industrial-artificial-intelligence/ 为了帮助大家做好工业软件以及用人工智能解决工业领域现实问题,我在B站上开了两个视频系列,一个是“一起来读开源工业软件”…

STM32 基础知识入门 (C语言基础巩固)

1、在不改变其他位的值的状况下,对某几个位进行设值 这个场景在单片机开发中经常使用,方法就是先对需要设置的位用&操作符进行清零操作, 然后用|操作符设值。 比如我要改变 GPIOA 的 CRL 寄存器 bit6(第 6 位)的…

MiNiGPT4安装记录

装conda wget https://repo.anaconda.com/archive/Anaconda3-5.3.0-Linux-x86_64.sh chmod x Anaconda3-5.3.0-Linux-x86_64.sh ./Anaconda3-5.3.0-Linux-x86_64.sh export PATH~/anaconda3/bin:$PATH # 或者写到环境保护变量 # 不会弄看这吧 https://blog.csdn.net/wyf2017/a…

fork()创建进程原理

目录 一、写时复制技术写时复制的优点:vfork()和fork() 二、fork()原理初步再理解下页表与多进程在内存中的图像创建进程和创建线程的区别 三、fork()的具体过程 一、写时复制技术 fork()生成子进程时,只是把虚拟地址拷贝给子进程,也就是父进…

( 字符串) 205. 同构字符串 ——【Leetcode每日一题】

❓205. 同构字符串 难度:简单 给定两个字符串 s 和 t ,判断它们是否是同构的。 如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。 每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同…

网络基础:socket套接字

文章目录 1. 前导知识1.1 源MAC地址和目的MAC地址1.2 源IP地址和目的IP地址1.3 MAC地址和IP地址的配合1.4 源端口号和目的端口号1.5 Socket1.6 UCP协议和TCP协议1.7 网络字节序高低位高低地址大端和小端网络字节序常用转换函数 2. socket 网络编程2.1 socket 常见接口创建套接字…

ChatGPT最好用的连接-自动写文案-代码算法最佳选择

ChatGPT最好用的连接-自动写文案-代码算法最佳选择 最近测试了很多国内分享的ChatGPT,很多都是限制最多写200文字,超过200个文字就不显示了。或者有的写出的文章逻辑性不对,写的算法不能正常运行。 经过多天的搜索测试,最终确定…

某电商客户数据价值分析项目

目录 一、项目意义 二、项目流程 三、项目内容 1、导入数据 2、数据预处理 3、单变量分析 4、聚类分析—Kmeans算法 一、项目意义 客户价值分析就是一个客户分群问题,以客户为中心,从客户需求出发,搞清楚客户需要什么,他们…

Linux进程通信:进程组 会话

1. 进程组 (1)概念:一个或多个进程的集合,也称为“作业”。 (2)父进程创建子进程时,默认属于同一个进程组。进程组ID为组长进程ID。 (3)进程组中只要有一个进程存在&a…

unity中的Line Renderer

介绍 unity中的Line Renderer 方法 首先,Line Renderer 是 Unity 引擎中的一个组件,它可以生成直线、曲线等形状,并且在场景中呈现。通常情况下,Line Renderer 被用来实现轨迹、路径、线框渲染以及射线可视化等功能。 在使用 …

imx6ull开发板环境配置 - libusb、libudev、eudev交叉编译

目录 零、前言 一、libusb交叉编译 1.0 前言 1.1 交叉编译 二、usbutils交叉编译 2.0 前言 2.1 交叉编译 三、libudev交叉编译 3.0 前言 3.1 交叉编译 3.2 错误处理-没找到usbutils 3.3 错误处理-没找到pci.ids (pci.ids not found) 3.3.0 前…

【数据库】索引与事务

目录 1、索引 1.1、概念 1.2、索引的作用 1.3、 索引的缺点 1.4、数据库中实现索引的数据结构 1.4.1、B树/B-树 1.4.2、B树 1.4.3、回表 1.5、使用场景 1.6、索引的使用 1.6.1、查看索引 1.6.2、创建索引 1.6.3、 删除索引 1.7、索引的分类 2、事务 2.1、为什…