⾃动化运维利器 Ansible-Playbook

按顺序食用,口味更佳
( 1 ) ⾃动化运维利器Ansible-基础
( 2 ) ⾃动化运维利器 Ansible-Playbook
( 3 ) ⾃动化运维利器 Ansible-变量
( 4 ) ⾃动化运维利器AnsiblePlaybook的任务控制
( 5 ) ⾃动化运维利器 Ansible-Jinja2
( 6 ) ⾃动化运维利器 Ansible-最佳实战

AD-HOC 每次只能在被管理节点上执⾏简单的命令。⽽⽇常⼯作中,我们往往⾯临的是⼀系列的复杂操作,例如可能需要安装软件、更新配置、启动服务等等⼀系列操作的结合。此时再通过 AD-HOC 去完成任务就有些⼒不从⼼了。在这种场景下,Ansible引进了 PLAYBOOK 来帮忙我们解决这样复杂问题。

一、什么是PlayBook

Playbook 通常被翻译成剧本。可以认为它是Ansible ⾃定义的⼀⻔语⾔(可以将 Playbook ⽐作Linux 中的 shell,而 Ansible 中的 Module 可以⽐作为 Linux 中的各种命令。)

PlayBook遵循YAML 的语法格式。因此在学习PlayBook之前,必须要先弄明⽩YAML 相关知识点。

1.1 YAML特点

YAML ⽂件的特点:

  • 以 # 为注释符
  • 以 .yml 或者.yaml 结尾
  • 以 — 开始 , 以 … 结束, 但开始和结束标志都是可选的
  • ⼤⼩写敏感
  • 使⽤缩进表示层级关系
    • 缩进时是使⽤Tab键还是使⽤空格⼀定要达到统⼀,建议使⽤空格。
    • 相同层级的元素必须左侧对⻬即可
  • YAML ⽀持三种数据结构
    • 字符串
    • 列表
    • 字典

1.2 YAML 数据结构

字符串结构:

---
# 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},...]}
...

二、Playbook 的编写

Playbook 是由⼀个或者多个Play组成,熟悉Play的写法后,就⾃然掌握了PlayBook的编写。

  • 每⼀个Play 都是以短横杠开始的
  • 每⼀个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: value3
...

2.1 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 的⽤户

2.2 一个完整的PlayBook

根据上述说明,一个完整的PlayBook应该是如下样子的:

---
- name: the first play example
  hosts: webservers
  remote_user: root
  tasks:
 	- name: install nginx package         //ansible webservers -m yum -a 'name=nginx state=present'等同于这条命令
 	  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
      state: started
 ...

ansible webservers -m yum -a ‘name=nginx state=present’
参数解释:
模式匹配器: webservers ,匹配指定资产中的webservers组。此处没有用-i 指明资产位置,默认为 /etc/ansible/hosts。

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=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=my.cnf dest=/etc/my.cnf 
...

语法检验Playbook:

使用ansible-ad-hoc校验
ansible-playbook -i hosts myplaybook.yml --syntax-check

使用python校验YAML格式
python -c ‘import yaml,sys;print yaml.safe_load(sys.stdin)’ < myplaybook.yml

2.3 运行调试PlayBook

ansible-playbook的命令格式:

  • ansible-playbook [options] playbook.yml
  • 其中 [options] 是可选参数,playbook.yml 是你的 playbook 文件。
    • -i, --inventory: 指定库存文件或目录。默认为 /etc/ansible/hosts。
    • -l, --limit: 限制执行到特定的主机或主机组。

具体可以使用ansible-playbook -help查看

运行一个Playbook:

ansible-playbook -i hosts myplaybook.yml

hosts:库存文件,定义目标主机和分组信息。
myplaybook.yml,剧本文件,定义要执行的内容。

playbook文件中通常使用主机组指定要操作的资产,这个资产具体信息从hosts中获取。

单步跟从调试Playbook:

ansible-playbook -i hosts myplaybook.yml --step

执行Tasks中的任务,需要手动确认是否向下执行。

测试运行Playbook:

ansible-playbook -i hosts myplaybook.yml -C

测试运⾏就是会执⾏完整个PlayBook ,但是所有Task中的⾏为都不会在远程服务器上执⾏,所有执⾏都是模拟⾏为。

按顺序食用,口味更佳
( 1 ) ⾃动化运维利器Ansible-基础
( 2 ) ⾃动化运维利器 Ansible-Playbook
( 3 ) ⾃动化运维利器 Ansible-变量
( 4 ) ⾃动化运维利器AnsiblePlaybook的任务控制
( 5 ) ⾃动化运维利器 Ansible-Jinja2
( 6 ) ⾃动化运维利器 Ansible-最佳实战

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aimyon_36

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值