Ansible03-Ansible Playbook剧本详解

news2024/11/18 11:42:11

目录

  • 写在前面
  • 5. Ansible Playbook 剧本
    • 5.1 YAML语法
      • 5.1.1 语法规定
      • 5.1.2 示例
      • 5.1.3 YAML数据类型
    • 5.2 Playbook组件
    • 5.3 Playbook 案例
      • 5.3.1 Playbook语句
      • 5.3.2 Playbook1 分发hosts文件
      • 5.3.3 Playbook2 分发软件包,安装软件包,启动服务
        • 5.3.3.1 任务拆解
        • 5.3.3.2 步骤变模块
        • 5.3.3.3 编写playbook
        • 5.3.3.4 测试并运行playbook
      • 5.3.4 Playbook3 nfs服务
        • 5.3.4.1 任务拆解
        • 5.3.4.2 步骤变模块
        • 5.3.4.3 编写playbook
        • 5.3.4.4 测试并运行

写在前面

这是Ansible系列第三篇,内容为Ansible Playbook的介绍、使用
序号连续上篇笔记 Ansible02-Ansible Modules模块详解

回顾一下Ansible架构:
在这里插入图片描述

5. Ansible Playbook 剧本

Playbook,剧本,即Ansible中的脚本。用于配置、部署、管理被控节点。
就如同这个名字,Ansible会一步步执行Playbook中的内容,并相应返回OK,Changed,False,Skipped等反馈。
Ad-hoc的执行方式在多Modules时,过于繁琐,而为Ad-hoc编写shell脚本,又有点本末倒置。
Playbook语法尊崇yaml语法格式,文件名以.yaml.yml为后缀。

5.1 YAML语法

一种类似XML、JSON的标记性语言。强调以数据为中心,号称“一种人性化的数据格式语言”(我没觉得多人性化)

5.1.1 语法规定

  • 严格区分大小写
  • 使用缩进标识层级关系
  • 缩进不可用tab,只使用空格。空格数量没有要求,但同一层级需要保持一致。
  • #标识注释
  • "后需要有一个空格
  • 多段YAML配置放在一个文件,用---分割

YAML转JSON语法网站,可用于验证yaml语法是否正确
http://json2yaml.com/convert-yaml-to-json

5.1.2 示例

#xml
<zhangsan>
  <age>30</age>
  <address>tianjin</address>
  <dianha>132xxxxxx</dianha>
  <youxiang>xx@163.com</youxiang>
</zhangsan>
#yaml
yunwei:
    chengyuan: 10
    gangwei: weihu
  
---
kaifa:
  chengyuan: 25
  gangwei: kaifa

---
ceshi:
  chengyuan: 5
  gangwei: ceshi

5.1.3 YAML数据类型

  • 纯量(布尔值、整数、浮点数、Null、时间、日期、字符串)
#布尔类型
c1: true(真),false(假)

#整数
c2: 123

#浮点型(小数)
c3: 123.1

#null类型(使用~表示null)
c4: ~

#日期类型,日期必须使用ISO 8601格式,即yyyy-MM-dd
c5: 2024-05-28

#时间类型,时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区
c6: 2024-05-28T08:34:20+08:00

#字符串类型,简单写法直接写值即可,如果字符串中间有特殊字符,必须使用单引或双引括起来
c7: 'thi*!$hello'

#字符串类型,字符串过多的情况可以使用引号拆成多行,每一行会被转化成一个空格
c8: "hello word 
     xxxxxxxxxx"
  • 对象(键值对)
#对象形式一(推荐)
zhangsan:
 age: 25
 address: beijing
 
#对象形式二(了解)
zhangsan: {age: 25,address: beijing}
  • 数组(列表)
#数组形式一(推荐)
lisi:
  age: 24
  address: 
  - nanjing
  - beijing
 
#数组形式二(了解)
 address: [nanjing,beijing]

5.2 Playbook组件

playbook是由一个或者多个play组成的列表,可以让这些列表按事先编排的机制执行
task是调用ansible的具体模块,在模块参数中可以使用变量。模块执行是幂等性的,意味着多次执行结果相同。

  • hosts:执行的远程主机列表
  • remote_user: 指定以远程主机哪个用户的身份执行命令
  • tasks:任务集
  • variables:内置变量或自定义变量在playbook中调用
  • tempaltes 模板,可替换文件中的变量并实现一些简单逻辑的文件
  • handles 处理程序和notify结合使用,由特定条件触发的操作,满足条件方执行,否则不执行
  • tags标签,指定某条任务执行,用于选择运行playbook中的部分代码。

