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]#