一、playbook简介

  ansiblie的任务配置文件被称为playbook,俗称“剧本”,每一个剧本(playbook)中都包含了一系列的任务,这每个任务在ansible中又被称为“戏剧”(play),一个剧本中包含多出戏剧。。

  前文我们了解了ansible有两种执行方式ad-hoc和ansible-playbook,ad-hoc主要用于临时命令的执行,而playbook我们可以理解为ad-hoc的集合,有点类似shell脚本,ad-hoc就相当于shell脚本里的某条任务语句,playbook就相当于整个shell脚本。playbook是由一个或多个“play”组成的列表,play的主要功能在于将预定义的一组主机,装扮成事先通过ansible中的task定义好的角色。task实际是调用ansible的一个模块,将多个play组织在一个playbook中,即可以让他们联合起来,按事先编排的机制执行预定义的动作。

如以上图示,用户可以把多条任务(ad-hoc任务)写到playbook中,用户用ansible-playbook命令调用执行编排好的playbook,ansible会读取playbook中的每一条play和task,并按照playbook中的顺序从上至下依次执行,ansible会调用每个task中定义的模块去依次执行相应的任务,并按照playbook中指定的主机去主机清单里匹配对应的主机,然后通过ssh认证,把编译好的相应的任务文件发送到对应的主机或网络设备上执行,最后返回执行的状态。

  二、YAML简介

  playbook采用yaml语言编写,yaml是一个可读性高的用来表达资料序列格式的语言,它参考了其他很多种语言,包括:XML、C语言、python、perl以及电子邮箱格式RFC2822等。Clark Evans在2001年首次发表了这种语言,另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者。YAML( YAML Ain't Markup Language),即yaml不是标记语言。不过在开发这种语言时,yaml的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)

  ymal特性

  1)YAML的可读性好

  2)YAML和脚本语言的交互性好

  3)YAML使用实现语言的数据类型

  4)YAML有一个一致的信息模板

  5)YAML易于实现,可以基于流程处理,表达能力强,扩展性好

更多的内容及规范请参考官方文档http://www.yaml.org

  三、playbook语法简介

  1)需要以“---”(3个减号)开始,且需顶行首写。另外还有选择性的连续三个点号(...)用来表示文件的结尾。

  2)次行开始正常写playbook的内容,建议次行写该playbook的功能,当然不写也是可以的。

  3)使用“#”号注释代码。

  4)缩进必须统一,不能空格tab混用。

  5)缩进的级别必须是一致的,同样的缩进代表同样级别,程序判别配置的级别是通过缩进结合换行来实现的。

  6)YAML文件内容和Linux系统大小写判断方式一直,区分大小写(大小写敏感),k/v的值均大小写敏感。

  7)k/v的值可同行写也可换行写。同行使用“:”分隔,换行写需要以“-”分隔。

  8)v可以是字符串,也可以另外一个列表,当然也可以是字典。

  9)一个完整的代码块功能最少需要有name:xxx(对任务的描述)。

  10)一个name只能包括一个task

  11)yaml文件扩展名通常为yml或yaml

list:列表,其所有元素均使用“-”开头

示例:

---
# A list of tasty fruits - apple
- orange
- strawberry
- mango
~  

dictionary:字典,通常由多个key与value构成

示例:

---
#An employee record
name: example developer
job: developer
skill: elite  

当然也可以将key:value放置于{}中进行表示,用“,”分隔多个key:value

示例:

---
#An employee record
{name: example developer,job: developer, skill: elite}
~   

  YAML的语法和其他高阶语言类似,并且可以简单表达清单、散列表、标量等数据结构。其结构(Structure)通过空格来展示,序列(Sequence)里的项用"-"来代表,Map里的键值对用":"分隔。

示例:

---
name: John Smith
age: 41
gender: Male
spouse:
name: Jane Smith
age: 37
gender: Female
children:
- name: Jimmy Smith
age: 17
gender: Male
- name: Jenny Smith
age: 13
gender: Female
~

  四、playbook核心元素

  1)hosts  :指定执行任务的远程主机列表(主机清单定义的主机组或单个主机,支持前面的说的主机模式匹配)

  2)tasks  :任务集

  3)varniables  :内置变量或自定义变量在playbook中调用

  4)templates  :模板,可替换模板文件中的变量并实现一些简单逻辑的文件

  5)handlers  和  notity结合使用,由特定条件出发的操作,满足条件方才执行,否则不执行

  6)tags标签  :给指定的任务贴上标签,我们在执行playbook的时候可以根据标签选择性的挑选部分代码执行,如 ansible-playbook -t tagsname useradd.yml  ,这条命令的意思就是在useradd.yml中挑选标签名为tagsname的任务执行

  五、playbook基础组件

  1)hosts:

    playbook中的每一个play的目的都是为了让特定主机以某个指定的用户身份执行任务。hosts用于指定要执行任务的主机,须事先定义在主机清单中。hosts指定主机的形式同样支持像主机清单中定义的那样,支持通配,支持主机模式匹配与或非,支持IP地址,当然也支持混合匹配与或非。