5.3 Playbook 案例

5.3.1 Playbook语句

#运行剧本,playbook以yml或yaml结尾皆可
ansible-playbook xxx.yaml/xxx.yml

#--syntax-check 用于检测playbook语法是否正确,如果正确只返回playbook名称
ansible-playbook --syntax-check xxx.yaml/xxx.yml

#--check 用于模拟执行playbook
ansible-playbook --check xxx.yaml/xxx.yml

5.3.2 Playbook1 分发hosts文件

# 编写playbook
[root@manager playbook]# cat 02.fenfa.yaml
- hosts: front,docker
  tasks:
  - name: 01.create the directory
    #    file: path=/server/files state=directory
    file:
      path: /server/files
      state: directory
  - name: 02.send the file
    copy:
      src: /etc/hosts
      dest: /server/files
  • 解释:
## Playbook 文件:`02.fenfa.yaml`
这个Playbook 指定了两个任务,这些任务将在名为 `front` 和 `docker` 的主机上执行。

### 主机(Hosts)
- `front,docker`:这些是目标主机的名称,Playbook 将会在这两个主机上执行定义的任务。

### 任务列表(Tasks)
#### 任务 1: 创建目录 (`01.create the directory`)
- **名称**: `01.create the directory` — 此任务的描述性名称。
- **模块**: `file` — Ansible 的文件模块,用于文件和目录的管理。
- **参数**:
  - `path`: `/server/files` — 指定了要创建的目录的路径。
  - `state`: `directory` — 确保指定路径被创建为一个目录。

#### 任务 2: 发送文件 (`02.send the file`)
- **名称**: `02.send the file` — 此任务的描述性名称。
- **模块**: `copy` — Ansible 的复制模块,用于将文件从本地复制到远程主机。
- **参数**:
  - `src`: `/etc/hosts` — 指定了要复制的源文件的路径,这里是本地的 `/etc/hosts` 文件。
  - `dest`: `/server/files` — 指定了复制文件到远程主机上的目标路径。

### 特殊说明
- 注释掉的行(以 `#` 开头)表示该行被注释,不会执行。在这个例子中,`file` 模块的一行被注释了,这意味着实际执行时将使用未注释的 `file` 模块的配置。

这个Playbook 的目的是在 `front` 和 `docker` 这两个主机上创建一个名为 `/server/files` 的目录,并将本地的 `/etc/hosts` 文件复制到该目录中。
# 执行语法检查,若成果只返回文件名
[root@manager playbook]# ansible-playbook --syntax-check 02.fenfa.yaml
playbook: 02.fenfa.yaml

# 模拟运行,只会返回结果而不会真实运行
[root@manager playbook]# ansible-playbook --check 02.fenfa.yaml

PLAY [front,docker] **************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************
ok: [192.168.100.148]
ok: [192.168.100.141]

TASK [01.create the directory] ***************************************************************************************
ok: [192.168.100.148]
changed: [192.168.100.141]

TASK [02.send the file] **********************************************************************************************
changed: [192.168.100.141]
changed: [192.168.100.148]

PLAY RECAP ***********************************************************************************************************
192.168.100.141            : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
192.168.100.148            : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

#真正的playbook运行
[root@manager playbook]# ansible-playbook  02.fenfa.yaml

PLAY [front,docker] **************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************
ok: [192.168.100.148]
ok: [192.168.100.141]

TASK [01.create the directory] ***************************************************************************************
ok: [192.168.100.148]
changed: [192.168.100.141]

TASK [02.send the file] **********************************************************************************************
changed: [192.168.100.148]
changed: [192.168.100.141]

PLAY RECAP ***********************************************************************************************************
192.168.100.141            : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
192.168.100.148            : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

# 检查运行结果是否正确
[root@manager playbook]# ansible docker,front -m shell -a 'tree /server/files; cat /server/files/hosts'
192.168.100.141 | CHANGED | rc=0 >>
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.100.151  manager
192.168.100.150  storage
192.168.100.149  backup
192.168.100.148  front
192.168.100.141  docker

192.168.100.148 | CHANGED | rc=0 >>
/server/files
└── hosts

0 directories, 1 file
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.100.151  manager
192.168.100.150  storage
192.168.100.149  backup
192.168.100.148  front
192.168.100.141  docker

