Ansible之Playbook

Ansible Playbook是Ansible系统中用于配置管理和部署的关键组件,它以YAML语言编写,组合多条Ad-Hoc指令,实现复杂任务的自动化。Playbook包含hosts、tasks、handlers、变量引用、条件判断等核心元素,支持迭代、标签等功能,确保了配置的统一和任务的幂等性。Handlers作为触发器,当任务状态变化时执行相应操作,而tags允许选择性执行特定任务。Template模板则用于动态生成配置文件,结合Jinja2语言实现条件判断和逻辑运算。
摘要由CSDN通过智能技术生成

一、什么是Playbook

Playbook(剧本)是系统 Ansible 指令的集合,其利用 YAML 语言编写,自上而下按顺序一次执行。它可以实现一些 Ad-Hoc 指令无法实现的操作。

可以简单地把playbook理解为通过组合多条ad-hoc操作的配置文件。playbooks相当于shell脚本(再或者理解为docker中的Dockerfile),可以把执行的任务写到文件中一次执行,方便调用。 但是它有自己的语法规范。

说明:

ansible的操作方式

Ansible 系统由控制主机对被管节点的操作方式可分为两类,即adhoc和playbook:

  • ad-hoc模式(点对点模式)
    使用单个模块,支持批量执行单条命令。ad-hoc 命令是一种可以快速输入的命令,而且不需要保存起来的命令。就相当于bash中的一条简单的命令。

  • playbook模式(剧本模式)
    是Ansible主要管理方式,也是Ansible功能强大的关键所在。playbook通过多个task集合完成一类功能,如Web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc操作的配置文件。


ad-hoc无法持久使用,playbook可以持久使用。

playbook是ansible用于配置,部署,和管理被控节点的剧本。通过playbook的详细描述,执行其中的tasks,可以让远端主机达到预期的状态。playbook是由一个或多个”play”组成的列表。 当对一台机器做环境初始化的时候往往需要不止做一件事情,这时使用playbook会更加适合。通过playbook你可以一次在多台机器执行多个指令。通过这种预先设计的配置保持了机器的配置统一,并很简单的执行日常任务。

一个剧本里面可以有多个play,每个play只能有一个tasks,每个tasks可以有多个name

二、Playbook语法

playbook由YMAL语言编写。YMAL格式是类似于JSON的文件格式,便于人理解和阅读,同时便于书写。

  • 在单一一个playbook文件中,可以连续三个连子号(—)区分多个play。还有选择性的连续三个点好(…)用来表示play的结尾,也可省略。所有的列表元素以"-“开头,键值对用”:",后面的空格是必须的。
  • 次行开始正常写playbook的内容,一般都会写上描述该playbook的功能。
  • 使用#号注释代码。
  • 缩进必须统一,不能空格和tab混用。
  • 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行实现的。
  • YAML文件内容和Linux系统大小写判断方式保持一致,是区分大小写的,k/v的值均需大小写敏感
  • key/value的值可同行写也可以换行写。同行使用:分隔。
  • value可以是个字符串,也可以是一个列表
  • 一个完整的代码块功能需要最少元素包括 name: task

三、playbook的执行

用法:

ansible-playbook [options] filename.yml

--check或-C 只检测可能会发生的改变,但不真正执行操作
--syntax-check 对剧本进行语法的检查
--list-hosts 列出运行任务的主机
--list-task  检查tasks任务
--limit 主机列表 只针对主机列表中的主机执行
--start-at-task=''  指定从某个task开始运行
-v 显示过程 -vv -vvv 更详细
-k(–ask-pass) 用来交互输入ssh密码
-K(-ask-become-pass) 用来交互输入sudo密码
-u 指定用户

四、Playbook核心元素和基础组件

 核心元素:
 
 Playbooks  
 Variables      #变量元素,可传递给Tasks/Templates使用;  
 Tasks          #任务元素,由模块定义的操作的列表,即调用模块完成任务;  
 Templates      #模板元素,使用了模板语法的文本文件;  
 Handlers       #处理器元素,通常指在某事件满足时触发的操作;  
 Roles          #角色元素
 
 playbook的基础组件:
 
 name:
     定义playbook或者task的名称(描述信息),每一个play都可以完成一个任务。
 hosts: 
     playbook中的每一个paly的目的都是为了让某个或某些以某个指定用户的身份执行任务。hosts用于指定要执行指定任务的主机.
 user :
     remote_user则用于指定远程主机上的执行任务的用户,也可以使用user(基本上是root)
 tasks :
     任务列表play的主体部分是task list. task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个。
 tags :
     标签,指定某条任务执行,用于选择运行playbook中的部分代码。
 vars:
    定义变量(如果不使用内部变量需要提前定义)
 vars_files:
    调用定义变量文件
 notify:
     任务执行结果如果是发生更改了的则触发定义在handler的任务执行;Handlers 和notity结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
 handlers:
     用于当前关注的资源发生变化时采取一定指定的操作;Handlers 和notity结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
 templates :
     模板,即使用模板语法的文件,比如配置文件等

