3-1·Ansible实施部署playbooks、批量管理、YAML语言

时间:2022-09-16 22:19:28

三·Implementing Playbooks

1)YAML简介

● ansible playbook 的编写使用YAML Ain’t Markup Language 语言
● Yaml设计为用于表示数据结构,如列表和关系组,它采用易于编写、方便理解的格式
● 达成目标主要是通过摒弃传统包围式语法,方括号、大括号等
● 在YAML中,数据层次结构通过使用大纲缩进
● YAML文件使用可选的三短划线表示文档开始,以及可选的三局点表示文档结束
● 在文档开始和结束之间,数据结构通过一种大纲格式表示,将空格字符用于缩进
● 对于用于缩进的空格字符数量没有严格要求,但是数据元素的缩进量必须超过其父级
● 处于数据层次结构中同一级别的数据元素必须具有相同的缩进量
● 可以添加空行满足可读性
● 缩进只能通过空格字符实现,缩进对YAML的正确解释十分重要
● 由于各种编辑器和工具以不同的方式处理TAB制表符,因此YAML禁止将制表符用于缩进

---
title: My book

author:
first_name: Join
last_name: Doe

publish_date: 2018.01.16

chapters:
- number: 1
title: Chapter 1 Title
pages: 10

- numbre: 2
title: chapter 2 Title
pages: 7
...

2)在 Ansible playbook使用YAML开始于结束标志

● 编写playbook仅要求掌握YAML语法的基本知识
● YAML文件的开头是由三个端划线组成的开始标志,可选
● YAML文件的结尾是由三个句点组成的文档结束标志着,可选

3)在Ansible playbook中使用YAML字符串string

● 在YAML中的字符串不要求放在引号里,即使字符串中包含空格
● 如果需要字符串可以做双引号与单引号扩起

this is a string 
'this is a string'
"this is a string"

● 编写多行字符串有两种方式。一种是使用竖线(|)字符表示保留字符串中的换行符
● 另一种方式是,使用大于号(>)字符来表示换行字符转换成空格,且行前的空白将被删除

include_newlines:  |
Example Company
123 Main Street
Atlanta , GA 30303

4)Ansible playbook 中使用YAML字典

● YAML使用的key/value 键值对也成为字典、散列或关联数组
● 在key/value中,键与值通过由冒号和空格组成的分隔符隔开
● 字典通常以缩进的块格式表示
● 字典也可以使用内嵌块格式表示,其中多个key/value 用花括号扩起,并用逗号和空格隔开
● key: value

---
name: Automation using Ansible
code: 407
---
{name: Automation using Ansible, code: 407}

5)在Ansible playbook中使用YAML列表

● 在YAML中,列表类似于其他编程语言中的数组
● 为表示一组列表项,使用一个短划线加一个空格作为每个列表项的前缀
● 列表也是可以使用内嵌块格式表示,其中多个列表项用方括号扩起并由逗号和空格隔开

---
- red
- green
- blue
---
fruits
[red, green, blue]

6) 在Ansible playbook中使用YAML注释

● 注释用于提高可读性
● 在YAML中,注释以(#) 开头,可存在与任何行(空行或非空行的末尾)
● 如果在非空行的中使用,需要在井号前加一个空格

# this is a comment
some data # this is also Yaml comment

7)验证YAML语法 -Python

● playbook中的YAML语法错误将导致运行失败
● 失败时,输出可能指出语法错误,也只是可能
● 建议验证playbook在执行
● 一种方法验证playbook中的语法是,使用Python读取playbook YAML文件。要求安装PyYAML软件包

python -c 'import yaml, sys; print yaml.load(sys.stdin)' < myyaml.yml

● 如果报错将会指出

8)验证YAML语法

● 对不熟悉python的管理员,网上提供许多YAML验证工具
● 其中[http://yamllint.com]
● 将playbook中的YAML内容复制并粘贴到网站首页表单中,然后提交
● 网页将报告语法验证结果,同时显示原始=内容格式化版本
● 提交正确的YAML内容后,则输出valid YAML!
● 如果错误输出“(<unknow>:could not find ..........)”

9) 验证YAML语法Ansible命令行工具

● Ansible提供了一个原生功能,供管理员用于验证playbook中的YAML语法
● ansible-playbook 命令用于执行playbook ,它含有可检查语法错误的 –syntax-check选项
● 使用ansible-playbook验证语法是检验Ansible playbook内YAML语法的首选方法
● 此方法将执行更严格的检查,确保专用于Ansible playbook 的必要数据元素不会缺少

ansible-playbook myyaml.yml

10)模块简介

● 模块是Ansible用于对受管主机执行操作的程序,模块设计为执行特定的操作的即用型工具
● 模块可以从ansible命令行执行,或者在playbook中用于执行任务。在运行时,模块将复制到受管主机上并在哪里执行
● ansible打包了400多个模块供用户选择。这些预打包的模块可用于执行各式各样的任务,如云管理,用户管理,软件包管理,服务管理

11)核心模块、附加模块和自定义模块

