自动化运维工具AnsiblePlaybook

博观而约取,厚积而薄发。这篇文章主要讲述自动化运维工具AnsiblePlaybook相关的知识,希望能为你提供帮助。
PlayBook简介而日常工作中,我们往往面临的是一系列的复杂操作,例如我们有可能需要安装软件、更新配置、启动服务等等一系列操作的结合。此时再通过 AD-HOC 去完成任务就有些力不从心了。
在这种场景下,Ansible引进了 PLAYBOOK 来帮忙我们解决这样复杂问题。
可以认为它是Ansible 自定义的一门语言(可以将 Playbook 比作 Linux 中的 shell,而 Ansible 中的 Module 可以比作为 Linux 中的各种命令。)


安装

[root@localhost ~]# yum -y install python2-pip
[root@localhost ~]# pip install pyyaml

YAML介绍
  • PlayBook遵循YAML 的语法格式。
YAML特点
  • 以 # 为注释符
  • 以 .yml 或者.yaml 结尾
  • 以 --- 开始 , 以 ... 结束, 但开始和结束标志都是可选的
基本语法
  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进时是使用Tab键还是使用空格一定要达到统一,建议使用空格。
  • 相同层级的元素必须左侧对齐即可
支持的数据结构
  • 字符串
  • 列表
  • 字典
字符串
---
# 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
...

列表
---
# 若熟悉 Python 的话, 可以认为它就是Python中的List ,若熟悉 C 语言的话, 可以认为它是 C 中的数组。
# 如何定义: 以短横线开头 + 空格 + 具体的值
- red
- green
- blue

# 以上的值假如转换成 python 的 List 会是这样:
# [red, green, blue]
...

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

name: Using Ansible
code: D1234

# 转换为 python 的 Dict
# name: Using Ansibel, code: D1234
...

混合结构
  • 在日常生活中,往往需要的数据结构会特别复杂,有可能会是字符串、列表、字典的组合形式。
---
class:
- name: stu1
num: 001
- name: stu2
num: 002
- name: stu3
num: 003
# class: [name: stu1, num: 1,name: stu2, num: 2,...]
...



验证YAML语法
  • 将YAML文件,通过 Python 的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



Playbook 的编写  Play 的定义
  • Playbook 是由一个或者多个Play组成
  • 1、每一个Play 都是以短横杠开始的
  • 2、每一个Play 都是一个YAML 字典格式
---
- key1: value1
key2: value2
key3: value3
...

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



Play 属性
  • Play中的每一个key,比如 key1, key2 等;这些key在PlayBook中被定义为Play的属性。
  • 这些属性都具有特殊的意义,我们不能随意的自定义Play 的属性。


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


完整剧本实例
---
- name: the first play example
hosts: webservers
remote_user: root
tasks:
- name: install nginx package
yum: name=nginx state=present
- name: copy nginx.conf to remote server
copy: src=https://www.songbingjia.com/android/nginx.conf dest=/etc/nginx/nginx.conf
- name: start nginx server
service:
name: nginx
enabled: true
state: started
...

tasks 属性多种写法
# 以启动 nginx 服务,并增加开机启动为例
# 一行的形式:
service: name=nginx enabled=true state=started

# 多行的形式:
service: name=nginx
enabled=true
state=started

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

多个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=https://www.songbingjia.com/android/nginx.conf dest=/etc/nginx/nginx.conf
- name: start nginx server
service:
name: nginx
enabled: true
state: started
- name: manager db servers
hosts: db_servers
tasks:
- name: update database confg
copy: src=https://www.songbingjia.com/android/my.cnf dest=/etc/my.cnf
...

对Playbook 进行语法校验
  • 下面校验的方法,只能校验PlayBook是否正确,而不能校验YAML文件是否语法正确。
ansible-playbook -i hosts myplaybook.yml --syntax-check

  • 因为PlayBook 属于YAML 格式, 我们同样可以使用检查YAML的语法格式的方法进行检查PlayBook的语法正确性。
python -c import yaml,sys; print yaml.safe_load(sys.stdin) < myplaybook.yml

运行PlayBook
ansible-playbook -i hosts myplaybook.yml

语法错误:

成功执行:

【自动化运维工具AnsiblePlaybook】

单步调试PlayBook
  • 执行Task中的任务,需要手动确认是否往下执行。
ansible-playbook -i hosts myplaybook.yml --step

测试运行PlayBook
  • 测试运行就是会执行完整个PlayBook ,但是所有Task中的行为都不会在远程服务器上执行,所有执行都是模拟行为。
ansible-playbook -i hosts myplaybook.yml -C//// -C 为大写的字母 C


    推荐阅读