示例:在websers组,但不再dbsers组,可以这样定义hosts

---
- hosts: websers:!dbsers

  2)remote_user:可用于host和task中,也可以通过指定其通过sudo的方式在远程执行任务,其可用于play全局或某个任务;此外,甚至可以在sudo时使用用sudo_user指定sudo时切换的用户,如下所示

---
- hosts: websers:!dbsers
remote_user: root tasks:
- name: test connection
ping:
remote_user: qiuhom
sudo: yes
sudo_user: qiuping

  说明:默认sudo 为root,上例指定了sudo_user 为qiuping,上述任务同sudo -u qiuping ping xxxx(代表某主机)命令一样的意思,当然在使用sudo 时 我们还需要在目标主机上对qiuhom授权,要让qiuhom这个用户具有代表qiuping的权限去执行ping命令。

  3)task列表和action:play的主体部分是task list,task list 中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后,再开始第二个任务;task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量,模块执行时是幂等的,这意味着多次执行时是安全的,其结果均一致;每个task都应该有其name,用于playbook的执行结果输出,建议其内容能清晰地描述任务步骤,如未提供name,则action的结果将用于输出。

  tasks:任务列表,它有两种格式如下

    (1)action: module arguments

    (2)module: arguments        ##建议使用

  注意:shell模块和command模块后面跟的是命令,而非key=value

如果某项任务的状态在运行后为changed时,可通过“notify”通知给相应的handlers;当然任务可以通过“tags”打标签,可以在ansible-playbook命令上使用-t指定进行指定其标签名调用。

示例:

[qiuhom@test ~]$cat test.yml
---
- hosts: websers:!dbsers
remote_user: root tasks:
- name: test connection
ping:
remote_user: qiuhom
sudo: yes
sudo_user: qiuping
tags: test
- name: test command
shell: /bin/ls /home/qiuhom/
[qiuhom@test ~]$ansible-playbook -t test test.yml

  说明:用-t 指定标签名,表示只运行所指定标签所在的任务,当然同名的标签可以在多条任务中,一个任务也可以有多个标签。

如果命令或脚本的退出码不为零,可用使用如下方式忽略或跳过继续执行以下代码

---
- hosts: websers:!dbsers
remote_user: root tasks:
- name: run this command and ignore the result
shell: /usr/sbin/ip addr show eth0 || /bin/true
- name: run this command and ignore the result
shell: /usr/sbin/ip addr show eth0
ignore_errors: True

  说明:两种方式都可以跳过出错的命令而不打断playbook,继续执行以下的代码,前者使用的短路或的特性,后者使用ignore_errors参数来控制

  六、playbook运行的方式

ansible-playbook <filename.yml> ... [options]

常用选项:

  -C , --check  : 只检查可能会发生的改变,但不真正执行操作,相当于空跑一遍playbook,测试下是否和自己预想的结果一样,但它不会真正的去远端主机上执行。常用于测试写的playbook语法是否有误。

  --list-hosts  :列出playbook指定运行任务所匹配的主机

  --list-tags    :列出playbook中所有标签名称列表

  --list-tasks  :列出playbook中所有任务名称及标签名称

  --limit 主机列表   :只针对指定主机列表中的主机执行当前playbook(指定主机列表必须是在playbook里定义的主机列表范围内)

  -v,-vv,-vvv       :  显示执行playbook的过程,-v,显示较简单,-vv显示较详细,-vvv显示整个过程(非常详细)