ansible有三种模块
1.核心模块随Ansible提供,有ansible团队开发维护。核心模块是最为重要的模块,用于常见的管理任务
2.附加模块目前随ansible提供,但未来可能会升级为核心模块。负责维护通常不是ansible团队,而是社区。通常而言,这些模块实施用于管理OpenStack等最新技术的功能
3.自定义模块是由最终用户开发的模块,不随ansible提供。如果现有模块不适合某任务,管理员可编写自定义模块来实施

● 核心模块和附加模块始终都能使用。ansible在控制节点上在$ANSIBLE_LIBRARY 环境变量定义的目录中,查找自定义的模块,如果未设置此变量,则有当前Ansible配置文件中的library参数定义。ansible也会相对于playbook使用位置的./library目录中查找模块

library =  /usr/share/my_modules/

12)模块类别:

  1. 集群
  2. 命令
  3. 数据库
  4. 文件
  5. 清单
  6. 消息
  7. 监控
  8. 网络
  9. 通知
  10. 打包
  11. 源控制
  12. 系统
  13. 实用程序
  14. Web基础架构
  15. 窗口
    ● 在ansible网站上,模块文档按照以上类别列表索引,方便管理员搜索合适其具体任务的模块
    ● 在红帽企业Linux7系统上,模块存放/usr/lib/python2.7/site-packages/ansible/modules中。核心模块和附加模块储存单独目录中,这两个目录中的模块分别组织在类别子目录中

13)模块文档

● 若要熟悉可用模块,管理员可以查阅Ansible文档网站docs.ansible.com
● 网站上管理员可以搜索适用于不同功能的模块
● 对于每一个模块,ansible文档网站提供了其功能摘要,以及关于如何通过模块的选项来调用各项具体功能的说明,文档还提供了实用的事例,演示各个模块及其选项的用法
● 模块文档也在Ansible控制节点上,使用ansible-doc命令访问
● 要查看控制节点的可用模块列表,运行ansible-doc -l 命令。将显示模块名称和功能概要
● 若要显示特定模块的详细文档,可将模块名称传递至ansible-doc。与ansible文档网站一样,该命令提供模块功能概要、不同选项的详细信息,以及示例。

$  ansible-doc yum

ansible-doc命令提供-s (–snippet)选项,他会生成示例输出,可以充当如何在playbook中使用特点模块的规范。输出包含注释,提醒管理员各个选项的用法。下列展示

$  ansible-doc -s yum

14)调用模块

● 使用ansible模块的方式有多种,具体取决于管理员的要求
● 使用ansible命令;作为临时命令的一部分来调用模块,管理员可利用-m指定模块名称,一下命令使用ping模块测试与受管主机的连接。此模块连接受管主机并进行身份验证,然后检验是否满足ansible的python要求

$  ansible -m ping all 

也可以在playbook中作为task的部分来调用模块。

tasks: 
- name: Installing!
yum:
name: postfix
state: latest

15)playbook和临时命令

● 临时命令不适合复杂配置管理或编配场景
● 临时命令一次只能调用一个模块和一组参数。当需要多个操作时,必须使用多个临时命令执行
● playbook是描述要在受管主机上实施的必要配置或程序性的文件。playbook为配置管理和部署提供了强大灵活的方案。playbook可以将冗长而复杂的管理任务转变为可轻松重复的历程,并且可以预测结果

16)playbook基础知识

● playbook是以YAML格式编写的文本文件,与puppet等其他管理工具采用的语言相比,playbook使用的语法更加容易和掌握
● ansible playbook 包含play,每个play负责定义要对特定的一组受管主机执行一系列的操作。这些操作称为任务,而受管主机称为主机
● 注意:playbook中内容的次序很重要,因为ansible按照顺序来执行play和任务
● 编写ansible playbook时注意,如果受管主机已在正确状态,责任务不去进行必要的更改。如果playbook运行一次可将主机置于正确的状态,则该playbook的编写应该使他运行二次也安全,不会对配置的系统进行进一步的更改,具有此属性的playbook是冥等的。大部分的ansible模块是冥等的,所以确保符合此要求相对容易
● 每一playbook可以包含多个play。因为一个play将一系列任务应用到一组向主机,而对另一组主机执行一系列任务就需要多个play实现
● 注意:虽然一个playbook可以定义多个play,但一个给定的YAML文件中只能定义单一的playbook。如果需要多个playbook,它们必须分别创建为单独的YAML文件

17)编写playbook:

● playbook文件可以使用YAML文档标志(—)开头,此标志为可选,定义playbook执行没有影响
● 与之对应,可以使用YAML文档终止符(…)终止文件,也是可选;如果不存在,则文件的末尾将自动生成
● 在playbook文件中,play以列表上下文形式表示,其中每一个play使用YAML字典数据结构来定义。因此,每一个play的开头为一个端划线加一个空格

- 

● 在一个play中,管理员可以定义各种属性。属性定义包含属性名称,后接冒号和空格(: ),在后面是属性值
attribute: value
● 根据YAML语法,一个play中的每一个属性都需要空格缩进,使其处于同一级缩进上,从而表示他们在数据结构层次里的位置。
● 下列显示了两个属性如和缩进,并指示他们与父play的关系,第一个条目里的短划线使用列表项语法标记play开头;第二个条目利用空格缩进到与第一个条目的相同缩进级别,从而传达这两个属性引用同一个父play