5.3.3 Playbook2 分发软件包,安装软件包,启动服务

以zabbix-agent为例

5.3.3.1 任务拆解
  1. 下载
wget https://mirrors.aliyun.com/zabbix/zabbix/6.5/centos/8/x86_64/zabbix-agent-7.0.0-alpha3.release1.el8.x86_64.rpm
  1. 安装
yum install -y zabbix-agent-7.0.0-alpha3.release1.el8.x86_64.rpm
  1. 配置(略)

  2. 启动开机


5.3.3.2 步骤变模块

wget -> get_url
yum -> yum
配置 -> debug模拟
systemctl -> systemd

5.3.3.3 编写playbook
- hosts: front,docker
  tasks:
    - name: 01.download the zabbix-agent
      get_url:
        url: https://mirrors.aliyun.com/zabbix/zabbix/6.5/centos/8/x86_64/zabbix-agent-7.0.0-alpha3.release1.el8.x86_64.rpm
        dest: /tmp/
        validate_certs: no #关闭校验
    - name: 02.yum install za
      yum:
        name: /tmp/zabbix-agent-7.0.0-alpha3.release1.el8.x86_64.rpm
        state: present
        disable_gpg_check: yes #关闭gpgcheck
    - name: 03.配置
      debug:
        msg: "模拟配置zabbix-agent"
    - name: 04.startup
      systemd:
        name: zabbix-agent
        enabled: yes
        state: started

5.3.3.4 测试并运行playbook
#测试语法合格
[root@manager playbook]# ansible-playbook --syntax-check 03.install-zabbix-agent.yaml

playbook: 03.install-zabbix-agent.yaml


#模拟测试运行
[root@manager playbook]# ansible-playbook --check 03.install-zabbix-agent.yaml

#运行
[root@manager playbook]# ansible-playbook 03.install-zabbix-agent.yaml

PLAY [front,docker] **************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************
ok: [192.168.100.148]
ok: [192.168.100.141]

TASK [01.download the zabbix-agent] **********************************************************************************
ok: [192.168.100.148]
ok: [192.168.100.141]

TASK [02.yum install za] *********************************************************************************************
changed: [192.168.100.141]
changed: [192.168.100.148]

TASK [03.配置] *******************************************************************************************************
ok: [192.168.100.148] => {
    "msg": "模拟配置zabbix-agent"
}
ok: [192.168.100.141] => {
    "msg": "模拟配置zabbix-agent"
}

TASK [04.startup] ****************************************************************************************************
changed: [192.168.100.148]
changed: [192.168.100.141]

PLAY RECAP ***********************************************************************************************************
192.168.100.141            : ok=5    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
192.168.100.148            : ok=5    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

5.3.4 Playbook3 nfs服务

5.3.4.1 任务拆解
  • 服务端backup:
  1. 部署nfs-utils,rpcbind
  2. 修改配置文件
  3. 创建共享目录并修改所有者
  4. 启动服务rpcbind、nfs
  • 客户端front:
  1. 安装nfs-utils
  2. 配置挂载
5.3.4.2 步骤变模块
  • 服务端:
  1. 部署 -> yum
  2. 配置文件 -> lineinfile
  3. 创建共享目录 -> file
  4. 启动服务 -> systemd
  • 客户端:
  1. 安装 -> yum
  2. 挂载 -> mount
5.3.4.3 编写playbook
- hosts: backup
  tasks:
    - name: 1. 部署nfs-utils,rpcbind
      yum:
        name: nfs-utils,rpcbind
        state: present
    - name: 2. 修改配置文件
      lineinfile:
        path: /etc/exports
        line: "/backup-nfs *(rw,all_squash)"
        create: true
    - name: 3. 创建共享目录并修改所有者
      file:
        path: /backup-nfs
        state: directory
        owner: nobody
        group: nobody
    - name: 4. 启动服务rpcbind
      systemd:
        name: rpcbind
        enabled: yes
        state: started
    - name: 5. 启动服务nfs
      systemd:
        name: nfs-server
        enabled: yes
        state: started

- hosts: front
  tasks:
    - name: 1. 安装nfs-utils
      yum:
        name: nfs-utils
        state: present
    - name: 2. 配置挂载
      mount:
        src: 192.168.100.149:/backup-nfs
        path: /ans-upload
        #挂载点不存在会自动创建
        fstype: nfs
        state: mounted

