ansible(19)--ansible的playbook
1. playbook简介
playbook的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来讲,所谓task无非是调用ansible的一个个模块。将多个play组织在一个playbook中,即可以让它们联同起来按事先编排的机制同唱一台大戏。
playbook 是一个 由 yaml 语法编写的文本文件,它由 play 和task 两部分组成。
play: 主要定义要操作主机或者主机组task:主要定义对主机或主机组具体执行的任务,可以是一个任务,也可以是多个任务(模块)
playbook和ad-hoc的主要区别如下:
playbook是对AD-Hoc的一种编排方式。
playbook可以持久运行,而Ad-Hoc只能临时运行。
playbook适合复杂的任务,而Ad-Hoc适合做快速简单的任务。
playbook能控制任务执行的先后顺序。
2. playbook编写规范
2.1 YAML语法规范
yaml的语法规范如下:
在单一档案中,可用连续三个连字号
"-"区分多个档案,也就是说在一个文件里可以写多个playbook。另外,还有选择性的连续三个点号“…”用来表示档案结尾,当文件只有一个playbook时,写上比较规范,不写也不会报错。次行开始正常写
Playbook的内容,一般建议写明该Playbook的功能,使用#号注释代码。短横线
“-”表示列表项,使用一个短横杠加一个空格。缩进必须是统一的,不能空格和
tab混用。缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的。
YAML文件内容和Linux系统大小写判断方式保持一致,是区别大小写的,k/v的值均需大小写敏感。k/v的值可同行写也可换行写。同行使用:分隔。v可是个字符串,也可是另一个列表。以冒号结尾的除外,其他所有冒号后面所有必须有空格。
YAML文件扩展名通常为yml或yaml。
2.2 YAML语法要素
YAML的语法要素:
列表
其所有元素均使用
“-”打头,表示平级关系,示例:# A list of tasty fruits
- Apple
- Orange
- Strawberry
- Mango
字典
Dictionary,通常由多个key与value构成,类似于变量赋值,key相当于变量,value为值,只不过连接用冒号,示例:# An employee record
name: Example Developer
job: Developer
skill: Elite
也可以将
key:value放置于{}中进行表示多个key:value,多个key:value使用逗号“,”隔开:示例:# An employee record
{name: Example Developer,job: Developer,skill: Elite}
列表和字典的结合使用:
name: John Smith
age: 41
gender: Male spouse: <==字典嵌套,spouse:表示key
name: Jane Smith <==name/age/gender三个字典为值
age: 37
gender: Female children: <==字典与列表嵌套
- name: Jimmy Smith <==被嵌套的列表
age: 17 <==列表内的字典
gender: Male
- name: Jenny Smith
age: 13
gender: Female
2.3 Playbook核心元素
Hosts
执行的远程主机列表,
Hosts为key,其值为将来要执行的主机列表。Tasks
任务集。
Varniables
内置变量或自定义变量在
playbook中调用。Templates (模板)
可替换模板文件中的变量并实现一些简单逻辑的文件。
Handlers 和notity结合使用
由特定条件触发的操作,满足条件方才执行,否则不执行。
tags (标签)
指定某条任务执行,用于选择运行
playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断。
2.4 Playbook的基础组件
Hosts
playbook中的每一个play的目的都是为了让某个或某些主机以某个指定的用户身份执行任务。hosts用于指定要执行指定任务的主机,须事先定义在主机清单中。remote_user
可用于
Host和task中。表示在远程的主机上以谁的身份去进行后面的任务。也可以指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务;甚至可以在sudo时使用sudo_user指定sudo时切换的用户。- hosts: websrvs
remote_user: root <==指定全局为root身份
tasks:
- name: test connection
ping:
remote_user: xu <==表示针对name这个模块使用xu
sudo: yes <==默认sudo为root
sudo_user:wang <==指定sudo切换时,使用wang
task列表
play的主体部分是task list。task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后,再开始第二个任务。task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致。每个
task都应该有其name,用于playbook的执行结果输出,建议其内容尽可能清晰地描述任务执行步骤。tasks:任务列表
格式:
action: module arguments
action: command /sbin/setenforce 0
module: arguments 建议使用
command: /sbin/setenforce 0
注意:
shell和command模块后面跟命令,而非key=value;某任务的状态在运行后为
changed时,可通过“notify”通知给相应的handlers(触发任务);任务可以通过
"tags“打标签,而后可在ansible-playbook命令上使用-t指定进行调用;
3 Playbook编写示例
3.1 ansible部署NFS示例
编写
NFS的playbook文件:---
- hosts: 192.168.20.23
remote_user: root tasks:
- name: Install NFS Server
yum:
name: nfs-utils
state: present - name: Configure NFS Server
copy:
src: conf/exports.j2
dest: /etc/exports
notify: Restrat NFS Service - name: Init NFS Server
file:
path: /data/nfs
state: directory
owner: “nginx”
group: ”nginx“
mode: "0644" - name: Start NFS service
service:
name: nfs
state: started
enabled: yes handlers:
- name: Restrat NFS Service
service:
name: nfs
state: restarted #NFS配置文件:
[root@xuzhichao playbook]# cat conf/exports.j2
/data/nfs 192.168.20.0/24(rw,all_squash,anonuid=887,anongid=887)
检查文件语法:
[root@xuzhichao playbook]# ansible-playbook install_nfs.yml --syntax-check
playbook: install_nfs.yml
运行
playbook文件:#测试运行:
[root@xuzhichao playbook]# ansible-playbook install_nfs.yml -C [root@xuzhichao playbook]# ansible-playbook install_nfs.yml PLAY [192.168.20.23] ***************************************************************************************************************************************** TASK [Gathering Facts] ***************************************************************************************************************************************
ok: [192.168.20.23] TASK [Install NFS Server] ************************************************************************************************************************************
ok: [192.168.20.23] TASK [Configure NFS Server] **********************************************************************************************************************************
changed: [192.168.20.23] TASK [Init NFS Server] ***************************************************************************************************************************************
changed: [192.168.20.23] TASK [Start NFS service] *************************************************************************************************************************************
changed: [192.168.20.23] RUNNING HANDLER [Restrat NFS Service] ************************************************************************************************************************
changed: [192.168.20.23] PLAY RECAP ***************************************************************************************************************************************************
192.168.20.23 : ok=6 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
检查
NFS服务情况:[root@xuzhichao playbook]# showmount -e 192.168.20.23
Export list for 192.168.20.23:
/data/nfs 192.168.20.0/24
3.2 ansible部署httpd示例
编写
httpd的playbook文件:[root@xuzhichao playbook]# cat install_httpd.yml
---
- hosts: 192.168.20.23
remote_user: root tasks:
- name: Install Htttpd Server
yum:
name: httpd
state: present - name: Configure Httpd Server
copy:
src: conf/httpd.conf.j2
dest: /etc/httpd/conf/httpd.conf
owner: "root"
group: "root"
mode: "0644"
notify: Restart Httpd Server - name: Init Httpd Server
copy:
src: file/test.html.j2
dest: /var/www/html/test.html
owner: "apache"
group: "apache"
mode: "0644" - name: Start Httpd Server
service:
name: httpd
state: started
enabled: yes handlers:
- name: Restart Httpd Server
service:
name: httpd
state: restarted
编写
httpd的配置文件和主页文件:#httpd的主页文件:
[root@xuzhichao playbook]# cat file/test.html.j2
ansible autodev web site #httpd的主配置文件:
[root@xuzhichao playbook]# cat conf/httpd.conf.j2
Listen 8000
运行
playbook:[root@xuzhichao playbook]# ansible-playbook install_httpd.yml PLAY [192.168.20.23] ***************************************************************************************************************************************** TASK [Gathering Facts] ***************************************************************************************************************************************
ok: [192.168.20.23] TASK [Install Htttpd Server] *********************************************************************************************************************************
ok: [192.168.20.23] TASK [Configure Httpd Server] ********************************************************************************************************************************
changed: [192.168.20.23] TASK [Init Httpd Server] *************************************************************************************************************************************
ok: [192.168.20.23] TASK [Start Httpd Server] ************************************************************************************************************************************
changed: [192.168.20.23] RUNNING HANDLER [Restart Httpd Server] ***********************************************************************************************************************
changed: [192.168.20.23] PLAY RECAP ***************************************************************************************************************************************************
192.168.20.23 : ok=6 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
测试
httpd的运行情况:[root@xuzhichao playbook]# curl http://192.168.20.23:8000/test.html
ansible autodev web site
ansible(19)--ansible的playbook的更多相关文章
- python3 ansible api 命令和playbook
一.api代码 # coding: utf-8 import os import sys from collections import namedtuple from ansible.parsing ...
- ansible基础-ansible角色的使用
ansible基础-ansible角色的使用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们建议把多个节点都会用到的功能将其定义模块,然后谁要用到该模块就直接调用即可!而在a ...
- ansible配置文件 ansible.cfg的一点说明
ansible配置文件 ansible.cfg的一点说明 > ansible --version ansible 2.1.1.0 config file = /etc/ansible/ansib ...
- 什么是 Ansible - 使用 Ansible 进行配置管理
[注]本文译自:https://www.edureka.co/blog/what-is-ansible/ Ansible 是一个开源的 IT 配置管理.部署和编排工具.它旨在为各种自动化挑战提供巨 ...
- Ansible系列(五):playbook应用和roles自动化批量安装示例
html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...
- Ansible系列(四):playbook应用和roles自动化批量安装示例
Ansible系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html playbook是ansible实现批量自动化最重要的手段.在其中可以使用变 ...
- Ansible入门篇:playbook的使用
playbooks介绍 playbooks是 一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活.简单来说,playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在 ...
- Ansible 笔记 (3) - 编写 playbook
playbook 相当于多个命令的编排组合然后一起运行,类似写脚本.在学习 playbook 之前需要了解 yaml 格式. 编写playbook的步骤: 定义主机与用户 编写任务列表 执行 play ...
- Ansible 书写我的playbook
mysql 创建数据库 - hosts: localhost remote_user: root tasks: - name: test mysql mysql_db: name: ...
- ansible 常用模块和playbook
随机推荐
- #Multi-SG#HDU 5795 A Simple Nim
题目 有\(n\)堆石子,每次可以从一堆中取出若干个或是将一堆分成三堆非空的石子, 取完最后一颗石子获胜,问先手是否必胜 分析 它的后继还包含了分成三堆非空石子的SG函数,找规律可以发现 \[SG[x ...
- mybatis复习(二)
简介 mybatis是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc,使开发者只需要关注 sql语句本身, 而不需要花费精力去处理加载驱动.创建连接.创建 statement 等繁杂的 ...
- UJCMS 9.1.0 发布,国内开源 java cms
许可协议从GPL-2改为Apache-2.0,更宽松的协议,方便用户将系统集成到自身的应用中. 修复了已知bug,系统更加稳定. 升级日志(9.1.0) 修复前台全文搜索没有结果 web.xml se ...
- 如何使用 Grafana 监控文件系统状态
当 JuiceFS 文件系统部署完成并投入生产环境,接下来就需要着手解决一个非常重要的问题 -- 如何实时监控它的运行状态?毕竟,它可能正在为关键的业务应用或容器工作负载提供持久化存储支持,任何小小的 ...
- 国密 SM2 的非对称签名验签过程
国密 SM2 的非对称签名验签过程 介绍 非对称加密确保了消息传输中的保密性,但是由于使用公钥加密,而公钥是分发出去的,可能泄露,谁都可以使用公钥加密发送消息. 因此为了保证收到的消息是由对应的发送者 ...
- 【转】CentOS安装VMware Tools
[转]CentOS安装VMware Tools VMware 是非常好的虚拟机软件.如果系统安装了VMware Tools以后对虚拟机的性能会提升很多的.下面是如果在CentOS系统内安装VMware ...
- ef 查询生成语句的几种方式
前言 整理一下ef 如何查看生成sql 语句的,现在有ef core 了,统一整理一下. 正文 方式如下: 数据库监听 这是一种推荐方式,因为调试和代码分开,不会有影响. 然后连接: 然后可以进行一些 ...
- iOS的cer、p12格式证书解析监控
之前博客写过直接解析ipa包获取mobileprovision文件来监控APP是否过期来,但APP的推送证书还没有做, 大家都知道,iOS的推送证书不会放到ipa包里,只能通过直接解析p12或cer. ...
- Linux 安装 adb环境
一. 查看系统是否安装有adb adb或者adb version 二.通过apt-get安装adb 1. 安装adb sudo apt-get install android-tools-adb 2. ...
- MyBatis 核心配置讲解(上)
大家好,我是王有志,一个分享硬核 Java 技术的互金摸鱼侠. 前两篇的文章中我们分别介绍了 MyBatis 和 MyBaits 的应用组成,到这里基础篇的内容就结束了. 从今天开始,我们正式进入 M ...