Ansible -playbook

1、Ad-Hoc 的问题

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

2、Playbook是什么

  • Playbook 也通常被大家翻译成剧本。 可以认为它是Ansible 自定义的一门语言(可以将 Playbook 比作 Linux 中的shell,而 Ansible 中的 Module 可以比作为 Linux 中的各种命令。
  • 通过这样的类比,我们对PlayBook就有了一个更形象的认识了)。 既然 Playbook 是一门语言,那么它遵循什么样的语法格式?
    有哪些语言呢性? 我们将通过下面的学习逐步了解。

3、YAML 学习

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

3.1、YAML特点

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

3.2、基本语法

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

 YAML 支持的数据结构有三种

  • 字符串
  • 列表
  • 字典

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

3.2.2列表

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

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

3.2.3字典

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

name: Using Ansible
code: D1234

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

3.2.4混合结构

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

3.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
...
# python -c 'import yaml,sys; print yaml.load(sys.stdin)' < myyaml.yml
['red', 'green', 'blue']

// 错误的情况, 将YAML文件写错
# cat myyaml.yml
---
- red
- green
-blue
...
# python -c 'import yaml,sys; print yaml.load(sys.stdin)' < myyaml.yml
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/local/lib/python2.7/site-packages/yaml/__init__.py", line 71, in load
    return loader.get_single_data()
  File "/usr/local/lib/python2.7/site-packages/yaml/constructor.py", line 37, in get_single_data
    node = self.get_single_node()
...
...

4、playbook的编写(剧本)

4.1、play的定义

  • 由于Playbook 是由一个或者多个Play组成,那么如果我们熟悉 Play 的写法,就自然掌握了我们这章的PlayBook。

  • 那如何定义一个Play呢
    1、每一个Play 都是以短横杠开始的
    2、每一个Play 都是一个YAML 字典格式
    根据上面两条play的规则,那么一个play的雏形应该如下形式

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

一个playbook也可由多个play组成:

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

4.2、play的属性

  • 常用属性:
(1)、name 属性, 每个play的名字
(2)、hosts 属性, 每个play 涉及的被管理服务器,同ad hoc 中的patten
(3)、tasks 属性, 每个play 中具体要完成的任务,以列表的形式表达
(4)、become 属性,如果需要提权,则加上become 相关属性
(5)、become_user 属性, 若提权的话,提权到哪个用户上
(6)、remote_user属性,指定连接用户。若不指定,则默认使用当前执行 ansible Playbook 的用户

4.2、一个完整剧本

  • 一个完整的playbook就应该是如下的样子:
---
#example: 安装nginx服务 拷贝编辑好的配置文件 设置开机自启
- name: the first play example
  hosts: all
  remote_user: root
  tasks:
    - name: install nginx package
      yum: name=nginx state=present   #yum 模块安装nginx服务   
     #-m yum -a "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      #  nginx服务
        enabled: true    # 1   # 设置开机自动启动
        # enabled: yes
        state: started   #开启nginx服务

4.3、tasks属性中任务的多种说法

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

4.4、具有多个Play 的Playbook

# cat myplaybook.yml
---
 - name: manage web servers
  hosts: webservers
  remote_user: root
  tasks:
    - name: install nginx package
      yum: name=nginx state=present

    - name: start nginx server
      service:
        name: nginx
        enabled: true
        state: started

 - name: Test connectivity to dbservers
  hosts: dbservers
  tasks:
    - ping:
      name: ping dbservers 

4.5、如何对Playbook 进行语法校验

  • // 因为PlayBook 属于YAML 格式, 我们同样可以使用检查YAML的语法格式的方法进行检查PlayBook的语法正确性。
  • //此形式的校验,只能校验PlayBook是否正确,而不能校验YAML文件是否语法正确。
# ansible-playbook -i hosts myplaybook.yml --syntax-check

4.6、如何运行Playbook

# ansible-playbook -i hosts myplaybook.yml

4.7、如何单步跟从调试PlayBook

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

总结

Ansible 编写 playbook是为了更好的管理节点机器,如果想要学习更深入的playbook请参考官方文档。
Ansible官方:[https://docs.ansible.com/](https://docs.ansible.com/)

猜你喜欢

转载自blog.csdn.net/weixin_52099680/article/details/113703768