Linux云计算运维架构师(连载)-自动化运维ansible-12

1.1 YAML语言

1.1.1 YAML概述

YAML是“YAML Ain't a Markup Language”(YAML不是一种标记语言)的递归缩写,通常在Ansible配置中都需要使用YAML语言,其文件后缀为.yml或.yaml。

YAML的语法和其他高级语言类似,有自己的逻辑及语法要求,具体如下所示。

l 基本语法

² 大小写敏感。

² 使用缩进表示层级关系。

² 缩进不允许使用tab,只允许空格。

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

² “#”表示注释。

l 数据类型(YAML支持的数据类型)

² 对象:键值对的集合,又称为映射(mapping)、哈希(hashes)、字典(dictionary)。

² 数组:一组按次序排列的值,又称为序列(sequence)、列表(list)。

² 纯量(scalars):单个的、不可再分的值。

1.1.2 YAML对象

在YAML中,对象键值对使用冒号结构表示,并且在冒号的后方需要加一个空格,其语法如下所示。

key: value

除了一对一的定义之外,YAML也支持通过一个对象名称表示多个键值对,语法结构如下所示。

key: {key1: value1,key2: value2,...}

若想要表示对象间的层级关系,可以使用缩进来完成,语法如下。

key:

child-key1: value1

child-key2: value2

1.1.3 YAML数组

在YAML的配置文件中,以“-”开头的行表示构成一个数组,如下所示。

- A

- B

- C

YAML支持多维数组,可以在行内表示,结构如下所示。

key: [value1, value2, ...]

此处通过一个例子来进行说明,示例如下所示。

Classroom:

-

id: 2021001

name: xiaoming

-

id: 2021002

name: xiaohua

该段代码定义的classroom是一个数组,该数组由id及name两个属性构成。

1.1.4 playbook

使用Ansible完成一个任务时,往往需要多条命令来进行组合。例如部署httpd服务,需要多个模块(一个模块也可以称之为task)提供功能来完成,而playbook就是组织多个task的容器。简单来说,playbook就算一个采用YAML实现的,有着特定的组织格式的文件。playbook可以定制配置,可以按照指定的操作步骤有序执行,支持同步和异步方式。

playbook的基础组件如下所示。

l Hosts:运行执行任务(task)的目标主机。

l remote_user:在远程主机上执行任务的用户。

l tasks:任务列表。

l handlers:任务,与tasks不同的是只有在接受到通知时才会被触发。

l templates:使用模板语言的文本文件,使用jinja2语法。

l variables:变量,变量替换{{ variable_name }}。

1.2 playbook实例

下面将通过YAML语言编写一个简单的playbook。

1.2.1 准备工作

(1)清理环境

清理环境,将客户机中原有的Apache进行删除,代码及结果如下所示。

[root@ansible ~]# ansible all -m yum -a 'name=httpd state=removed' -o

host1 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "msg": "", "rc": 0, "results": ["httpd is not installed"]}

host2 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": true, "changes": {"removed": ["httpd"]}, "msg": "", "rc": 0, "results": ["已加载插件:fastestmirror\n正在解决依赖关系\n--> 正在检查事务\n---> 软件包 httpd.x86_64.0.2.4.6-97.el7.centos 将被 删除\n--> 解决依赖关系完成\n\n依赖关系解决\n\n================================================================================\n Package 架构 版本 源 大小\n================================================================================\n正在删除:\n httpd x86_64 2.4.6-97.el7.centos @updates 9.4 M\n\n事务概要\n================================================================================\n移除 1 软件包\n\n安装大小:9.4 M\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n 正在删除 : httpd-2.4.6-97.el7.centos.x86_64 1/1 \n 验证中 : httpd-2.4.6-97.el7.centos.x86_64 1/1 \n\n删除:\n httpd.x86_64 0:2.4.6-97.el7.centos \n\n完毕!\n"]}

host3······此处省略部分代码······

(2)准备Apache的配置文件

清理完成后,在Ansible服务器中安装Apache,以便获取Apache服务的配置文件,代码如下所示。

[root@ansible ~]# yum install -y httpd

······此处省略部分代码······

已安装:

httpd.x86_64 0:2.4.6-97.el7.centos

作为依赖被安装:

httpd-tools.x86_64 0:2.4.6-97.el7.centos

完毕!

安装完成后,创建一个名为apache的文件夹,并将apache的配置文件拷贝到该目录作为备用,具体代码如下所示。

#创建目录

[root@ansible ~]# mkdir apache

#进入目录

[root@ansible ~]# cd apache

#复制配置文件到当前路径

[root@ansible apache]# cp -rf /etc/httpd/conf/httpd.conf .

Apache默认工作在80端口,此处将其修改为8080,便于后续观察实验效果。修改完成后可以通过grep命令进行查看,具体如下。

[root@ansible apache]# grep '^Listen' httpd.conf

Listen 80

#修改端口为8080,大概在第42行左右

[root@ansible apache]# vim httpd.conf

[root@ansible apache]# grep '^Listen' httpd.conf

Listen 8080

[root@ansible apache]#