[root@test ~]#cat test.yml
---
- hosts: websers
remote_user: root tasks:
- name: run this command
shell: hostname
tags: hostname
ignore_errors: True
- name: show ip addr
shell: /sbin/ip addr show
tags: showip
[root@test ~]#ansible-playbook test.yml --list-hosts playbook: test.yml play #1 (websers): websers TAGS: []
pattern: [u'websers']
hosts (2):
192.168.0.128
192.168.0.218
[root@test ~]#ansible-playbook test.yml --list-tags playbook: test.yml play #1 (websers): websers TAGS: []
TASK TAGS: [hostname, showip]
[root@test ~]#ansible-playbook test.yml --list-tasks playbook: test.yml play #1 (websers): websers TAGS: []
tasks:
run this command TAGS: [hostname]
show ip addr TAGS: [showip]
[root@test ~]#ansible-playbook test.yml --limit 192.168.0.218 PLAY [websers] ******************************************************************************************************** TASK [Gathering Facts] ************************************************************************************************
ok: [192.168.0.218] TASK [run this command] ***********************************************************************************************
changed: [192.168.0.218] TASK [show ip addr] ***************************************************************************************************
changed: [192.168.0.218] PLAY RECAP ************************************************************************************************************
192.168.0.218 : ok=3 changed=2 unreachable=0 failed=0 [root@test ~]#ansible-playbook test.yml --limit 192.168.0.218 -v
Using /etc/ansible/ansible.cfg as config file PLAY [websers] ******************************************************************************************************** TASK [Gathering Facts] ************************************************************************************************
ok: [192.168.0.218] TASK [run this command] ***********************************************************************************************
changed: [192.168.0.218] => {"changed": true, "cmd": "hostname", "delta": "0:00:00.002139", "end": "2019-11-16 23:11:02.996962", "rc": 0, "start": "2019-11-16 23:11:02.994823", "stderr": "", "stderr_lines": [], "stdout": "localhost.localdomain", "stdout_lines": ["localhost.localdomain"]} TASK [show ip addr] ***************************************************************************************************
changed: [192.168.0.218] => {"changed": true, "cmd": "/sbin/ip addr show", "delta": "0:00:00.002604", "end": "2019-11-16 23:11:03.733004", "rc": 0, "start": "2019-11-16 23:11:03.730400", "stderr": "", "stderr_lines": [], "stdout": "1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN \n link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00\n inet 127.0.0.1/8 scope host lo\n inet6 ::1/128 scope host \n valid_lft forever preferred_lft forever\n2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000\n link/ether 00:0c:29:e8:f6:7b brd ff:ff:ff:ff:ff:ff\n inet 192.168.0.218/24 brd 192.168.0.255 scope global eth0\n inet6 fe80::20c:29ff:fee8:f67b/64 scope link \n valid_lft forever preferred_lft forever\n3: pan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN \n link/ether d2:7a:38:cf:27:60 brd ff:ff:ff:ff:ff:ff", "stdout_lines": ["1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN ", " link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00", " inet 127.0.0.1/8 scope host lo", " inet6 ::1/128 scope host ", " valid_lft forever preferred_lft forever", "2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000", " link/ether 00:0c:29:e8:f6:7b brd ff:ff:ff:ff:ff:ff", " inet 192.168.0.218/24 brd 192.168.0.255 scope global eth0", " inet6 fe80::20c:29ff:fee8:f67b/64 scope link ", " valid_lft forever preferred_lft forever", "3: pan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN ", " link/ether d2:7a:38:cf:27:60 brd ff:ff:ff:ff:ff:ff"]} PLAY RECAP ************************************************************************************************************
192.168.0.218 : ok=3 changed=2 unreachable=0 failed=0 [root@test ~]#

  说明:--limit 所指定的主机必须是在playbook中所指定的主机范围内。

  七、playbook vs shell scripts

  1)shell脚本如下:

#!/bin/bash
# 安装Apache
yum install --quiet -y httpd
# 复制配置文件
cp /tmp/httpd.conf /etc/httpd/conf/httpd.conf
cp/tmp/vhosts.conf /etc/httpd/conf.d/
# 启动Apache,并设置开机启动
service httpd start
chkconfig httpd on

  2)playbook

---
- hosts: websers
remote_user: root tasks:
- name: create apache group
group: name=apache gid=80 system=yes
- name: create apache user
user: name=apache uid=80 group=apache system=yes shell=/sbin/nologin home=/var/www/html
- name: install httpd
yum: name=httpd
- name: copy config file
copy: src=/tmp/httpd.conf dest=/etc/httpd/conf/
- name: copy config 2 file
copy: src=/tmp/vhosts.conf dest=/etc/httpd/conf.d/
- name: start httpd service
service: name=httpd state=started enabled=yes

  说明:两者都是实现同样的目的,很明显playbook的优势要比脚本的优势多,playbook 可以针对很多台主机进行任务执行,而脚本只可以在某一台主机上执行;脚本重复执行没有幂等性,很有可能带来很多错误,而playbook却不会有这样的苦恼。

