ansible自动化运维详解(四)ansible中playbook的编写使用、执行命令及实例演示

一、playbook的功能简介

如之前博客中所述,ansible有以下两种管理方式:
1)Ad-Hoc命令:利用ansible命令直接完成管理,主要用于临时命令这一使用场景。
2)playbook脚本:ansible脚本,主要用于大型项目场景,需要前期的规划。

Ad-Hoc命令在之前的实验中详细介绍并大量使用过,具体可参考ansible自动化运维详解(二)等,这里我们将对playbook脚本这第二种管理方式进行详细介绍。

playbook是ansible的配置、部署、编排语言,不同于使用Ansible命令行执行方式,其功能更加强大灵活,它可以被描述为一个需要希望远程主机执行命令的方案,或者一组IT程序运行的命令集合。当对一台机器做环境初始化、服务部署的时候,往往需要做多个动作,这时使用playbook会更加合适,通过playbook我们可以一次在多台机器执行多个指令。这种预先设计的配置保持了机器的配置统一,同时也可以很简单的执行日常任务。简而言之,playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在的模式,可作为部署复杂应用程序的基础。

二、YAML语言

2.1、YAML简介

playbook可以理解为组织多个任务指令(task)的容器,它的实质就是一个文件,有着特定的组织格式,其采用的语法格式是YAML语言。YAML是一种可读性高,用来表达数据序列化的格式,专门用来写配置文件,比 XML 或 JSON 等其他常见数据格式更易于人类读写。

2.2、YAML特点

YAML标记语言具有:可读性好、和脚本语言交互性好、易于实现、适用于程序执行流梳理方式、可扩展性强等特点。

2.3、YAML语法

(1)所有 YAML 文件用 [---] 表示文件内容开始,次行开始书写文件内容;
(2)所有 YAML 文件用 [...] 表示文件内容结尾;
(3)YAML 文件大小写敏感,其使用缩进表示层级关系,缩进严格,缩进的空格数目不重要,只要相同层级的元素左侧对齐即可;
(4)YAML 支持的数据结构有三种:

对象键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
纯量(scalars):单个的不可再分的值,如字符串、布尔值、整数、浮点数、Null、时间、日期

YAML 文件中的 key / value 键值对可以多行书写,也可以一行书写,在一行书写用隔开,其中 value值可以是个字符串,也可以是一个list列表。

YAML列表/字典书写方式示例:
1、单行书写列表:
[Linux,C++,Java,Python] 
多行书写列表:
- Linux 
- C++ 
- Java 
- Python

2、单行书写字典(存放键值对):
- file: {path: /mnt/yaofile, state: touch} 
多行书写字典:
- file: 
	path: /mnt/yaofile   
	state: touch

(5)一个play需要包括name和tasks,name是命名描述,tasks是动作;
(6)同一任务命名name里,只能引用一个模块即只能有一个任务task,想要执行多个task可以添加多个任务列表(破折号-代表为一个任务列表);
(7)YAML 文件的扩展名称为ymlyaml

三、playbook的核心组件

playbook脚本文件中的三个核心组件为:

组件含义
name命名描述,选择性书写,建议使用,多用于进行任务说明
hosts受控主机列表
tasks任务,用于选择执行部分代码

四、playbook执行命令

playbook脚本文件的执行命令为:ansible-playbook xxx.yml (可以后跟参数),执行命令时一些常用参数如下:

常用参数含义
- - check 或 - C进行预执行检测
- - syntax-checkcheck language,检查文件中语法有没有问题
- - list-hosts列出受控主机列表hosts
- - list-tags列出任务标签tag
当playbook有很多任务,而我们只想执行其中的一部分任务或一类任务时,我们可以借助 tags 对任务进行“”打标签”,在执行 playbook 时借助标签指定执行某些任务
- - list-tasks列出任务列表task
- - limit指定执行主机
- v、- vv显示任务执行过程的详细信息(v的个数越多越详细)

