三、Ansible之playbook

一、Ad-Hoc问题

通过对AD-HOC的学习,我们发现AD-HOC每次只能在被管理节点上执行简单的命令。

而日常的工作中,我们往往面临的是一系列的复制的操作,例如我们有可能需要安装软件、更新配置、启动服务等等一系列的操作的结合。此时再通过AD-HOC去完成任务就力不从心了。

在这种场景下,Ansible引入了playbook来帮我们解决这个问题。

二、playbook是什么?

PlayBook 也被大家翻译成剧本。

可以认为它是Ansible自定义的一门语言(可以将playbook比作Linux中的shell,而Ansible中的Module可以比作Linux中的各种命令)。

三、YAML 学习

Playbook遵循YAML语法格式。

因此在学校Playbook前,我们必须弄清楚yaml的语法。

1.YAML特点

YAML 文件以 # 为注释符
YAML 文件以 .yml 或者.yaml 结尾
YAML 文件以 --- 开始,以 ... 结束 但是开始和结束的标识都是可选的

2.基本语法

  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进时使用Tab键还是空格要一定要一致,建议使用空格
  • 相同层次的元素必须左侧对齐即可

YAML 支持的数据结构有三种

  • 字符串
  • 列表
  • 字典

2.1 字符串

---
# YAML 中的字符串可以不使用引号,即使里面存在空格的时候,当然了使用单引号和双引号也没有错
this is a string
'this is a string'
"this is a string"

# YAML 中如果一行写不下你要表述的内容的时候,可以进行折行。写法如下:
long_line: |
    Example 1
	Example 2
	Example 3

# 或者
long_line: >
    Example 1
	Example 2
	Example 3

2.2 列表

---
# 若熟悉python的话,可以认为它就是python中的list,若熟悉 C语言的话,可以认为它是 c中的数组
# 如何定义:以短横线开头 + 空格 + 具体的值
- red
- green
- blue
# 以上的值假如转换成python中的list会是这样:
# ['red','green','blue']

2.3 字典

---
# 若熟悉python的话,可以认为它就是python中的Dict
# 如何定义:key + 冒号(:) + 空格 + 值(value),即 key: value

name: Using Ansible
code: D1234

# 转换为 python 的 Dict
# {'name': 'Using Ansible', 'code': 'D1234'}

2.4 混合结构

以上,针对 YAML 的所有基础知识点就介绍完了,但日常生活中,往往需要的数据结构会特别复杂,有可能会是字符串、列表、字典组合形式。

例如:
所有人都上过学,都知道学校是以班级为单位。我们去使用列表和字典的形式去描述一个班的组成。

---
class: 
  - name: stu1
    num: 001
  - name: stu2
    num: 002
  - name: stu3
    num: 003

# {'class': [{'name': 'stu1', 'num': 1 }, {'name': 'stu2', 'num':2}, ...]}

2.5 验证 YAML 语法

# YAML 文件,通过 python 的 YAML 模块验证,若不正确则报错,若正确则会输出 YAML 里的内容。
# 注意使用时,一定确保安装了yaml的安装包
python -c 'import yaml,sys; print yaml.load(sys.stdin)' < myyaml.yml
python3 -c 'import yaml,sys; print (yaml.load(sys.stdin))' < myyaml.yml

练习

# 正确的情况
# cat myyaml.yml
---
- red
- green
- blue

...
[root@ansible-01 ~]# python -c 'import yaml,sys; print yaml.safe_load(sys.stdin)' < myyaml.yml
['red', 'green', 'blue']

# 错误的情况下
# cat myyaml.yml
---
- red
- green
-blue

[root@ansible-01 ~]# python -c 'import yaml,sys; print yaml.safe_load(sys.stdin)' < myyaml.yml
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/lib64/python2.7/site-packages/yaml/__init__.py", line 93, in safe_load
    return load(stream, SafeLoader)
  File "/usr/lib64/python2.7/site-packages/yaml/__init__.py", line 71, in load
    return loader.get_single_data()
  File "/usr/lib64/python2.7/site-packages/yaml/constructor.py", line 37, in get_single_data
    node = self.get_single_node()
  File "/usr/lib64/python2.7/site-packages/yaml/composer.py", line 36, in get_single_node
...

四、playbook的编写

1. play的定义

由于playbook是由一个或者多个play组成,那么如果我们熟悉play的写法,就自然掌握了我们这章内容

那么如何定义play呢?
1、每个play都是以短横杠开始的
2、每一个play都是一个YAML字典格式

根据上面两条play的规则,一个假象的play应该是下面的样子

---
- key1: value1
- key2: value2
- key3: value3
....

由于一个playbook是由一个或者多个play构成,那么一个含有多个play的playbook 结构上应该是如下的样子

---
# 一个含有3个play的伪playbook构成
- key1: value1
  key2: value2
  key3: value3
- key4: value1
  key5: value2
  key6: value3
- key1: value1
  key2: value2
  key3: calue3
  ...

2. play的属性

常用属性

  • name 属性:每个play的名字
  • hosts 属性:每个play涉及的被管理服务器,同ad hoc 中的资产选择器
  • tasks 属性:每个play中具体要完成的任务,以列表形式表达
  • become 属性:如果需要提权,则加上become属性
  • become_user 属性:若提权的话,提到哪个用户
  • remote_user 属性:指定连接到远程节点的用户,就是在远程服务器上执行具体操作的用户,若不指定,则默认使用当前执行ansible playbook的用户

3. 一个完整剧本

下面来看一个含有play的playbook应该是下面这样的

---
- name: the first play example
  hosts: all
  remote_user: root
  tasks:
    - name: install nginx package
	  yum : name=nginx state=present
	- name: copy nginx.conf to remote server
	  copy: src=nginx.conf dest=/etc/nginx/nginx.conf
	- name: start nginx server
	  service: 
	    name: nginx 
		enabled: true/yes
		state: started

4. tasks 属性中任务的多种写法

# 以启动 nginx 服务,并加入开机自启为例

# 一行的形式
service: name=nginx enabled=true statu=started

# 多行形式
service: name=nginx
         enalbed=true
		 state=started
 
# 多行写成字典的形式
service:
  name: nginx
  enabled: true
  state: started

5. 具有多个play的playbook

---
- name: manage web servers
  hosts: webservers
  remote_user: root
  tasks:
    - name: install nginx package
	  yum: name=nginx state=present
	- name: copy nginx.conf to remote server
	  copy: src=nginx.conf dest=/tmp/nginx/nginx.conf
	- name: start nginx server
	  service:
	    name: nginx
		enabled: yes|true
		state: started

- name: manager db servers
  hosts: db_servers
  tasks:
    -name: update database confg
	  copy: src=my.conf dest=/etc/my.conf
...

6. 如何对playbook进行语法校验

# ansible-playbook - hosts myplaybook.yml --syntax-check

因为Playbook属于YAML格式,我们同样可以检查YAML语法格式的方法进行检查playbook的语法的正确性

7. 如何允许playbook

# ansible-playbook -i hosts myyaml.yml

8. 如何单步跟从调试playbook

# 执行task中的任务,需要手动确认是否往下执行
ansible-playbook -i hosts  my_nginx.yml --step

9. 如何测试允许playbook

# 执行完整的playbook,但是使用Task上的行为都不会在远程服务器上执行,所有执行都是模拟行为
ansible-playbook -i hosts  my_nginx.yml -C
-C 为大写字母C
posted @ 2021-10-28 21:04  锦书致南辞  阅读(922)  评论(0编辑  收藏  举报