Ansible非标记语言YAML与任务剧本Playbook

前言

上篇介绍了 Ansible 单模块(AD-Hoc)的相关内容Ansible自动化运维Inventory与Ad-Hoc-CSDN博客,Ad-Hoc 命令是一次性的、即时执行的命令,用于在远程主机上执行特定任务,这些命令通常用于快速执行简单的任务。当需要在执行多个任务、配置复杂场景或需要可重复使用操作时,就需要用到任务剧本(Playbook)来定义复杂的任务流程和处理重复执行的操作。

目录

前言

一、YAML 非标记语言

1. 概述介绍

2. 功能联系

3. 语法格式

3.1 列表

3.2 字典

4. 编写剧本

二、Playbook 核心组件

1. host 组件

2. remote_user 组件

3. task列表和action组件

4. Handlers 组件

三、Role 组织结构

1. 概述

2. Role与Playbook

3. 角色结构

4. 变量 

4.1 变量目录结构

4.2 编写变量

4.3 使用变量

4.4 变量覆盖


一、YAML 非标记语言

1. 概述介绍

YAML(YAML Ain't Markup Language) 是一种人类可读的数据序列化格式,常用于配置文件和数据传输。它以缩进、换行和符号结构来表示数据,具有简洁、清晰的特点。YAML 旨在成为一个易于阅读和编写的数据格式,同时也适合机器解析和生成。它使用空格缩进来表示层级关系,不需要显式的标记符号(如 XML 或 JSON 中的尖括号或大括号),这使得它更加直观和易读。

YAML 官方网站:The Official YAML Web Site

Ansible 官网:YAML Syntax — Ansible Documentation

2. 功能联系

① YAML 在 Ansible 中的作用是提供了一种直观、易读的方式来表示配置信息和数据结构,从而使得管理和维护基础设施的自动化过程更加高效和直观。

② Ansible 将 YAML 作为其主要的配置文件格式,因此使用 YAML 可以方便地定义主机、角色、任务和变量。这使得 Ansible Playbook 和其他配置文件变得直观且易于编写。

3. 语法格式

3.1 列表

在 YAML 中,列表使用短横线 - 表示,后面跟着一个空格。列表可以包含任意类型的元素,例如字符串、数字、布尔值或者其他嵌套的列表。

fruits:
  - Apple
  - Orange
  - Strawberry
  - Mango

在这个例子中,fruits 是一个包含四种水果的列表,每一种水果都是列表中的一个元素。 

3.2 字典

字典在 YAML 中使用键值对的形式表示,使用冒号 : 将键和值分隔开,键值之间需要有一个空格。字典可以包含嵌套的字典或者列表作为值。

person:
  name: John
  age: 30
  hobbies:
    - Reading
    - Hiking
  address:
    city: New York
    zip: 10001

在这个例子中,person 是一个字典,包含了名字、年龄以及兴趣爱好和地址等信息。 

在 Ansible Playbooks 中,列表和字典通常用来定义变量、任务、主机清单等信息。它们提供了一种直观且易读的方式来表示复杂的数据结构,使得编写和维护 Playbooks 更加方便和直观。

4. 编写剧本

批量安装apache

① 准备工作,卸载目标主机网站服务

管理节点:
[root@ansible ~]# ansible all -m yum -a "name=httpd state=removed"
#在Ansible中,all是一个用于指代所有主机的特殊关键字。当你在使用Ansible命令时,使用all会将命令应用到所有已定义的主机上。卸载httpd相关服务。

被管理节点:
[root@localhost ~]# yum list | grep httpd | grep @
httpd-tools.x86_64                       2.4.6-99.el7.centos.1         @updates 
#检查是否还有安装httpd相关包。

管理节点:
[root@ansible ~]# ansible all -m yum -a "name=httpd-tools state=removed"
#卸载httpd工具包,避免影响安装httpd。

管理节点:
[root@ansible ~]# yum install -y httpd
#Ansible服务器安装网站服务
[root@ansible ~]# mkdir apache
[root@ansible ~]# cd apache/
[root@ansible apache]# cp -rf /etc/httpd/conf/httpd.conf .

② 编写剧本

[root@ansible apache]# vim apache.yaml
- hosts: webserver                     #针对的剧本对象
  tasks:                               #任务
  - name: install apache packages      #任务1:安装apache包(可以自定义)
    yum: name=httpd state=present      #调用yum安装模块:httpd,present,表示确保软件包已经安装
  - name: copy apache conf             #任务2:拷贝apache配置文件
    copy: src=./httpd.conf dest=/etc/httpd/conf/httpd.conf #调用拷贝模块,源——>目标
  - name: ensure apache is running     #确保apache服务已运行
    service: name=httpd state=started enabled=yes   #调用系统服务状态模块

③ 检查测试

[root@ansible apache]# ansible-playbook apache.yaml --syntax-check  #检验语法

playbook: apache.yaml
[root@ansible apache]# ansible-playbook apache.yaml --list-tasks    #列出任务

playbook: apache.yaml

  play #1 (webserver): webserver	TAGS: []
    tasks:
      install apache packages	TAGS: []
      copy apache conf	TAGS: []
      ensure apache is running	TAGS: []
[root@ansible apache]# ansible-playbook apache.yaml --list-hosts    #列出主机

playbook: apache.yaml

  play #1 (webserver): webserver	TAGS: []
    pattern: [u'webserver']
    hosts (4):
      host4
      host3
      host2
      host1

④ 执行剧本

[root@ansible apache]# ansible-playbook apache.yaml

PLAY [webserver] ************************************************************************************************

TASK [Gathering Facts] ******************************************************************************************
ok: [host2]
ok: [host3]
ok: [host1]
ok: [host4]

TASK [install apache packages] **********************************************************************************
changed: [host2]
changed: [host1]
changed: [host4]
changed: [host3]

TASK [copy apache conf] *****************************************************************************************
ok: [host2]
ok: [host3]
ok: [host1]
ok: [host4]

TASK [ensure apache is running] *********************************************************************************
changed: [host2]
changed: [host1]
changed: [host4]
changed: [host3]

PLAY RECAP ******************************************************************************************************
host1                      : ok=4    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
host2                      : ok=4    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
host3                      : ok=4    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
host4                      : ok=4    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

二、Playbook 核心组件

Playbook 是 Ansible 中用于描述自动化部署、配置和管理任务的核心组件。一个 Playbook 包含了一系列的任务,这些任务将被 Ansible 执行以实现特定的配置或操作。

1. host 组件

playbook 中的每一个 play 的目的都是为了让特定主机以某个指定的用户身份执行任务。hosts 用 于指定要执行指定任务的主机,须事先定义在主机清单中。

示例:

- hosts: websrvs:appsrvs

2. remote_user 组件

可用于 Host 和task 中。也可以通过指定其通过 sudo 的方式在远程主机上执行任务,其可用于 play 全局或某任务;此外,甚至可以在sudo时使用 sudo_user 指定 sudo 时切换的用户。

示例:

- hosts: websrvs 
  remote_user: root
  
  tasks:
    - name: test connection 
      ping:
      remote_user: wang
      sudo: yes             #默认sudo为root
      sudo_user:wang        #sudo为wang

3. task列表和action组件

play的主体部分是task list,task list中有一个或多个task,各个task 按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个task后,再开始第二个task。task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致每个task都应该有其name,用于playbook的执行结果输出,建议其内容能清晰地描述任务执行步骤。 如果未提供name,则action的结果将用于输出。

action: module arguments	
#示例: action: shell wall hello

module: arguments	
#示例: shell: wall hello

注意:shell和command模块后面跟命令,而非key=value 

4. Handlers 组件

在 Playbook 中,Handlers 通常会在任务中触发,并在整个 Playbook 运行结束时才会执行。

示例:修改管理节点apace配置文件模板,拷贝到被管理节点,查看apache相关信息:

① 修改管理几点服务器apache监听端口号,执行剧本查看被代理节点服务器配置是否拷贝

[root@ansible ~]# yum install -y httpd
#Ansible服务器安装网站服务
[root@ansible ~]# mkdir apache
[root@ansible ~]# cd apache/
[root@ansible apache]# cp -rf /etc/httpd/conf/httpd.conf .
[root@ansible apache]# sed -i 's/Listen 80/Listen 8080/' httpd.conf

② 查看被代理节点apache配置文件已及更新,但是并没有生效

③ 由于剧本服务模块指令是启动,需要定义、引用处理程序

注意:如果将 state=started 改为 restart ,将会导致每次执行剧本都会重启 apache 服务。

[root@ansible apache]# vim apache.yaml
- hosts: webserver                       #定义了将要执行任务的目标主机或主机组
  tasks:
  - name: install apache packages        #对Playbook的描述,用于标识该Playbook的作用。
    yum: name=httpd state=present
  - name: copy apache conf
    copy: src=./httpd.conf dest=/etc/httpd/conf/httpd.conf
    notify: restart apache service       #通知,当copy模块产生改变,通知程序重启,需要与handlers的name一样 #应用处理程序
  - name: ensure apache is running
    service: name=httpd state=started enabled=yes
  handlers:                              #当任务触发会执行 #定义处理程序
  - name: restart apache service         #任务,重启apache(名字自定义)
    service: name=httpd state=restarted

 ④ 再次修改管理节点 apachep 配置文件端口号,执行剧本,查看被代理节点 apache 端口信息

三、Role 角色组织结构

1. 概述

Role 是一种可重用的组织结构,用于将相关的变量、任务和处理逻辑打包在一起。它是对任务和变量的封装,可以方便地在不同的 Playbooks 中重复使用。

2. Role与Playbook

Playbook 可以调用一个或多个 Role 来完成特定的配置任务。这种模块化的设计使得 Playbook 更加易读、易维护,并且能够促进代码的重用。通过将任务和变量封装到 Role 中,可以有效地减少重复编写相似任务的工作,并提高了整体的可维护性。

在 Playbook 中使用 Role 非常简单,只需要指定 Role 的名称即可:

- hosts: servers
  roles:
    - common
    - webserver
    - database

在这个示例中,common, webserver和 database 都是 Role 的名称,Ansible 将会按照指定的顺序执行这些 Role 中定义的任务。 

3. 角色结构

在 Ansible 中,Role 是一种组织和封装任务、变量和处理逻辑的方式。通过 Role,可以将相关的配置任务和变量打包在一起,以便在不同的 Playbooks 中重复使用。以下是关于 Role 的介绍:

my_role/
  ├── tasks/           #包含了角色的主要任务。
  │   └── main.yml
  ├── handlers/        #包含了角色中定义的处理器。
  │   └── main.yml
  ├── templates/       #包含了角色中使用的模板文件
  ├── files/           #和静态文件。
  ├── vars/            #包含了角色中使用的变量。
  │   └── main.yml
  ├── defaults/        #包含了角色中使用的变量。
  │   └── main.yml
  └── meta/            #包含了角色的元数据,比如作者信息、依赖关系等。
      └── main.yml

4. 变量 

在 Ansible Role 中,变量是一种重要的元素,用于定义和传递数据,以便在角色中的任务和模板中使用。以下是关于在 Ansible Role 中编写变量的介绍:

4.1 变量目录结构

my_role/
  ├── vars/
  │   └── main.yml

4.2 编写变量

在 vars/main.yml 文件中,你可以定义角色中需要使用的各种变量。这些变量可以是全局的,也可以是与特定任务相关的局部变量。

# vars/main.yml
apache_port: 80
apache_document_root: /var/www/html

在这个示例中,apache_port 和 apache_document_root 是两个角色中使用的变量,它们定义了 Apache 服务的端口号和文档根目录。

4.3 使用变量

一旦定义了变量,你可以在角色的任务、模板或其他文件中引用这些变量。

# tasks/main.yml
- name: Ensure Apache is running
  service:
    name: apache2
    state: started
  vars:
    port: "{{ apache_port }}"

{{ apache_port }} 表示引用之前定义的 apache_port 变量,用于配置 Apache 服务的端口号。

4.4 变量覆盖

值得注意的是,变量可以在多个级别进行定义和覆盖。在 Role 中,变量可以在 defaults/main.yml 中设置默认值,而在 Playbook 中也可以通过 vars 关键字来覆盖这些默认值。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软件无线电系列——模拟无线电、数字无线电、软件无线电

本节目录 一、模拟无线电 二、数字无线电 1、窄带数字无线电 2、宽带数字无线电 三、软件无线电本节内容 一、模拟无线电 20世纪80年代的模拟体制(美国的AMPS/欧洲的TACS)被称为第一代移动通信,简称1G,主要目标是为在大范围内有限的用户提供移动电话服务。最主要的…

React——react 的基本使用

前提:安装全局的脚手架,通过create-creat-app 项目名,我们创建好一个新项目,cd进去,通过npm start去运行该项目 注意:简单看下demo的配置,在根目录我们可以看到,没有任何webpack的…

【b站咸虾米】2 Vue基础(下) 2021最新Vue从基础到实例高级_vue2_vuecli脚手架博客案例

课程地址:【2021最新Vue从基础到实例高级_vue2_vuecli脚手架博客案例】 https://www.bilibili.com/video/BV1pz4y1S7bC/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 目录 2 Vue基础 下 2.8 计算属性 2.8.1 计算属性使用 2.8.2 计算…

整型变量的原子操作

什么是原子操作 原子操作(Atomic Operation)是指不可中断的操作,即在多线程环境下,当一个线程在执行原子操作时,不会被其他线程的调度和中断所影响。这种操作在多线程编程中尤为重要,因为它能保证操作的原…

Git如何清除账户凭证

场景:一般发生在Git用户变更的情况 1.git base 操作 Git会使用凭证助手 credential.helper来储存账户凭证,通过以下命令移除: git config --system --unset credential.helper 除了system系统级外,还有 global、local范围。 查…

直方图均衡化原理和实现

基本思想 将原始图像的直方图分布转换为一个均匀分布的直方图,这样原图中的高频率亮度值会被展宽,而低频率亮度值则被压缩,从而达到增强图像对比度的效果。 计算过程 假设我们有一个灰度图像,其像素值范围从0到L-1(…

云计算 3月11号 (NFS远程共享存储及vsftpd配置)

构建NFS远程共享存储 一、NFS介绍 文件系统级别共享(是NAS存储) --------- 已经做好了格式化,可以直接用。 速度慢比如:nfs,sambaNFS NFS:Network File System 网络文件系统,NFS 和其他文件…

关于使用elementUI中select和el-checkbox-group的回显问题

网上看到很关于这个的问题回显,各式各样,没有绝句自己的问题,总重问题出在数据格式上 select和el-checkbox-group el-checkbox 都是字符串数组格式:[12,13,....]; 我写的格式是id是选中的id组成的回显数据格式; 如…

Flutter 多语言自动化本地化生成器

Flutter 多语言自动化本地化生成器 这是一个为Flutter设计的插件,通过从Excel表格提取的CSV文件自动生成Dart本地化文件,以简化应用程序本地化的流程。这个工具通过自动化创建多语言资源文件,简化了开发人员和翻译人员的工作流程。 特点 默…

Android 录屏操作

Android 录屏操作 本文主要介绍android中如何通过MediaRecorder实现录屏操作的. 1: 申请权限 <uses-permission android:name"android.permission.RECORD_AUDIO" /> <uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE"…

react native常用插件

react-native-async-storage/async-storage 说明&#xff1a;AsyncStorage 是一个在 react-native 中轻量存储的库&#xff1b;跟 localStorage 类似&#xff0c;API 也几乎一样&#xff1b;存储的时候需要将存储内容转成字符串存储。 react-navigation/material-bottom-tabs …

Python Web开发记录 Day9:Django part3 用户管理

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 1、数据库准备2、用户列表3、新建用户4、编辑用…

基于YOLOv8深度学习的脑肿瘤智能检测系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标检测、智慧医疗

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

发布一个npm包到 Nexus私有仓库

前文&#xff1a;使用nexus3搭建npm私有仓库 1、前置条件 git、 nvm、nrm、monorepo 的概念&#xff0c;以及 lerna 的使用、 yarn 的使用 基于 lerna yarn 的 monorepo 仓库 lerna npm i -g lernamac : zsh: command not found: lerna brew install lerna2、添加nexus权…

IDEA中配置Tomcat

文章目录 一、创建Web项目二、配置tomcat三、启动Tomcat 一、创建Web项目 1.首先我们要用IDEA创建一个普通的java项目。 2.我创建的项目名称为myTomcat&#xff0c;想要开发web程序&#xff0c;我们还要做一下操作。 首先我们先给项目添加框架支持...&#xff0c;我的 idea 版…

ASP.NET

Web控件 Web控件-内部控件 ASP.NET引入一组称为”内部控件”的新控件&#xff0c;它们专门用于ASP.NET 内部控件的使用方法与HTML控件相同&#xff0c;它们映射到HTML元素并通过使用 runat”server”属性在服务器上执行 Web控件-列表控件 这些控件用于在Web页中创建数据列表…

uniapp移动端 IOS系统下无法与webview通信

不知道有没有人遇到过这个问题 我的页面嵌套了一个webview&#xff08;文件位于项目的hybrif/html&#xff09;目录下 使用evalJS与webview进行通信 代码如下 在安卓里运行是没问题的&#xff0c;但在苹果手机上一直无法通信 连接真机&#xff0c;打印evalJS是个方法&#xf…

【matlab】如何将.mat文件与.nii文件互转

【matlab】如何将.mat文件与.nii文件互转 .mat转为.nii文件 有时候代码需要读取的是.nii文件&#xff0c;但是如何现有的数据是.mat格式&#xff0c;需要将.mata转化为.nii文件 1、先加载.mat文件 % 加载.mat文件 load(your_mat_file.mat); % 请将your_mat_file.mat替换为实…

中创ET4410台式电桥固件升级工具(修复了列表扫描的BUG)

中创ET4410台式LCR数字电桥固件升级工具和最新版固件&#xff08;修复了列表扫描的BUG&#xff09; 中创ET4410 台式LCR数字电桥 简单开箱测评&#xff1a;https://blog.zeruns.tech/archives/763.html 之前买的中创ET4410台式LCR数字电桥固件有BUG&#xff08;胜利的VC4090C…

鸿蒙 Harmony 初体验

前言 看现在网上传得沸沸扬扬的鸿蒙&#xff0c;打算弄个 hello world 玩一下, 不然就跟不上时代的发展了 环境安装 我的环境 Windows 11 家庭中文版HarmonyOS SDK (API 9)DevEco Studio (3.1.1 Release)Node.js (16.19.1) 开发IDE下载 官方下载链接 配置 nodejs 这里帮…