Ansibile之playbook初识的更多相关文章

  1. Ansible Playbook 初识

    Ansible Playbook 基本概述与使用案例 主机规划 添加用户账号 说明: 1. 运维人员使用的登录账号: 2. 所有的业务都放在 /app/ 下「yun用户的家目录」,避免业务数据乱放: ...

  2. 安全运维中基线检查的自动化之ansible工具巧用

    i春秋作家:yanzm 原文来自:安全运维中基线检查的自动化之ansible工具巧用 前几周斗哥分享了基线检查获取数据的脚本,但是在面对上百台的服务器,每台服务器上都跑一遍脚本那工作量可想而知,而且都 ...

  3. 自动化运维工具-Ansible之3-playbook

    自动化运维工具-Ansible之3-playbook 目录 自动化运维工具-Ansible之3-playbook PlayBook初识 YAML语法 PlayBook部署httpd PlayBook实 ...

  4. ansible笔记(11):初识ansible playbook(二)

    ansible笔记():初识ansible playbook(二) 有前文作为基础,如下示例是非常容易理解的: --- - hosts: test211 remote_user: root tasks ...

  5. ansible笔记(10):初识ansible playbook

    ansible笔记():初识ansible playbook 假设,我们想要在test70主机上安装nginx并启动,我们可以在ansible主机中执行如下3条命令 ansible test70 -m ...

  6. Playbook剧本初识

    目录 1.Playbook剧本初识 2.Playbook变量使用 3.Playbook变量注册 4.Playbook条件语句 5.Playbook循环语句 6.Playbook异常处理 7.Playb ...

  7. ansible笔记(9):初识ansible playbook(二)

    1.先看一个playbook示例: 表示在远程主机192.168.10.2中/test文件夹中新建一个CCC文件,其权限设置为0700. 1.1书写风格之一:参数可以集中写在一行. 1.2书写风格之二 ...

  8. ansible笔记(8):初识ansible playbook

    回顾总结:我们来想象一个工作场景,看看怎样把之前的知识点应用到这个工作场景中.假设,我们想要在192.168.10.2主机上安装nginx并启动,我们可以在ansible控制主机中执行如下3条命令. ...

  9. Ansible_自动化运维《Ansible之初识-1》

    1.Ansible简介 1.1 Ansible介绍 Ansible 是一个简单的自动化运维管理工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fab ...

随机推荐

  1. 不依赖远程API启动SEER区块链命令行钱包和网页钱包的方法

    不依赖远程API启动命令行钱包和网页钱包的方法 在SEER的见证人操作等需要使用命令行钱包的操作中,我们介绍了通过钱包连接远程API来和区块链交互的方法.类似这样: cli_wallet.exe -s ...

  2. 使用ipython %matplotlib inline

    首先讲讲这句话的作用,matplotlib是最著名的Python图表绘制扩展库,它支持输出多种格式的图形图像,并且可以使用多种GUI界面库交互式地显示图表.使用%matplotlib命令可以将matp ...

  3. App自动化环境搭建

    1.安装Appium-desktop工具 下载地址:https://github.com/appium/appium-desktop/releases/tag/v1.8.2 2.安装Android环境 ...

  4. .Net Core 3.0 IdentityServer4 快速入门

    .Net Core 3.0 IdentityServer4 快速入门 一.简介 IdentityServer4是用于ASP.NET Core的OpenID Connect和OAuth 2.0框架. 将 ...

  5. ESP8266开发之旅 应用篇② OLED显示天气屏

    1.前言     这一篇,博主将教大家怎么去实现一个简易版本的天气助手.     先来一个博主已经实现功能的图片,如下: 1.1 知识储备     本篇需要用到以下知识点: 运用到ArduinoJso ...

  6. PAT-1022 Digital Library (30 分) 字符串处理

    A Digital Library contains millions of books, stored according to their titles, authors, key words o ...

  7. CentOS6-Linux内核编译 详细步骤

    CentOS6-Linux内核编译 详细步骤 背景 Win10用VMwareWorkstation搭的虚拟机 CentOS6.5,内核版本2.6.32-431.el6.x86_64 在该环境下升级至4 ...

  8. Leetcode(9)回文数

    Leetcode(9)回文数 [题目表述]: 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 第一次:直接全部转 执行用时:148 ms: 内存消耗:13.4 ...

  9. SpringBoot中如何优雅的读取yml配置文件?

    YAML是一种简洁的非标记语言,以数据为中心,使用空白.缩进.分行组织数据,从而使得表示更加简洁易读.本文介绍下YAML的语法和SpringBoot读取该类型配置文件的过程. 本文目录 一.YAML基 ...

  10. Eureka error "java.net.UnknownHostException:

    spring cloud 中zuul智能路由,本地部署没有问题,部署到服务器就报com.netflix.zuul.exception.ZuulException: Forwarding error 项 ...