六、Playbook基本使用

发布时间 2023-12-13 17:49:38作者: 相信童话

六、Playbook基本使用

6.1 Playbook介绍

​ ansbile-playbook是一系列ansible命令的集合,利用yaml语言编写。playbook命令根据自上而下的顺序依次执行。同时,playbok开创了很多特性,它可以允许你传输某个命令的状态到后面的指令,如你可以从一台机器的文件中抓取内容并附为变量,然后在另一台机器中使用,这使得你可以实现一些复杂的部署机制,这是Ansible adhoc是无法实现的。

adhoc与Playbook的区别?

​ adhoc是通过命令的方式执行ansible的任务,它一次只能执行一个任务,并且不能处理复杂的逻辑,如判断、循环。而playbook则是通过事先编写好的yaml文件来执行任务,它可以一次执行多个任务,并且可以对任务进行复杂的处理。简单的说,adhco与playbook的关系就像,Linux命令与shell脚本的关系。

6.2 YAML文件

6.2.1 YAML介绍

​ YAML是专门用来写配置文件的语言,非常简洁和强大,远比JSON格式方便。YAML 语言的设计目标,就是方便人类读写。
YAML Ain't Markup Language,即YAML不是XML。不过,在开发的这种语言时,YAML的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)。它的基本语法规则如下:

  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进时不允许使用Tab键,只允许使用空格。
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
  • #表示注释,从#号一直到行尾。

6.2.2 YAML数据类型

  1. 纯量:纯量是最基本的,不可再分的值,包括
    • 字符串
    • 布尔值
    • 整数
    • 浮点数
    • Null
    • 时间
    • 日期
boolean: 
    - TRUE  #true,True都可以
    - FALSE  #false,False都可以
float:
    - 3.14
    - 6.8523015e+5  #可以使用科学计数法
int:
    - 123
    - 0b1010_0111_0100_1010_1110    #二进制表示
null:
    nodeName: 'node'
    parent: ~  #使用~表示null
string:
    - 哈哈
    - 'Hello world'  #可以使用双引号或者单引号包裹特殊字符
    - newline
      newline2    #字符串可以拆成多行,每一行会被转化成一个空格
date:
    - 2018-02-17    #日期必须使用ISO 8601格式,即yyyy-MM-dd
datetime: 
    -  2018-02-17T15:02:31+08:00    #时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区
  1. 数组:一组数据有序的排列,类似于python的列表。用-表示数组中的一个元素。
names:
  - zhangsan
  - lisi
  - wangwu

也可以写成python风格

names: ['zhangsan','lisi','wangwu']
  1. 对象:键和对的集合,用:分割键和对,类似于python的字典。
user1:
  name: zhangsan
  age: 25
  sex: man

也可以写成python风格。

user1: {'name': 'zhangsan','age': 25,'sex': 'man'}
  1. 嵌套结构:对象和数组嵌套使用。
users:
    - zhangsan:
         uid: 2000
         home: /home/zhangsan
         shell: /bin/bash
    - lisi:
         uid: 2001
         home: /home/lisi
         shell: /sbin/nologin
    - wangwu:
         uid: 2002
         home: /home/wangwu
         shell: /bin/bash

也可以写成python风格。

users: ['zhangsan': {'uid': 2000,'home': '/home/zhangsan','shell': '/bin/bash'},
        'lisi': {'uid': 2001,'home': '/home/lisi','shell': '/sbin/nologin'},
        'wangwu': {'uid': 2002,'home': '/home/wangwu','shell': '/bin/bash'}]

6.3 Playbook结构

​ playbook是由一个或多个play组成的列表。play的主要功能就是对一组主机应用play中定义好的task。从根本上来讲一个task就是对ansible一个module的调用。而将多个play按照一定的顺序组织到一个playbook中,我们称之为编排。