(一)hosts和users

在playbook中的每一个play都可以选择在哪些服务器和以什么用户完成,hosts一行可以是一个主机组、主机、多个主机,中间以冒号分隔,可使用通配模式。其中remote_user表示执行的用户名。

---
  - hosts: webserver               # 指定主机组,可以是一个或多个组。
  	remote_user: root        # 指定远程主机执行的用户名

指定远程主机sudo切换用

---
- hosts: webserver
  become: yes                    # 2.6版本以后的参数,之前是sudo,意思为切换用户运行
  become_user: dxk

(二)tasks list 和action

  1. Play的主体部分是task列表,task列表中的各任务按次序逐个在hosts中指定的主机上执行,即在所有主机上完成第一个任务后再开始第二个任务。
    在运行playbook时(从上到下执行),如果一个host执行task失败,整个tasks都会回滚,请修正playbook 中的错误,然后重新执行即可。
    Task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量,模块执行是幂等的,这意味着多次执行是安全的,因为其结果一致。
  2. 每一个task必须有一个名称name,这样在运行playbook时,从其输出的任务执行信息中可以很好的辨别出是属于哪一个task。如果没有定义name,‘action’的值将会用作输出信息中标记特定的task。
  3. 定义一个task,常见的格式:”module: options” 例如:yum: name=httpd
  4. ansible的自带模块中,command模块和shell模块无需使用key=value格式
  5. play中只要执行命令的返回值不为0,就会报错,tasks停止,可以添加 ignore_errors: True 忽略错误,强制返回成功
[root@ansible ~]# vim test.yml
---
- hosts: 192.168.126.97		# 指定主机
  remote_user: root			# 指定在被管理的主机上执行任务的用户
  tasks:					# 任务列表↓
    - name: disable selinux				# 任务名为关闭防火墙
      command: '/sbin/setenforce 0'		# 使用command模块 执行关闭防火墙命令
    - name: start httpd					# 任务名 开启httpd
      service: name=httpd state=started		# 使用service模块 开启httpd 服务
#     ignore_errors:True					# 忽略错误,强制返回成功

# 检查语法
[root@ansible ~]# ansible-playbook test.yml --syntax-check

playbook: test.yml
# 则表示语法正确

# 执行
[root@ansible ~]# ansible-playbook test.yml

PLAY [192.168.126.97] **********************************************************

TASK [Gathering Facts] *********************************************************
ok: [192.168.126.97]

TASK [disable selinux] *********************************************************
changed: [192.168.126.97]

TASK [start httpd] *************************************************************
changed: [192.168.126.97]

PLAY RECAP *********************************************************************
192.168.126.97             : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  
# 如果需要输出更详细的信息,加 -v 或 -vv参数

(三)handlers与notify

handlers用来用来解决触发时间的,也就是当一个tasks真正的执行后,结果发生了变化。会去触发另一个task。

handlers和notify结合使用触发条件:

Handlers(触发器)

是task列表,这些task与前述的task并没有本质上的不同,用于当关注的资源发生变化时,才会采取一定的操作。

Notify(通知)

此action可用于在每个play的最后被触发,这样可以避免多次有改变发生时每次都执行指定的操作,仅在所有的变化发生完成最后一次性地执行指定操作。在notify中列出的操作称为handler,也即notify中调用handler中定义的操作。

handlers是一种触发器,它可以对task进行监控,如果task所指定的任务状态发生变化,则进行notify通知,然后触发额外的一系列操作,看一个示例来帮助理解:

---
- hosts: webservers
  remote_user: root
  tasks:
  - name: install apache
    yum: name=httpd state=latest
  - name: install configure file for httpd
    copy: src=/root/conf/httpd.c
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值