初窥Ansible playbook
Ansible是一个系列文章,我会尽量以通俗易懂、诙谐幽默的总结方式给大家呈现这些枯燥的知识点,让学习变的有趣一些。
Ansible系列博文直达链接:Ansible入门系列
前言
在上一篇文章中说到Ansible有两种玩法,一种是Ansible Ad-Hoc,另一种是就是这里要说的playbook。playbook是Ansible进行配置管理的组件,虽然Ansible的日常Ad-Hoc命令功能很强大,能完成一些基本的配置管理工作,但是Ad-Hoc命令无法支撑复杂环境的配置管理工作。在我们实际使用Ansible的工作中,大部分时间都是在编写playbook,接下来就重点说说如何玩转这个playbook。
执行playbook命令
我们都是按照yaml语法规则来编写playbook,至于yaml怎么玩,后面的文章我会总结一下的。在我们按照要求编写好了yaml文件后,如何来执行这个yaml文件呢?
Ansible提供了一个单独的命令:ansible-playbook
命令,我们可以通过这个命令来执行yaml脚本。常见的ansible-playbook
的使用方法如下:
最简单的使用方法:
ansible-playbook copyDemo.yaml
我们还可以使用以下命令查看输出的细节:
ansible-playbook copyDemo.yaml --verbose
我们也可以使用以下命令查看该yaml脚本将影响的主机列表:
ansible-playbook copyDemo.yaml --list-hosts
还可以使用以下命令检查yaml脚本语法是否正确:
ansible-playbook copyDemo.yaml --syntax-check
上面的几种使用方法基本就涵盖了我们日常工作中80%的场景了,剩余的20%场景,比如并行、异步等,很少用到,等真正用到的时候再去查阅相关资料也来的及。而工作中,更多的时候,我们不是在编写playbook,就是在编写playbook的路上。所以,接下来我重点说说如何写这个playbook,也就是playbook的基本语法。
playbook基本语法
最基本的playbook脚本分为三个部分:
- 在哪些机器上以什么身份执行
- 执行的任务有哪些
- 善后任务有哪些
我们在编写playbook脚本的时候,总是离不开上面的三个部分的。下面先来一个稍微有点复杂的playbook脚本,让大家先有一个整体的认识。
---
- hosts: server1
user: root
vars:
http_port: 80
max_clients: 200
tasks:
- name: Write apache config file
template: src=/home/test1/httpd.j2 dest=/home/test2/httpd.conf
notify:
- restart apache
- name: Ensure apache is running
service: name=httpd state=started
handlers:
- name: restart apache
service: name=httpd state=restarted
现在就对上述三部分稍作详细总结。
主机和用户
上面的yaml脚本,我们一开始就会看到hosts
、user
和vars
,其中vars
在后面的文章进行专门总结。而这里的hosts
和user
就是表示我们这个yaml将要在哪些主机上用哪个用户身份去操作。而这里的深一层次的关系如下表所示:
key | 含义 |
---|---|
hosts | 为主机的IP,或者主机组名,或者关键字all |
user | 在远程以哪个身份执行 |
become | 切换成其他用户身份执行,值为yes或者no |
become_method | 与become一起使用,值可以为sudo /su 等 |
become_user | 与become一起使用,可以是root或者其它用户名 |
在实际工作中,如果我们不指定user
时,则默认使用连接远程主机的用户进行操作,如果指定了执行用户而与ansible_ssh_user
指定用户不一致时,则需要开启become
操作,这里的become
配置与ansible.cfg中配置将相互配合完成工作,yaml中的become优先级高于ansible.cfg中配置中的优先级。
任务列表
任务列表是整个playbook的核心,对于任务列表,我们首先需要知道以下三点内容:
- 任务是从上到下顺序执行的,如果中间发生错误,那么整个playbook会中止;
- 每一个任务都是对模块的一次调用,只是使用不同的参数和变量而已;
- 每一个任务最好有一个name属性,这样在执行yaml脚本时,可以看到执行进度信息。
对于任务的参数有两种不同的写法,我们在编写yaml脚本时,可以按照自己的喜好进行选择。
写法一:
- name: Write apache config file
template: src=/home/test1/httpd.j2 dest=/home/test2/httpd.conf
写法二:
- name: Write apache config file
template:
src: /home/test1/httpd.j2
dest: /home/test2/httpd.conf
这两种写法都是OK的,我一般喜欢第二种写法。
最后,对于任务我们还需要特别一个点,那就是任务的执行状态。我们在执行Ansible Ad-Hoc或者ansible-playbook的时候,在输出中都会有一个changed
字段,比如:
192.168.1.3 : ok=2 changed=0 unreachable=0 failed=0
或者
192.168.1.3 : ok=2 changed=1 unreachable=0 failed=0
这里的这个changed
就是人物的执行状态,但是它为什么一会是0,一会有是1呢?这就要说到Ansible中一个叫做“幂等性”的概念。
幂等性
幂等性是数学和计算机科学上一个常见的概念,多次执行产生的结果不会发生改变,这样的特性就被成为幂等性。
大多数的Ansible模块在设计时保证了幂等性,幂等性保证了Ansible脚本多次执行情况下的相同结果,尽可能的避免使用那些不能满足幂等性的模块。比如我们经常使用的
shell
模块就是非幂等性的。
我们要明白Ansible是以“结果为导向的”,我们指定了一个“目标状态”,Ansible会自动判断“当前状态”是否与“目标状态”一致,如果一致,则不进行任何操作;如果不一致,那么就将“当前状态”变成“目标状态”,这就是“幂等性”,“幂等性”可以保证我们重复的执行同一项操作时,得到的结果是一样的。
那这个幂等性与上面的changed
又有什么关系呢?且听我下面慢慢道来!
- 当
changed
为false或者0时,表示Ansible没有进行任何操作,没有“改变什么”; - 当
changed
为true或者大于0时,表示Ansible执行了操作,“当前状态”已经被Ansible改变成了“目标状态”。
拿copy
这个模块来举例子说明,当我们准备将一个文件通过Ansible拷贝到远程主机时,copy
模块首先检查远程是否已经存在了该文件,如果不存在,则把文件拷贝过去,返回changed
为大于0;如果存在时,则开始比对两个文件的md5值,如果md5值一致,则说明两个文件是一样的,则不需要拷贝,此时copy
模块则什么都不干,返回changed
为0。
总结
通过三篇文章总结了Ansible中的常用模块、Ansible Ad-Hoc和ansible-playbook的一些惯用用法,从我的实际学习经验来说,学到这里,你可以将这三块内容结合起来使用了,至少可以在你们生产环境鼓捣一下了。生来就是折腾,更何况我们这么拼命、努力的学习呢!
果冻想,认真玩技术的地方。
2019年5月18日,于内蒙古呼和浩特。
初窥Ansible playbook的更多相关文章
- Scrapy001-框架初窥
Scrapy001-框架初窥 @(Spider)[POSTS] 1.Scrapy简介 Scrapy是一个应用于抓取.提取.处理.存储等网站数据的框架(类似Django). 应用: 数据挖掘 信息处理 ...
- Ansible playbook API 开发 调用测试
Ansible是Agentless的轻量级批量配置管理工具,由于出现的比较晚(13年)基于Ansible进行开发的相关文档较少,因此,这里通过一些小的实验,结合现有资料以及源码,探索一下Ansible ...
- 初窥Kaggle竞赛
初窥Kaggle竞赛 原文地址: https://www.dataquest.io/mission/74/getting-started-with-kaggle 1: Kaggle竞赛 我们接下来将要 ...
- scrapy2_初窥Scrapy
递归知识:oop,xpath,jsp,items,pipline等专业网络知识,初级水平并不是很scrapy,可以从简单模块自己写. 初窥Scrapy Scrapy是一个为了爬取网站数据,提取结构性数 ...
- WWDC15 Session笔记 - Xcode 7 UI 测试初窥
https://onevcat.com/2015/09/ui-testing/ WWDC15 Session笔记 - Xcode 7 UI 测试初窥 Unit Test 在 iOS 开发中已经有足够多 ...
- Java发送邮件初窥
一.背景 最近朋友的公司有用到这个功能,之前对这一块也不是很熟悉,就和他一起解决出现的异常的同时,也初窥一下使用Apache Common Email组件进行邮件发送. 二.Java发送邮件的注意事项 ...
- 【软件工程】week5-个人作业-敏捷开发方法初窥
敏捷开发方法初窥 引言:本周的软件工程个人博客作业是阅读关于敏捷开发方法的文章(http://martinfowler.com/agile.html),并撰写自己的读后感.文章内容非常丰富,对敏捷开发 ...
- 网页3D效果库Three.js初窥
网页3D效果库Three.js初窥 背景 一直想研究下web页面的3D效果,最后选择了一个比较的成熟的框架Three.js下手 ThreeJs官网 ThreeJs-github; 接下来我会陆续翻译 ...
- iOS视频直播初窥:高仿<喵播APP>
视频直播初窥 视频直播,可以分为 采集,前处理,编码,传输, 服务器处理,解码,渲染 采集: iOS系统因为软硬件种类不多, 硬件适配性比较好, 所以比较简单. 而Android端市面上机型众多, 要 ...
随机推荐
- Spring Cloud feign GET请求无法用实体传参的解决方法
代码如下: @FeignClient(name = "eureka-client", fallbackFactory = FallBack.class, decode404 = t ...
- Flutter 标签类控件大全Chip
老孟导读:Flutter内置了多个标签类控件,但本质上它们都是同一个控件,只不过是属性参数不同而已,在学习的过程中可以将其放在放在一起学习,方便记忆. RawChip Material风格标签控件,此 ...
- 一看就懂的Ubuntu系统下samba服务器安装配置教程
文章目录 前言 环境搭建 安装 配置 Examples 1 创建共享(任何人都可以访问) 2 单用户权限(需要密码访问) 添加samba用户 配置参数 3 支持游客访问(单用户拥有管理员权限) 前言 ...
- 【图机器学习】cs224w Lecture 8 & 9 - 图神经网络 及 深度生成模型
目录 Graph Neural Network Graph Convolutional Network GraphSAGE Graph Attention Network Tips Deep Gene ...
- layui select下拉菜单联动
做的比较简单,先从后台直接把第一级菜单输出,然后点击二级菜单的时候再动态展示 <div class="layui-inline"> <label class=&q ...
- 微信小程序通信录
第一步:phone.wxml中 <view bindlongtap="clickPhone">{{phoneNum}}</view> 第二步:phone.j ...
- 迟早要知道的JS系列之常用数组方法
常用数组方法 一.不会改变原始数组的方法: 即访问方法,下面的这些方法绝对不会改变调用它们的对象的值,只会返回一个新的数组或者返回一个其它的期望值. 1. concat() ** 语法:** Java ...
- PG primary 和 slave 互换
http://blog.sina.com.cn/s/blog_544a710b0101a122.html http://blog.51cto.com/heyiyi/1898506 https://bl ...
- elment新增el-select的全选功能
不废话,效果如图 代码实现 平生不爱啰嗦,功能如上已实现.
- 如何分析和提高(C/C++)程序的编译速度?
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://www.cnblogs.com/lihuidashen/p/129354 ...