5.3.4.4 测试并运行
# 语法测试
[root@manager playbook]# ansible-playbook --syntax-check 04.deploy_nfs.yaml

playbook: 04.deploy_nfs.yaml


#运行
[root@manager playbook]# ansible-playbook 04.deploy_nfs.yaml

PLAY [backup] ********************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************
ok: [192.168.100.149]

TASK [1. 部署nfs-utils,rpcbind] *************************************************************************************
ok: [192.168.100.149]

TASK [2. 修改配置文件] ***********************************************************************************************
ok: [192.168.100.149]

TASK [3. 创建共享目录并修改所有者] ***********************************************************************************
ok: [192.168.100.149]

TASK [4. 启动服务rpcbind] ********************************************************************************************
ok: [192.168.100.149]

TASK [5. 启动服务nfs] ************************************************************************************************
ok: [192.168.100.149]

PLAY [front] *********************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************
ok: [192.168.100.148]

TASK [1. 安装nfs-utils] **********************************************************************************************
ok: [192.168.100.148]

TASK [2. 配置挂载] ***************************************************************************************************
changed: [192.168.100.148]

PLAY RECAP ***********************************************************************************************************
192.168.100.148            : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
192.168.100.149            : ok=6    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

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

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

相关文章

通过ESP32芯片模组实现产品智能化升级,启明云端乐鑫代理商

随着科技的不断进步&#xff0c;物联网&#xff08;IoT&#xff09;已经渗透到我们生活的方方面面&#xff0c;成为现代生活不可或缺的一部分。在这场智能化革命中&#xff0c;乐鑫科技以其创新的ESP32芯片模组&#xff0c;为智能家居和智能设备的发展注入了新的活力。作为乐鑫…

一次绕过waf进行xss的经历

今天室友遇到一个好玩的网站&#xff0c;下面是一些尝试绕过Waf进行XSS的记录。首先该网站没有对左右尖号和单双引号做任何过滤或转义。且有未知的waf或者其他阻止恶意访问的手段。 首先我的访问为 login.asp?f1 时候&#xff0c;页面关键源码为 可能是表示登录次数的一个东西…

简单模拟实现shell(Linux)

目录​​​​​​​ 前言 展示效果 实现代码 前言 该代码模拟了shell的实现&#xff0c;也就是解析类似于“ls -a -l"的命令&#xff0c;当我们启动我们自己写的shell的可执行程序时&#xff0c;我们输入"ls"的命令&#xff0c;也可以展示出在shell中输入&…

广告联盟收款的解决方案

目前国内的affiliate&#xff0c;收海外联盟款就六种主要的解决方案(使用何种方式收款&#xff0c;不是我们决定的&#xff0c;是你操作的联盟决定的&#xff0c;你要根据联盟的要求提供相应的收款方式) 1 直接注册国外当地的银行账户 比如我收美国的广告联盟佣金用的是我美国银…

【设计模式】JAVA Design Patterns——Dependency Injection(依赖注入模式)

&#x1f50d;目的 依赖注入是一种软件设计模式&#xff0c;其中一个或多个依赖项&#xff08;或服务&#xff09;被注入或通过引用传递到一个依赖对象&#xff08;或客户端&#xff09;中&#xff0c;并成为客户端状态的一部分。该模式将客户的依赖关系的创建与其自身的行为分…

Java集合—TreeSet和TreeMap

一、TreeSet 1.当使用无参构造器&#xff0c;创建TreeSet时&#xff0c;仍然是无序的。 2.若希望添加的元素有序&#xff0c;需要使用TreeSet提供的构造器,传入一个比较器。 该比较器是一个接口&#xff0c;里面有一个方法叫compare()&#xff0c;传入一个实现该接口的类(匿名内…

使用PyAutoGUI识别PNG图像并自动点击按钮

在自动化测试、任务批处理等场景中,我们常常需要控制GUI程序的鼠标键盘操作。PyAutoGUI就是一个非常方便的Python模块,可以帮助我们实现这些操作。今天我们就来看看如何使用PyAutoGUI识别屏幕上的PNG图像,并自动点击图像所在位置。 C:\pythoncode\new\autoguirecongnizepng.py …

树--搜索二叉树

现有一棵结点数目为n的二叉树&#xff0c;采用二叉链表的形式存储。对于每个结点均有指向左右孩子的两个指针域&#xff0c;而结点为n的二叉树一共有n-1条有效分支路径。那么&#xff0c;则二叉链表中存在2n-(n-1)n1个空指针域。那么&#xff0c;这些空指针造成了空间浪费。 例…

