Ansible 之 Playbook详解
Playbook介绍
Playbook与ad-hoc相比,是一种完全不同的运用ansible的方式,类似与saltstack的state状态文件。ad-hoc无法持久使用,playbook可以持久使用。
playbook是由一个或多个play组成的列表,play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来讲,所谓的task无非是调用ansible的一个module。将多个play组织在一个playbook中,即可以让它们联合起来按事先编排的机制完成某一任务
Playbook核心元素
元素 | |
---|---|
Hosts | 执行的远程主机列表 |
Tasks | 任务集 |
Varniables | 内置变量或自定义变量在playbook中调用 |
Templates | 模板,即使用模板语法的文件,比如配置文件等 |
Handlers 和notity | 结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行 |
tags | 标签,指定某条任务执行,用于选择运行playbook中的部分代码。 |
Playbook语法
- playbook使用yaml语法格式,后缀可以是yaml,也可以是yml。
- 在单一一个playbook文件中,可以连续三个连子号(—)区分多个play。还有选择性的连续三个点好(…)用来表示play的结尾,也可省略。
- 次行开始正常写playbook的内容,一般都会写上描述该playbook的功能。
- 使用#号注释代码。
- 缩进必须统一,不能空格和tab混用。
- 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行实现的。
- YAML文件内容和Linux系统大小写判断方式保持一致,是区分大小写的,k/v的值均需大小写敏感
- k/v的值可同行写也可以换行写。同行使用:分隔。
- v可以是个字符串,也可以是一个列表
- 一个完整的代码块功能需要最少元素包括 name: task
一个简单的示例
普通用户配置ansible.cfg可以参考ansible.cfg配置
可以参考Ansible hosts文件写法
创建playbook文件
[root@ansible ~]# vim playbook.yml
--- #固定格式
- hosts: 192.168.1.31 #定义需要执行主机,也可以是主机组,例如hosts: web ,web在hosts的文件中(可以参考本小节上面的Ansible hosts文件写法)remote_user: root #远程用户 或者是普通用户,普通用户要提权的话添加一下两项# become: yes #2.6版本以后的参数,之前是sudo,意思为切换用户运行# become_method: sudo #以哪种方式提权,sudo或者suvars: #定义变量http_port: 8088 #变量tasks: #定义一个任务的开始- name: create new file #定义任务的名称file: name=/tmp/playtest.txt state=touch #调用模块,具体要做的事情- name: create new useruser: name=test02 system=yes shell=/sbin/nologin- name: install packageyum: name=httpd- name: config httpdtemplate: src=./httpd.conf dest=/etc/httpd/conf/httpd.confnotify: #定义执行一个动作(action)让handlers来引用执行,与handlers配合使用- restart apache #notify要执行的动作,这里必须与handlers中的name定义内容一致- name: copy index.htmlcopy: src=/var/www/html/index.html dest=/var/www/html/index.html- name: start httpdservice: name=httpd state=startedhandlers: #处理器:更加tasks中notify定义的action触发执行相应的处理动作- name: restart apache #要与notify定义的内容相同service: name=httpd state=restarted #触发要执行的动作#测试页面准备
[root@ansible ~]# echo "<h1>playbook test file</h1>" >>/var/www/html/index.html
#配置文件准备
[root@ansible ~]# cat httpd.conf |grep ^Listen
Listen {{ http_port }}#执行playbook, 第一次执行可以加-C选项,检查写的playbook是否ok
[root@ansible ~]# ansible-playbook playbook.yml
PLAY [192.168.1.31] *********************************************************************************************
TASK [Gathering Facts] ******************************************************************************************
ok: [192.168.1.31]
TASK [create new file] ******************************************************************************************
changed: [192.168.1.31]
TASK [create new user] ******************************************************************************************
changed: [192.168.1.31]
TASK [install package] ******************************************************************************************
changed: [192.168.1.31]
TASK [config httpd] *********************************************************************************************
changed: [192.168.1.31]
TASK [copy index.html] ******************************************************************************************
changed: [192.168.1.31]
TASK [start httpd] **********************************************************************************************
changed: [192.168.1.31]
PLAY RECAP ******************************************************************************************************
192.168.1.31 : ok=7 changed=6 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 # 验证上面playbook执行的结果
[root@ansible ~]# ansible 192.168.1.31 -m shell -a 'ls /tmp/playtest.txt && id test02'
192.168.1.31 | CHANGED | rc=0 >>
/tmp/playtest.txt
uid=990(test02) gid=985(test02) 组=985(test02)[root@ansible ~]# curl 192.168.1.31:8088
<h1>playbook test file</h1>
Playbook的运行方式
通过ansible-playbook命令运行
格式:ansible-playbook <filename.yml> … [options] #filename.yml可以是任意路径,指定路径就可以执行
[root@ansible PlayBook]# ansible-playbook -h
#ansible-playbook常用选项:
--check or -C #只检测可能会发生的改变,但不真正执行操作
--list-hosts #列出运行任务的主机
--list-tags #列出playbook文件中定义所有的tags
--list-tasks #列出playbook文件中定义的所以任务集
--limit #主机列表 只针对主机列表中的某个主机或者某个组执行
-f #指定并发数,默认为5个
-t #指定tags运行,运行某一个或者多个tags。(前提playbook中有定义tags)
-v #显示过程 -vv -vvv更详细
Playbook中元素属性
主机与用户
在一个playbook开始时,最先定义的是要操作的主机和用户
---
- hosts: 192.168.1.31remote_user: root
除了上面的定义外,还可以在某一个tasks中定义要执行该任务的远程用户
tasks: - name: run df -hremote_user: testshell: name=df -h
还可以定义使用sudo授权用户执行该任务
tasks: - name: run df -hsudo_user: testsudo: yesshell: name=df -h
tasks任务列表
每一个task必须有一个名称name,这样在运行playbook时,从其输出的任务执行信息中可以很清楚的辨别是属于哪一个task的,如果没有定义 name,action的值将会用作输出信息中标记特定的task。
每一个playbook中可以包含一个或者多个tasks任务列表,每一个tasks完成具体的一件事,(任务模块)比如创建一个用户或者安装一个软件等,在hosts中定义的主机或者主机组都将会执行这个被定义的tasks。
tasks:- name: create new filefile: path=/tmp/test01.txt state=touch- name: create new useruser: name=test001 state=present
Handlers与Notify
很多时候当我们某一个配置发生改变,我们需要重启服务,(比如httpd配置文件文件发生改变了)这时候就可以用到handlers和notify了;
(当发生改动时)notify actions会在playbook的每一个task结束时被触发,而且即使有多个不同task通知改动的发生,notify actions知会被触发一次;比如多个resources指出因为一个配置文件被改动,所以apache需要重启,但是重新启动的操作知会被执行一次。
[root@ansible ~]# cat httpd.yml
#用于安装httpd并配置启动
---
- hosts: 192.168.1.31remote_user: roottasks:- name: install httpdyum: name=httpd state=installed- name: config httpdtemplate: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.confnotify:- restart httpd- name: start httpdservice: name=httpd state=startedhandlers:- name: restart httpdservice: name=httpd state=restarted#这里只要对httpd.conf配置文件作出了修改,修改后需要重启生效,在tasks中定义了restart httpd这个action,然后在handlers中引用上面tasks中定义的notify。
Playbook中变量的使用
环境说明:这里配置了两个组,一个apache组和一个nginx组
[root@ansible PlayBook]# cat /etc/ansible/hosts
[apache]
192.168.1.36
192.168.1.33[nginx]
192.168.1.3[1:2]
命令行指定变量
执行playbook时候通过参数-e传入变量,这样传入的变量在整个playbook中都可以被调用,属于全局变量
[root@ansible PlayBook]# cat variables.yml
---
- hosts: allremote_user: roottasks:- name: install pkgyum: name={{ pkg }}#执行playbook 指定pkg
[root@ansible PlayBook]# ansible-playbook -e "pkg=httpd" variables.yml
命令行指定变量
执行playbook时候通过参数-e传入变量,这样传入的变量在整个playbook中都可以被调用,属于全局变量
[root@ansible PlayBook]# cat variables.yml
---
- hosts: allremote_user: roottasks:- name: install pkgyum: name={{ pkg }}#执行playbook 指定pkg
[root@ansible PlayBook]# ansible-playbook -e "pkg=httpd" variables.yml
hosts文件中定义变量
在/etc/ansible/hosts文件中定义变量,可以针对每个主机定义不同的变量,也可以定义一个组的变量,然后直接在playbook中直接调用。注意,组中定义的变量没有单个主机中的优先级高。
# 编辑hosts文件定义变量
[root@ansible PlayBook]# vim /etc/ansible/hosts
[apache]
192.168.1.36 webdir=/opt/test #定义单个主机的变量
192.168.1.33
[apache:vars] #定义整个组的统一变量
webdir=/web/test[nginx]
192.168.1.3[1:2]
[nginx:vars]
webdir=/opt/web# 编辑playbook文件
[root@ansible PlayBook]# cat variables.yml
---
- hosts: allremote_user: roottasks:- name: create webdirfile: name={{ webdir }} state=directory #引用变量# 执行playbook
[root@ansible PlayBook]# ansible-playbook variables.yml
playbook文件中定义变量
编写playbook时,直接在里面定义变量,然后直接引用,可以定义多个变量;注意:如果在执行playbook时,又通过-e参数指定变量的值,那么会以-e参数指定的为准。
# 编辑playbook
[root@ansible PlayBook]# cat variables.yml
---
- hosts: allremote_user: rootvars: #定义变量pkg: nginx #变量1dir: /tmp/test1 #变量2tasks:- name: install pkgyum: name={{ pkg }} state=installed #引用变量- name: create new dirfile: name={{ dir }} state=directory #引用变量# 执行playbook
[root@ansible PlayBook]# ansible-playbook variables.yml# 如果执行时候又重新指定了变量的值,那么会已重新指定的为准
[root@ansible PlayBook]# ansible-playbook -e "dir=/tmp/test2" variables.yml
调用setup模块获取变量
setup模块默认是获取主机信息的,有时候在playbook中需要用到,所以可以直接调用。常用的参数参考
# 编辑playbook文件
[root@ansible PlayBook]# cat variables.yml
---
- hosts: allremote_user: roottasks:- name: create filefile: name={{ ansible_fqdn }}.log state=touch #引用setup中的ansible_fqdn# 执行playbook
[root@ansible PlayBook]# ansible-playbook variables.yml
独立的变量YAML文件中定义
为了方便管理将所有的变量统一放在一个独立的变量YAML文件中,laybook文件直接引用文件调用变量即可。
# 定义存放变量的文件
[root@ansible PlayBook]# cat var.yml
var1: vsftpd
var2: httpd# 编写playbook
[root@ansible PlayBook]# cat variables.yml
---
- hosts: allremote_user: rootvars_files: #引用变量文件- ./var.yml #指定变量文件的path(这里可以是绝对路径,也可以是相对路径)tasks:- name: install packageyum: name={{ var1 }} #引用变量- name: create filefile: name=/tmp/{{ var2 }}.log state=touch #引用变量# 执行playbook
[root@ansible PlayBook]# ansible-playbook variables.yml
Ansible 之 Playbook详解相关推荐
- Ansible之Playbook详解、案例
playbook-剧本 介绍 playbooks是 一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活.简单来说,playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已 ...
- Ansible 实战案例--Ansible Ad-Hoc 组件详解
Ansible Ad-Hoc 组件详解 前言 一.命令执行 1.shell 2.command 3.remove 二.包管理 1.yum_repository 2.yum 三.服务管理模块 1.ser ...
- 1离线 TiDB Ansible 部署方案-详解
一: 环境要求 Linux 操作系统版本要求 Linux 操作系统平台 版本 Red Hat Enterprise Linux 7.3 及以上 CentOS 7.3 及以上 Oracle Enterp ...
- Ansible Playbook详解
Playbook playbook介绍 playbook 剧本是由一个或多个"play"组成的列表 play的主要功能在于将预定义的一组主机,装扮成事先通过ansible中的tas ...
- Ansible中的playbook详解
首先简单说明一下playbook,playbook是什么呢? 根本上说playbook和shell脚本没有任何的区别,playbook就像shell一样,也是把一堆的命令组合起来,然后加入对应条件判断 ...
- Ansible playbook 详解
一.playbook流程介绍 playbook是由一个或者多个"play"组成的列表 play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角 ...
- 自动化运维工具-----Ansible playbook详解
目录 一.Ansible playbook简介 二.Ansible playbook使用场景 三.Ansible playbook格式 格式简介 核心元素 基本组件 variables变量 模板tem ...
- Ansible roles角色详解
roles角色 角色是ansible自1.2版本引入的新特性,用于层次性.结构化地组织playbook.roles能够根据层次型结构自动装载变量文件.tasks以及handlers等.要使用roles ...
- Ansible常用模块详解
Ansible常用模块 2015年底270多个模块,2016年达到540个,2018年01月12日有1378个模块,2018年07月15日1852个模块,2019年05月25日(ansible 2.7 ...
最新文章
- 职场与生活 八条原则 让你不再浪费时间和提高效率
- 地理文本处理技术在高德的演进(下)
- 机器学习实战10-Artificial Neural Networks人工神经网络简介(mnist数据集)
- 线程创建 pthread_create 中自定义参数注意事项
- Android:Android学习路线图
- 中兴V889D刷机变砖不用怕 V889D救砖教程发布【转载】
- 机房服务器巡视项目,年底,机房巡检不能少
- 13.软件架构设计:大型网站技术架构与业务架构融合之道 --- 业务意识
- 深入探索WebSockets
- 转自Alon's Blog
- Win10自定义安装Office2019
- 华为机试题(python版本)
- 软件的第三方CNAS测试的目的和意义以及测试内容和流程
- 南宁发展重点向南 五象湖标志性建筑“五象塔”落成
- 找不到AppData文件夹
- dagger2系列之Scope
- python远程连接mysql数据库_python远程连接MySQL数据库
- 理光Ricoh MP C5503 一体机驱动
- js简单实现div圆角
- 全错位排列 配对概率问题