playbook主要有以下四部分构成:

  • Target section:用于定义将要执行playbook的远程主机组及远程主机组上的用户,还包括定义通过什么样的方式连接远程主机 (默认ssh)
  • Variable section:定义playbook运行时需要使用的变量
  • Task section:定义将要在远程主机上执行的任务列表
  • Handler section:定义task执行完成以后需要调用的任务

大概结构如下:

- name: play1			# play的描述
  hosts: webservers		# Target section
  vars:					# Variable section
		var xxx
  tasks:				# Task section
     	task xxx
  handlers:				# Handler section
    	handlers xxx
- name: play2			# 一个playbook可以写多个play
  hosts: dbservers
  vars:
		var xxx
  tasks:
     	task xxx
  handlers:
    	handlers xxx      

6.3.1 Target section

​ 在目标区域,我们可以通过hosts定义该play在哪些主机和主机组中执行,选择主机与组的方法与adhoc一致。

- name: install package
  hosts: dbservers,node1
  tasks:
         - name: install httpd
           yum:
                name: httpd
                state: present

​ 我们也可以指定远程的用户、以及远程的方式和端口,ansible.cfg中的配置均可在此定义,如指定远程的用户为root。

- name: install package
  hosts: dbservers,node1
  remote_user: root
  tasks:
         - name: install httpd
           yum:
                name: httpd
                state: present

6.3.2 Variable section

​ 在变量区域,我们可以使用两种方式定义变量,当然,ansible还有更多的方法定义变量,我们后边再讲。

  • vars:直接在playbook中定义变量
- name: test play
  hosts: all
  vars:
       username: root
       password: 123456
  • vars_files:使用变量文件,需要注意变量文件也要是yaml文件格式
[root@master ansible]# cat userinfo.yml 
username: root
password: 123456

调用变量文件

- name: test play
  hosts: all
  vars_files:
           - userinfo.yml

6.3.3 Task section

​ 任务区域是play的主体部分,他必须是一个任务列表,任务列表中的各任务按次序逐个在hosts中指定的所有主机上执行,在所有主机上完成第一个任务后再开始第二个。在自上而下运行某playbook时,如果中途发生错误,则整个playbook会停止执行,由于playbook的幂等性,playbook可以被反复执行,所以即使发生了错误,在修复错误后,再执行一次即可。

执行多个任务

 httpd
  hosts: all
  tasks:
          - name: install httpd
            yum:
                    name: httpd
                    state: present
          - name: start and enabled httpd
            systemd:
                    name: httpd
                    state: started
                    enabled: yes

​ 当有task执行过程中报错,整个playbook会立即停止运行,如果我们不想让错误终止playbook运行,我们可以在task中加入ignore_errors: yes来忽略报错。

- name: install httpd
  hosts: all
  tasks:
          - name: skip error
            shell: ls /var/www/html/index.html
            ignore_errors: yes
          - name: install httpd
            yum:
                    name: httpd
                    state: present

image-20230917214522272

6.3.4 Handler section

​ 在Ansible Playbook中,handler事实上也是个task,只不过这个task默认并不执行,只有在被触发时才执行。handler通过notify来监视某个或者某几个task,一但task执行成功,则触发handler执行相应操作。

​ handler会在所有的play都执行完毕之后才会执行,这样可以避免当handler监视的多个task执行结果都发生了变化之后而导致handler的重复执行 (handler只需要在最后执行一次即可)

- name: install httpd
  hosts: all
  tasks:
          - name: install httpd
            yum:
                    name: httpd
                    state: present
            notify: get_status
  handlers:
          - name: get_status
            debug:
                    msg: "This is handlers"

注意:handlers的name必须和notify定义的名称一致才行。

6.4 ansible-playbook常用选项

  1. 打印详细信息

    • -v:打印任务运行结果
    • -vv:打印任务运行结果以及任务的配置信息
    • -vvv:包含了远程连接的一些信息
    • -vvvv:v越多,输出的信息越详细,最多4个v
  2. playbook语法检测

ansible-playbook --syntax-check test.yml
  1. 测试运行playbook
ansible-playbook -C test.yml

测试运行,不会真的运行,可以用来检测playbook。