Redis 中 Set 数据结构详解

用法 Redis 中的 Set 是一个无序&#xff0c;不重复集合&#xff08;里面的元素为字符串&#xff09;&#xff0c;支持常用的集合操作。 常见命令 1. 增 添加一个或多个元素到 set 中 SADD key member [ member ... ] 返回值&#xff1a; 添加成功的元素个数 将一个元素移到…

react跨组件通信Context

案例&#xff1a;现在有个父-子-孙组件 需要进行组件通信 import { useState } from "react"; // 创建上下文 const CountContext React.createContext();//子组件 const SonComponent (props) > {return (<div><h2>子组件</h2><Grandson…

spdlog 使用

spdlog 是一个日志库&#xff0c;直接引用头文件即可使用&#xff0c;速度快&#xff0c;异步打印日志。 对应的git地址 spdloggit地址 对应的目录 把上面划线的文件夹引入到自己的工程中&#xff0c;即可使用spdlog 下面是使用例子 inline static void create_logging(const…

LeetCode hot100-57-G

17. 电话号码的字母组合 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。不会&#xff0c;放IDEA里执行了一下大概理解了流程 …

Django序列化器中validate没起作用?validate的触发时机

今天上班的时候分配了一个任务&#xff0c;是修复前端的一个提示优化&#xff0c;如下图所示&#xff1a; 按照以往的经验我以为可以直接在validate上进行校验&#xff0c;如何抛出一个异常即可 &#xff0c;例如&#xff1a; class CcmSerializer(serializers.ModelSerialize…

划重点来了,计算机组成原理之计算机存储介绍与汉明码纠错

存储器 1. 分类 &#xff08;1&#xff09;按存储介质分类&#xff1a; 存储介质是能寄存”0“或"1"两种代码的物质或元器件。 包括半导体器件&#xff0c;磁性材料&#xff0c;光盘等。 半导体存储器&#xff1a;半导体器件组成的存储器。断电后数据会丢失&…

关于Word目录的更新

左侧标题顺序如有调整&#xff0c;自动目录并不会同步更新&#xff0c;每次都要记得在正文目录左上角点击更新目录

【Linux终端探险】:从入门到熟练,玩转基础命令的秘密(一)

文章目录 &#x1f680;Linux基础命令⭐1. 查看目录命令&#x1f4a5;2. 切换目录&#x1f44a;3. 创建目录❤️4. 删除目录/文件&#x1f6b2;5. 修改目录/文件&#x1f308;6. 拷贝目录/文件 &#x1f680;Linux基础命令 ⭐1. 查看目录命令 在Linux中&#xff0c;查看目录的…

【Paddle】Inplace相关问题:反向传播、影响内存使用和性能

【Paddle】Inplace相关问题&#xff1a;反向传播、影响内存使用和性能 写在最前面inplace 的好处有哪些&#xff1f;能降低计算复杂度吗在反向传播时&#xff0c;Inplace为什么会阻碍呢&#xff1f;“计算图的完整性受损”表达有误原地操作 sin_()为什么原地操作会阻碍反向传播…

【AIGC】GPT-4o技术分析-浅谈

GPT-4o&#xff1a;人工智能技术的全新里程碑 一、引言二、GPT系列版本间的对比分析三、GPT-4o的技术能力分析多模态处理能力速度与性能优化情感理解与表达能力 四、个人整体感受五、结语 一、引言 在人工智能技术的浪潮中&#xff0c;OpenAI再次以其卓越的创新能力引领潮流。近…

Java基础:面向对象(二)

Java基础&#xff1a;面向对象&#xff08;二&#xff09; 文章目录 Java基础&#xff1a;面向对象&#xff08;二&#xff09;1. 面向对象编程思想2. 类与对象2.1 类2.1.1 类的定义2.1.2 成员变量2.1.3 局部变量 2.2 对象2.2.1 对象的定义2.2.2 对象的使用2.2.3 对象创建的原理…

灯下黑”挖出国内知名安全平台某BUF的CSRF漏洞

漏洞复现&#xff1a; 漏洞点在删除文章的地方&#xff0c;首先为了测试先发布一篇文章 发布之后我们可以查看文章&#xff0c;注意url中的一串数字&#xff0c;就是这篇文章的id&#xff0c;如下如&#xff1a; 这里的文章id是“271825”&#xff0c;首先抓一下删除文章的数据…