---
- name: haha
age: 17

18)名称属性:

● name属性可用于play提供标签,这是可选属性,但建议为所有的任务加上标签。这在playbook中包含多个play时特别有用

name:  my first play

19)主机属性

● 利用hosts属性定义要对其执行任务的一组受管主机。由于此组件是play概念中不可缺少的部分,因此每个play中都必须定义主机属性。主机属性通过使用主机模块定义,引用清单中的主机

hosts:  webservers

20)用户属性:

● playbook中的任务通常通过网络连接多受管主机执行。与临时命令相同,用于这些任务执行的用户账号取决于ansible配置文件/etc/ansible/ansible.cfg中的参数。执行任务的用户可以通过remote_user参数定义,不过,如果启用了特权升级,become_user等其他参数也会发生作用
● 如果用于任务执行的Ansible配置中定义的远程用户不合适,可以通过在play中使用remote_user属性覆盖

remote_user: devops

21)特权升级属性:

● 特提供额外的属性,从而在playbook内定义特权升级参数。become布尔值参数可用于启动或禁用特权升级,无论在ansible配置文件如何定义

become:  Ture/False

● 如果启用了特权升级,可以使用become_method属性来定义play期间所要使用的特权升级的方法sudo

become_method:  sudo

此外,启用特权升级时,become_user属性可以定义play上下文内用于特权升级的用户

become_user:  root 

22)任务属性

● play的主要组成部分是在受管主机上执行的操作,它们使用tasks属性进行定义。此属性定义一个字典列表。任务列表中的每一项任务包含一组键值对
● 下例中,tasks列表包含单一任务项,任务项的第一个条目定义该任务的名称,第二个条目调用service模块,并将其参数作为值提供

tasks:
- name: first task
service: name=httpd enabled=true

● 在上例中,第一个条目中的短划线标记与该任务相关的属性列表开头。第二个条目利用空格缩进到与第一个条目相同的缩进级别,从而传达出这两个属性引用同一个父任务
● 如果需要多项任务,可对每一任务使用相同语法

tasks:
- name: 1234
service:
name: httpd
- name: 5678
service:
name: mysql

23)注释

可以在ansible playbook中添加注释。playbook中的注释以(#)开头,应当在playbook全文中使用注释,增强可读性和文档性

#  this is a comment

24)playbook格式化:

● 有多个额外的选项可用于格式化playbook。这些选项可用改进playbook内容可读性
● playbook中的任务字典包含键值对条目,其中键是被调用的模块名称,而值则是需要传递给模块的参数列表,根据具体情境,参数列表可能很长,在这样的情形中,可以应用两种格式化选项

1.多行格式化:
较长的模块参数可以使用多行格式断行,使用这种格式时,行需要通过空格来断行,并且延续行需
要通过空格进行正确的缩进,延续行必须使用足够数量的空格缩进,使缩进别超过第一行

2.字典格式化:
处理较长模块参数的另一种方法是使用YAML的字典结构来格式化他们。使用这种格式时,作为参数传递的选项/值对转换为字典条目。这些条目需要使用空格缩进到超过模块条目的缩进级别,以指出他们是从属于他们的子项。

25)块:

● 复杂的playbook可能会包含一个长任务列表,列表中的一些任务可能在功能上关联
● 在ansible版本2.0中,块为任务组织提供了另一选择,块可用于相关的任务分组到一起,这不仅可改善可读性,也能在编写更为复杂的playbook时在块级别上执行任务参数

26)多个play:

● 如前文中,一个playbook可以包含一个或多个play。由于play将受管主机映射到任务,在要求对多个不同主机执行多项不同任务的情境中,比如编配,就要使用不同的play。不必将各个play放入单独的play文件中,多个play可以一起放入同一个playbook文件中,play列表上下文形式表示,因此每一个play的开头用前导短划线和空格表示

27)执行playbook

● 使用ansible-playbook命令执行playbook。该命令在控制节点上执行
● 在执行playbook时,将生成输出来显示所有执行的play和任务,输出中也会报告执行的每一项结果

$   ansible-playbook site.yml 

28)语法验证

● 在执行playbook之前,最后好进行验证,确保内容无误

$  ansible-playbook --syntax-check  site.yml

● 语法失败时将会报告错误(无法坚持模块内参数是否正确)

29)执行空运行

● -C选项。这会使ansible报告在执行该playbook时将会发生什么更改,但不会对受管主机进行任何实际更改

$  ansible-playbook -C  site.yml

30)逐步执行(debug)

● 再部署新的playbook时,以交互方式执行playbook或许会有帮助,–step选项
● 使用此选项执行时,ansible逐步递进playbook中的任务,在执行每一项任务前,他会提示用户输入。用户可以选择”y“执行任务或”n“跳过任务,或者”c“退出逐步执行,以非交互继续执行剩余任务