实验步骤:
1、这里仍然是利用我们之前一直使用的两台rhel8.2版本的虚拟机进行演示,westos_ansible(172.25.33.100)为控制主机,westos_node1(172.25.33.200)为受控主机。在控制主机切换到用户lee,进入其用户家目录下的ansible目录,在该用户级ansible操作环境下进行实验配置,编写playbook脚本文件test.yml
在这里插入图片描述
test.yml文件内容如下:在所有受控主机中调试输出hello westos
在这里插入图片描述
执行该playbook脚本文件,引用 - - syntax-check参数检查文件中语法有没有问题,可以看到语法检查不通过,错误处被标注出来,该处缩进不正确
在这里插入图片描述
编辑test.yml文件,将debug模块处的缩进与其相同层级name的左侧对齐
在这里插入图片描述
再次执行上述命令,可以看到语法检查成功通过
在这里插入图片描述
2、执行该playbook脚本文件,引用 - - check参数对该yml文件进行预执行检测,文件可以成功执行并输出显示指定调试信息
在这里插入图片描述
3、执行该playbook脚本文件,引用 - - list-hosts 参数列出该yml文件中的受控主机列表,可以看到命令执行成功,所显示的受控主机列表与清单中一致
在这里插入图片描述
4、执行该playbook脚本文件,引用 - - list-tasks 参数列出该yml文件中的任务列表,可以看到命令执行成功,所显示的任务列表与文件中书写的一致
在这里插入图片描述
5、编辑清单,将控制主机也作为一台受控主机加入到原来受控主机所在的同一westos组里,接着编辑test.yml文件,将文件中受控主机列表hosts的值修改为westos,同时添加一个任务列表查看所有受控主机的域名
在这里插入图片描述
执行该playbook脚本文件,引用 - v 参数显示任务执行过程的详细信息,可以看到命令执行成功,任务执行过程的详细信息中显示了westos组所有主机的域名
在这里插入图片描述
6、执行该playbook脚本文件,引用 - - limit 参数指定只在172.25.33.100主机上执行,可以看到命令执行成功
在这里插入图片描述

实例:安装部署FTP/vsftpd服务

实验步骤:
1、vim设定技巧:考虑到YAML对缩进的严格要求,为了便于编写playbook文件避免手动敲空格,我们可以编辑用户级vim配置文件~/.vimrc(只针对脚本编写者自己生效)进行如下设定:

autocmd FileType yaml setlocal ai ts=2 sw=2 et
setlocal	##设定当前文件
ai			##自动退格对齐 auto indent
ts			##tab键长度为2空格 tabstop=2
sw			##缩进长度为2 shiftwidth=2
et			##把tab键变成空格 expandtab

在这里插入图片描述
2、在控制主机lee用户家目录下的ansible目录中编写vsftpd安装部署脚本文件install_vsftpd.yml:在westos组内的所有受控主机(172.25.33.200)中,首先调用dnf模块指定安装FTP/vsftpd服务的最新软件包;接着调用lineinfile模块修改vsftpd服务的配置文件来配置vsftpd服务,使用regexp参数匹配配置文件/etc/vsftpd/vsftpd.conf中的"anonymous_enable=NO",将该行替换为"anonymous_enable=YES",启动匿名用户的访问功能,当内容无匹配规则时不对文件做任何更改;修改完配置文件后调用service模块重启vsftpd服务并设置其为开机自启动;最后调用firewalld模块在受控主机防火墙策略中设置永久允许ftp服务,并令设置立即生效

##install_vsftpd.yml
---
- name: install vsftpd
  hosts: westos
  tasks:
  - name: install vsftpd
    dnf:
      name: vsftpd
      state: latest
  - name: configure vsftpd
    lineinfile:
      path: /etc/vsftpd/vsftpd.conf
      regexp: "anonymous_enable=NO"
      line: "anonymous_enable=YES"
      backrefs: yes
  - name: start vsftpd
    service:
      name: vsftpd
      state: restarted
      enabled: yes
  - name: configure firewalld
    firewalld:
      service: ftp
      permanent: yes
      state: enabled
      immediate: yes

在这里插入图片描述
3、执行该vsftpd安装部署脚本文件install_vsftpd.yml,可以看到命令执行成功
在这里插入图片描述
4、由于真实主机中安装有lftp(ftp协议文本浏览器),此时我们可以通过lftp ip成功访问受控主机ftp服务的默认共享目录/var/ftp,至此使用playbook脚本在受控主机安装部署FTP/vsftpd服务成功
在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