Ansible#Ansible的Playbook和YAML语法

PLAYBOOK

一、Ad-Hoc的问题

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

二、Playbook介绍

Playbook 也通常被大家翻译成剧本。可以认为它是Ansible 自定义的一门语言(可以将 Playbook 比作 Linux 中的 shell,而 Ansible 中的 Module 可以比作为 Linux 中的各种命令。PlayBook遵循YAML 的语法格式

三、YAML格式学习

1、YMAL的特点
  YAML 文件以 # 为注释符
  YAML 文件以 .yml 或者.yaml 结尾
  YAML 文件以 — 开始 , 以 … 结束, 但开始和结束标志都是可选的

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

YAML 支持的数据结构有三种
  字符串
  列表
  字典

3、YMAL中的字符串数据结构

---
# 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	
...

4、YMAL中的列表数据类型

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

-后面加空格
# 以上的值假如转换成 python 的 List 会是这样:
# ['red', 'green', 'blue']
...

5、YMAL中的字典数据类型

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

name: Using Ansible
code: D1234

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

6、YMAL中字符串、列表、字典混合结构

以上,针对YAML 的所有基础知识点就介绍完了。但在日常生活中,往往需要的数据结构会特别复杂,有可能会是字符串、列表、字典的组合形式。 这里举一个小例子:所有人都上过学,都知道到学校里是以班级为单位。我们去使用列表和字典的形式去描述一个班级的组成

---
class:
  - name: stu1
    num: 001
  - name: stu2
    num: 002
  - name: stu3
    num: 003
# {'class': [{'name': 'stu1', 'num': 1},{'name': 'stu2', 'num': 2},...]}
...

7、利用python的yaml模块验证YMAL语法是否正确

// 将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

四、Playbook的编写

1、Play的定义

一个play是一个列表,列表里面的元素是字典
  由于Playbook 是由一个或者多个Play组成,那么如果我们熟悉Play 的写法,就自然掌握了我们这章的PlayBook
  那如何定义一个Play呢

1、每一个Play 都是以短横杠开始的

2、每一个Play 都是一个YAML 字典格式
---
# 一个含有3个Play 的伪PlayBook构成
- key1: value1
  key2: value2
  key3: value3
- key4: value1
  key5: value2
  key6: value3
- key1: value1
  key2: value2
  key3: value3
...

ploybook的核心元素
Hosts:主机组;
Tasks:任务列表;
Variables:变量,设置方式有四种;
Templates:包含了模板语法的文本文件;
Handlers:由特定条件触发的任务;


2、Play的属性

以上一小节中的Play为基础, Play中的每一个key, key1、key2、key3等;这些key在PlayBook中被定义为Play的属性。这些属性都具有特殊的意义,我们不能随意的自定义Play 的属性。那么Ansible本身都支持哪些Play属性呢
(1)、name 属性, 每个play的名字
(2)、hosts 属性, 每个play 涉及的被管理服务器,同ad hoc 中的patten
(3)、tasks 属性, 每个play 中具体要完成的任务,以列表的形式表达
(4)、become 属性,如果需要提权,则加上become 相关属性
(5)、become_user 属性, 若提权的话,提权到哪个用户上
(6)、remote_user 属性,指定连接用户。若不指定,则默认使用当前执行 ansible Playbook 的用户

host部分:使用 hosts 指示使用哪个主机或主机组来运行下面的 tasks ,每个 playbook 都必须指定 hosts ,hosts也可以使用通配符格式。主机或主机组在 inventory 清单中指定,可以使用系统默认的/etc/ansible/hosts,也可以自己编辑,在运行的时候加上-i选项,指定清单的位置即可。在运行清单文件的时候,–list-hosts选项会显示那些主机将会参与执行 task 的过程中。
  remote_user:指定远端主机中的哪个用户来登录远端系统,在远端系统执行 task 的用户,可以任意指定,也可以使用 sudo,但是用户必须要有执行相应 task 的权限。
  tasks:指定远端主机将要执行的一系列动作。tasks 的核心为 ansible 的模块,前面已经提到模块的用法。tasks 包含 name 和要执行的模块,name 是可选的,只是为了便于用户阅读,不过还是建议加上去,模块是必须的,同时也要给予模块相应的参数

3、一个安装nginx并启动服务的剧本示例

- name: the first play for me
  hosts: 10.11.67.19
  remote_user: root
  tasks:
    - name: install nginx
      yum: name=nginx state=present
    - name: copy nginx.conf to remote server
      copy: src=/home/kakaops/ansible/nginx.conf dest=/mnt/nginx.conf
    - name: start nginx
      systemd:
        name: nginx
        state: started
        enabled: true
...

4、task属性中任务的多种写法

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

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

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

5、有多个剧本的Playbook

- name: the first play for me
  hosts: 10.11.67.19
  remote_user: root
  tasks:
    - name: install nginx
      yum: name=nginx state=present

    - name: copy nginx.conf to remote server
      copy: src=/home/kakaops/ansible/nginx.conf
            dest=/mnt/nginx.conf

    - name: start nginx
      systemd:
        name: nginx
        state: started
        enabled: true


- name: ping db-server
  hosts: 10.11.67.19
  remote_user: root
  tasks:
    - name: ping pong dbserver
      ping:

...


6、利用–syntax-check验证playbook剧本是否语法正确

ansible-playbook /mnt/nginx.yaml --syntax-check
  通过检测只能说明剧本没有语法错误,能否成功执行还要看内容写的正确与否

7、Ploybook运行

ansible-playbook myplaybook.yml

8、单步跟从调试Playbook

执行Task中的任务,需要手动确认是否往下执行
  ansible-playbook myplaybook.yml --step

9、测试运行Playbook

会执行完整个PlayBook ,但是所有Task中的行为都不会在远程服务器上执行,所有执行都是模拟行为。
  ansible-playbook myplaybook.yml -C
  -C 为大写的字母 C
  -C还是比较实用一点,报错解决完之后,再在远程主机执行

10、Ansible的运行前三部曲

检查错误
ansible-playbook nginx.yml --syntax-check

列出所有任务
ansible-playbook nginx.yml --list-task

列出在那些机器执行
ansible-playbook nginx.yml --list-hosts

测试运行
ansible-playbook nginx.yml -C

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值