【Ansible】ansible Playbook



在这里插入图片描述


一、Ad-Hoc 的问题

通过对 Ad-Hoc 的学习,我们发现 Ad-Hoc 每次只能在管理节点上执行简单的命令,而日常工作中,我们往往面临的是一系列的复杂操作。

例如,我们有可能需要安装软件、更新配置、启动服务等等一系列操作的结合。此时,在通过 Ad-Hoc 去完成任务就有些力不从心了。在这种情况下,ansible 引进了 Playbook 来帮忙我们解决这样复杂的问题。

二、PlayBook 是什么

Playbook 也通常被大家翻译成剧本。可以认为它是 ansible 自定义的一门语言(可以将 Playbook 比作linux 中的 shell,而 ansible 中的module 可以比作为 linux 中的各种命令)。

三、YAML 学习

Playbook 遵循 YAML的语法格式。因此,在学习palybook 之前,我们必须要弄明白 YAML 相关知识点。

1.yaml 特点

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

2.基本语法

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

YAML 支持的数据结构有三种

  • 字符串
  • 列表
  • 字典

2.1 字符串

---
# yaml 中的字符串可以不使用引号,即使里面存在空格的时候,使用单引号和双引号也没有错
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 语言中的数组
#如何定义:以短横线开头 + 空格 + 具体的值
- red
- green
- blue

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

2.3 字典

#如果熟悉 Python 的话,可以认为它就是 Python中的 dict
#如何定义:key + 冒号(:)+ 空格 + 值(value),即key:value
name: Using Ansible
code: abc

#转换成 python 的 字典
#{'name': 'Using Ansible','code': 'abc'}

2.4 混合结构

在日常生活中,往往需要的数据结构会特别复杂,有可能会是字符串、列表、字典的组合形式。

栗子

学校是以班级为单位的,我们使用列表和字典的形式去描述一个班级的组成。

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


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

...

2.4 验证 yaml 语法

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

栗子

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


四、 Playbook 的编写

1.play 的定义

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

如何定义一个 Play

  • 每个play 都是以短横杠开始的
  • 每个play 都是一个 yaml 字典格式

根据上面两条 play 的规则,一个理想的 play 应该是如下的样子

---
- key1: vaule1
  key2: vaule2
  key3: value3
...

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

---
- key1: vaule1
  key2: vaule2
  key3: value3
- key4: vaule4
  key5: vaule5
  key6: value6
- key7: vaule7
  key8: vaule8
  key9: value9
...

2.Play 属性

以上面的 paly 为基础,play 中的每一个key,比如key1,key2等;这些key在playbook中被定义为 play 的属性。这些属性都具有特殊的意义,我们不能随意的自定义 play 的属性。

常用属性

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

3.一个完整的剧本

栗子

---
- 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
        state: started
...

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

---
#启动 Nginx 服务,增加开机启动为例
#一行的形式:
service: name=nginx enabled=true state=started

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

5.具有多个 play 的 playbook

---
  name: manage web server
  hosts: web_servers
  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 master servers
  hosts: master_servers
  tasks:
    - name: update databases config
      copy: src=my.conf dest=/etc/my.conf


...

6. 如何对 playbook 进行语法校验下面校验的方法,只能校验 playbook 是否正确,而不能校验 yaml 文件是否正确

[root@master1 ~]# ansible-playbook my_playbook.yml -i hosts  --syntax-check

playbook: my_playbook.yml
[root@master1 ~]# 


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

7. 运行 playbook

[root@master1 ~]#ansible-playbook -i hosts  my_playbook.yml

8.如何单步跟从调试 playbook

[root@master1 ~]#ansible-playbook -i hosts  my_playbook.yml --step

9. 如何测试运行 playbook

//会执行完整个 playbook,但是所有 task 中的行为都不会在远程服务器上执行,所有执行都是模拟行为
[root@master1 ~]#ansible-playbook -i hosts  my_playbook.yml --C  //-C 为大写字母C

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

guan12319

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

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

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

打赏作者

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

抵扣说明:

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

余额充值