Loading... <p style="text-indent:28px"><span style="font-family: 宋体">目录</span></p> <p style="text-indent:28px">1.1 playbook<span style="font-family:宋体">简介</span><span style="color:windowtext">… 1</span></p> <p style="text-indent:28px">1.2 Playbook<span style="font-family:宋体">使用场景</span><span style="color:windowtext">… 1</span></p> <p style="text-indent:28px">1.3 playbook<span style="font-family:宋体">格式</span><span style="color:windowtext">… 2</span></p> <p style="text-indent:28px">1.4 playbook<span style="font-family:宋体">语法介绍</span><span style="color:windowtext">… 3</span></p> <p style="text-indent:28px">1.5 Playbook<span style="font-family:宋体">执行结果解析</span><span style="color:windowtext">… 4</span></p> <p style="text-indent:28px">1.5.1 <span style="font-family:宋体">收集</span>facts<span style="color:windowtext"> 5</span></p> <p style="text-indent:28px">1.5.2 <span style="font-family:宋体">执行</span>tasks<span style="color:windowtext"> 6</span></p> <p style="text-indent:28px">1.5.3 <span style="font-family:宋体">报告结果</span><span style="color:windowtext">… 6</span></p> <p style="text-indent:28px">1.6 ansible-playbook<span style="font-family:宋体">实战小技巧</span><span style="color:windowtext">… 6</span></p> <p style="text-indent:28px">1.6.1 <span style="font-family:宋体">例子一</span><span style="color:windowtext">… 7</span></p> <p style="text-indent:28px">1.6.2 <span style="font-family:宋体">例子二</span><span style="color:windowtext">… 7</span></p> <p style="text-indent:28px">1.6.3 <span style="font-family:宋体">例子三</span><span style="color:windowtext">… 8</span></p> <h2>1.1 playbook<span style="font-family:黑体">简介</span></h2> <p style="text-indent:28px">playbook<span style="font-family:宋体">是</span>ansible<span style="font-family:宋体">用于配置,部署,和管理被控节点的剧本。通过</span>playbook<span style="font-family:宋体">的详细描述,执行其中的一系列</span>tasks<span style="font-family:宋体">,可以让远端主机达到预期的状态。</span>playbook<span style="font-family:宋体">就像</span>Ansible<span style="font-family:宋体">控制器给被控节点列出的的一系列</span>to-do-list<span style="font-family:宋体">,而被控节点必须要完成。</span></p> <p style="text-indent:28px"><span style="font-family:宋体">也可以这么理解,</span>playbook <span style="font-family:宋体">字面意思,即剧本,现实中由演员按照剧本表演,在</span>Ansible<span style="font-family:宋体">中,这次由计算机进行表演,由计算机安装,部署应用,提供对外服务,以及组织计算机处理各种各样的事情。</span></p> <h2>1.2 Playbook<span style="font-family:黑体">使用场景</span></h2> <p style="text-indent:28px"><span style="font-family: 宋体">执行一些简单的任务,使用</span>ad-hoc<span style="font-family:宋体">命令可以方便的解决问题,但是有时一个设施过于复杂,需要大量的操作时候,执行的</span>ad-hoc<span style="font-family:宋体">命令是不适合的,这时最好使用</span>playbook<span style="font-family:宋体">,就像执行</span>shell<span style="font-family:宋体">命令与写</span>shell<span style="font-family:宋体">脚本一样,也可以理解为批处理任务,不过</span>playbook<span style="font-family:宋体">有自己的语法格式,一会会介绍。</span></p> <p style="text-indent:28px"><span style="font-family:宋体">使用</span>playbook<span style="font-family:宋体">你可以方便的重用这些代码,可以移植到不同的机器上面,像函数一样,最大化的利用代码。在你使用</span>Ansible<span style="font-family:宋体">的过程中,你也会发现,你所处理的大部分操作都是编写</span>playbook<span style="font-family:宋体">。</span></p> <h2>1.3 playbook<span style="font-family:黑体">格式</span></h2> <p style="text-indent:0"> playbook<span style="font-family:宋体">由</span>YMAL<span style="font-family:宋体">语言编写。</span>YAML<span style="font-family:宋体">参考了其他多种语言,包括:</span>XML<span style="font-family:宋体">、</span>C<span style="font-family:宋体">语言、</span>Python<span style="font-family:宋体">、</span>Perl<span style="font-family:宋体">以及电子邮件格式</span>RFC2822<span style="font-family:宋体">,</span>Clark Evans<span style="font-family:宋体">在</span>2001<span style="font-family:宋体">年</span>5<span style="font-family:宋体">月在首次发表了这种语言,另外</span>Ingy döt Net<span style="font-family:宋体">与</span>Oren Ben-Kiki<span style="font-family:宋体">也是这语言的共同设计者。</span></p> <p style="text-indent:28px">YMAL<span style="font-family:宋体">格式是类似于</span>JSON<span style="font-family:宋体">的文件格式,便于人理解和阅读,同时便于书写。首先学习了解一下</span>YMAL<span style="font-family:宋体">的格式,对我们后面书写</span>playbook<span style="font-family:宋体">很有帮助。以下为</span>playbook<span style="font-family:宋体">常用到的</span>YMAL<span style="font-family:宋体">格式。</span></p> <p style="margin-left:28px"><span style="font-family: 楷体,楷体_GB2312,SimKai">l<span style="font-style: normal;font-weight: normal;font-size: 9px;line-height: normal;font-variant: normal"> </span>文件的第一行应该以 ”—” (三个连字符)开始,表明YMAL文件的开始。</span></p> <p style="margin-left:28px"><span style="font-family: 楷体,楷体_GB2312,SimKai">l 在同一行中,#之后的内容表示注释,类似于shell,python和ruby。</span></p> <p style="margin-left:28px"><span style="font-family: 楷体,楷体_GB2312,SimKai">l YMAL中的列表元素以”-”开头然后紧跟着一个空格,后面为元素内容。就像这样</span></p> <p style="text-indent:0;border:none;padding:0;padding:1px 5px 1px 5px"></p> <pre class="brush:bash;toolbar:false">- apple - banana - orange</pre> <p style="margin-left:28px;text-indent:0"><span style="font-family: 楷体,楷体_GB2312,SimKai">等价于JSON的这种格式</span></p> <p style="text-indent:0;border:none;padding:0;padding:1px 5px 1px 5px"></p> <pre class="brush:bash;toolbar:false">[ “apple”, “banana”, “orange” ]</pre> <p style="margin-left:28px"><span style="font-family: 楷体,楷体_GB2312,SimKai">l<span style="font-style: normal;font-weight: normal;font-size: 9px;line-height: normal;font-variant: normal"> </span>同一个列</span><span style="font-family: 楷体,楷体_GB2312,SimKai">表中的元素应该保持相同的缩进。否则会被当做错误处理。</span></p> <p style="margin-left:28px"><span style="font-family: 楷体,楷体_GB2312,SimKai">l play中hosts,variables,roles,tasks等对象的表示方法都是键值中间以”:”分隔表示,”:”后面还要增加一个空格。</span></p> <p style="margin-left:28px"><span style="font-family: 楷体,楷体_GB2312,SimKai">l YMAL的有很多的字符串可以解释为true或false:</span></p> <p style="margin-left:28px;text-indent:0"><span style="font-family: 楷体,楷体_GB2312,SimKai"> YMAL Truhy: true , True , TRUE , yes , Yes , YES , on , On , ON , y , <br /></span></p> <p style="margin-left:28px;text-indent:0"><span style="font-family: 楷体,楷体_GB2312,SimKai"> YMAL falthy: false , False , FALSE , no , No , NO , off , Off , OFF , n , N</span></p> <p style="text-indent:0"><span style="font-family:宋体">样例如下:</span></p> <p style="text-indent:0"><img title="1448846846320393.jpg" src="//cto.wang/usr/uploads/2016/07/20160703165623-31.jpg" /></p> <p style="text-indent:0"><span style="font-family:宋体">关于</span>YMAL<span style="font-family:宋体">的更多信息,请参考</span></p> <p style="text-indent:28px">http://baike.baidu.com/link?url=10WYbxN7mNFp1I3Dq4ZD0RyhSeBWDYMfe8OOyjWyZMweFnze7eunGEWQNqypT9vXABeysp798Ld16g9qtvTWtq#1_1</p> <h2>1.4 playbook<span style="font-family:黑体">语法介绍</span></h2> <p style="text-indent:0"><span style="font-family:宋体">对比上述格式,下面我们看一个安装部署</span>mysql<span style="font-family:宋体">服务的案例。</span><img title="1448846884128879.jpg" src="//cto.wang/usr/uploads/2016/07/20160703165623-19.jpg" /></p> <p style="text-indent:0"><span style="font-family:宋体">在</span>mysql.yml<span style="font-family:宋体">中,主要由三个部分组成。</span></p> <p style="margin-left:28px"><span style="font-family:Wingdings">l </span>hosts<span style="font-family:宋体">部分:使用</span>hosts<span style="font-family:宋体">指示使用哪个主机或主机组来运行下面的</span>tasks<span style="font-family:宋体">,每个</span>playbook<span style="font-family:宋体">都必须指定</span>hosts<span style="font-family:宋体">,</span>hosts<span style="font-family:宋体">也可以使用通配符格式。主机或主机组在</span>inventory<span style="font-family:宋体">清单中指定,可以使用系统默认的</span>/etc/ansible/hosts<span style="font-family:宋体">,也可以自己编辑,在运行的时候加上</span>-i<span style="font-family:宋体">选项,指定清单的位置即可。在运行清单文件的时候,</span>–list-hosts<span style="font-family:宋体">选项会显示那些主机将会参与执行</span>task<span style="font-family:宋体">的过程中。</span></p> <p style="margin-left:28px"><span style="font-family:Wingdings">l </span>remote_user<span style="font-family:宋体">:指定远端主机中的哪个用户来登录远端系统,在远端系统执行</span>task<span style="font-family:宋体">的用户,可以任意指定,也可以使用</span>sudo<span style="font-family:宋体">,但是用户必须要有执行相应</span>task<span style="font-family:宋体">的权限。</span></p> <p style="margin-left:28px"><span style="font-family:Wingdings">l </span>tasks<span style="font-family:宋体">:指定远端主机将要执行的一系列动作。</span>tasks<span style="font-family:宋体">的核心为</span>ansible<span style="font-family:宋体">的模块,前面已经提到模块的用法。</span>tasks<span style="font-family:宋体">包含</span>name<span style="font-family:宋体">和要执行的模块,</span>name<span style="font-family:宋体">是可选的,只是为了便于用户阅读,不过还是建议加上去,模块是必须的,同时也要给予模块相应的参数。</span></p> <h2>1.5 Playbook<span style="font-family:黑体">执行结果解析</span></h2> <p style="text-indent:0"><span style="font-family:宋体">使用</span>ansible-playbook<span style="font-family:宋体">运行</span>playbook<span style="font-family:宋体">文件,得到如下输出信息,输出内容为</span>JSON<span style="font-family:宋体">格式。并且由不同颜色组成,便于识别。一般而言</span></p> <p style="margin-left:28px"><span style="font-family:Wingdings">l </span><span style="font-family:宋体">绿色代表执行成功,系统保持原样</span></p> <p style="margin-left:28px"><span style="font-family:Wingdings">l </span><span style="font-family:宋体">黄色代表系统代表系统状态发生改变</span></p> <p style="margin-left:28px"><span style="font-family:Wingdings">l </span><span style="font-family:宋体">红色代表执行失败,显示错误输出。</span></p> <p style="text-indent:0"><img title="1448846902718970.jpg" src="//cto.wang/usr/uploads/2016/07/20160703165623-14.jpg" /></p> <p style="text-indent:0"><span style="font-family:宋体">在被控节点可以看到软件包已经安装并且</span>mysqld<span style="font-family:宋体">服务以及启动。</span></p> <p style="text-indent:0"><img title="1448846920342345.jpg" src="//cto.wang/usr/uploads/2016/07/20160703165623-68.jpg" /></p> <p style="text-indent:0"><span style="font-family:宋体">对比</span>playbook<span style="font-family:宋体">文件内容与执行结果,可以得出</span>playbook<span style="font-family:宋体">的执行步骤。</span></p> <p style="text-indent:0"><img title="1448846939352978.jpg" src="//cto.wang/usr/uploads/2016/07/20160703165623-83.jpg" /></p> <p style="text-indent:0"><span style="font-family:宋体">下面依次分析执行步骤</span></p> <h3>1.5.1 <span style="font-family:黑体">收集</span>facts</h3> <p style="text-indent:0"><span style="font-family:宋体">首先默认的第一个</span>task<span style="font-family:宋体">就是收集远端被管主机的</span>ansible<span style="font-family:宋体">元数据信息,也被称为</span>facts<span style="font-family:宋体">,</span>facts<span style="font-family:宋体">信息包括,远端主机发行版,</span>IP<span style="font-family:宋体">地址,</span>CPU<span style="font-family:宋体">核数,系统架构,主机名等等,然后这些元数据可以作为变量供后面的</span>task<span style="font-family:宋体">使用。你可以使用如下命令查看元数据的具体信息。</span></p> <p style="text-indent:0">ansible <hostpattern> -m setup [-i inventory_file]</p> <p style="text-indent:0"><span style="font-family:宋体">如下所示</span></p> <p style="text-indent:0"><img title="1448846992734932.jpg" src="//cto.wang/usr/uploads/2016/07/20160703165623-87.jpg" /></p> <p style="text-indent:0"><span style="font-family:宋体">在你执行的过程中,你会看到有大量的</span>facts<span style="font-family:宋体">信息,这里我只是截取一小部分。你也可以禁止</span>ansible<span style="font-family:宋体">收集</span>facts<span style="font-family:宋体">,在</span>playbook<span style="font-family:宋体">中的</span>hosts<span style="font-family:宋体">指令下面设置</span>gather_facts<span style="font-family:宋体">指令即可。如下</span></p> <p style="text-indent:0"><img title="1448847007518069.jpg" src="//cto.wang/usr/uploads/2016/07/20160703165623-21.jpg" /><img title="1448847018775414.jpg" src="//cto.wang/usr/uploads/2016/07/20160703165623-34.jpg" /></p> <p style="text-indent:0">facts<span style="font-family:宋体">经常被用在<strong>条件语句</strong>和<strong>模板</strong>当中,也可以用于根据指定的标准根据</span>group_by<span style="font-family:宋体">模块<strong>创建动态主机组</strong>,我们后面会详细介绍,这里我简单列出一个</span>facts<span style="font-family:宋体">的用法实例,使用条件判断语句关闭指定发行版的主机。</span></p> <p style="text-indent:0"><img title="1448847039508906.jpg" src="//cto.wang/usr/uploads/2016/07/20160703165623-41.jpg" /></p> <h3>1.5.2 <span style="font-family:黑体">执行</span>tasks</h3> <p style="text-indent:0"><span style="font-family:宋体">这里为实际执行的</span>task<span style="font-family:宋体">,每个任务都给出了它们的执行状态,是否改变了机器的状态。</span></p> <p style="text-indent:0"><img title="1448847056172209.jpg" src="//cto.wang/usr/uploads/2016/07/20160703165623-60.jpg" /></p> <p style="text-indent:0"><span style="font-family:宋体">我们可以看到每个</span>task<span style="font-family:宋体">都有自己定义的名称,我们也可以去除</span>task<span style="font-family:宋体">的名称。</span><img title="1448847065428534.jpg" src="//cto.wang/usr/uploads/2016/07/20160703165623-100.jpg" /></p> <p style="text-indent:0"><span style="font-family:宋体">然后查看输出信息</span></p> <p style="text-indent:0"><img title="1448847074235707.jpg" src="//cto.wang/usr/uploads/2016/07/20160703165623-63.jpg" /></p> <p style="text-indent:0"><span style="font-family:宋体">可以看到</span>task<span style="font-family:宋体">没有名称了,一般我们建议使用</span>name<span style="font-family:宋体">来标示任务,便于人更好的阅读。</span></p> <h3>1.5.3 <span style="font-family:黑体">报告结果</span></h3> <p style="text-indent:0"><span style="font-family:宋体">执行结果报告。第一次运行,系统状态改变了两次。</span></p> <p style="text-indent:0"><img title="1448847086655728.jpg" src="//cto.wang/usr/uploads/2016/07/20160703165623-11.jpg" /></p> <p style="text-indent:0"><span style="font-family:宋体">第二次运行,系统状态不再发生改变,这也说明了,</span>ansible<span style="font-family:宋体">的幂等性,我们可以多次的重复执行一个</span>playbook<span style="font-family:宋体">。而不用考虑系统重复执行</span>task<span style="font-family:宋体">。</span></p> <p style="text-indent:0"><img title="1448847094942623.jpg" src="//cto.wang/usr/uploads/2016/07/20160703165623-50.jpg" /></p> <h2>1.6 ansible-playbook<span style="font-family:黑体">实战小技巧</span> </h2> <p style="text-indent:0"><span style="font-family:宋体">上面执行</span>playbook<span style="font-family:宋体">的过程中,我们使用了</span>ansile-playbook<span style="font-family:宋体">命令,为了灵活的控制</span>playbook<span style="font-family:宋体">,</span>ansible<span style="font-family:宋体">提供了</span>ansible-playbook<span style="font-family:宋体">命令行工具,可以一些调整</span>playbook<span style="font-family:宋体">执行流的选项,这里举出一些有用的实例。更多用法请参考</span>ansible-playbook –h</p> <h3>1.6.1 <span style="font-family:黑体">例子一</span></h3> <p style="text-indent:0"><span style="font-family:宋体">查看当前任务,然后指定从哪里开始执行任务</span></p> <p style="text-indent:0"><img title="1448847121264759.png" src="//cto.wang/usr/uploads/2016/07/20160703165623-65.png" /></p> <p style="text-indent:0"><img title="1448847132907298.jpg" src="//cto.wang/usr/uploads/2016/07/20160703165623-20.jpg" /></p> <h3>1.6.2 <span style="font-family:黑体">例子二</span></h3> <p style="text-indent:0"><span style="font-family:宋体">执行或者跳过</span>playbook<span style="font-family:宋体">中指定的</span>tag<span style="font-family:宋体">,修改</span>mysql.yml<span style="font-family:宋体">增加</span>tags<span style="font-family:宋体">指令。</span></p> <p style="text-indent:0"><img title="1448847143749630.jpg" src="//cto.wang/usr/uploads/2016/07/20160703165623-66.jpg" /></p> <p style="text-indent:0"><span style="font-family:宋体">如下,结果,可以知道</span>—tags<span style="font-family:宋体">与</span>—skip-tags<span style="font-family:宋体">的区别。</span></p> <p style="text-indent:0"><img title="1448847156414854.jpg" src="//cto.wang/usr/uploads/2016/07/20160703165623-25.jpg" /></p> <h3>1.6.3 <span style="font-family:黑体">例子三</span></h3> <p style="text-indent:0"><span style="font-family:宋体">使用</span>—step<span style="font-family:宋体">来一步一步的确认命令。</span></p> <p style="text-indent:0"><img title="1448847169613082.jpg" src="//cto.wang/usr/uploads/2016/07/20160703165623-33.jpg" /></p> <p style="text-indent:0"><span style="font-family:宋体">提示:如果你感觉输出信息不够详细,使用</span>-v<span style="font-family:宋体">选项,使用</span>-vv<span style="font-family:宋体">选项,信息更加详细,信息最详细的为</span>-vvvv<span style="font-family:宋体">选项,自行尝试。</span></p> <p style="text-indent:0"> </p> <p style="text-indent:0"><span style="font-family:宋体">回顾下今天所讲内容</span>:</p> <p style="margin-left:24px">1、 playbook<span style="font-family:宋体">是什么</span></p> <p style="margin-left:24px">2、 playbook<span style="font-family:宋体">的基本格式</span></p> <p style="margin-left:24px">3、 playbook<span style="font-family:宋体">剧本组成</span></p> <p style="margin-left:24px">4、 playbook<span style="font-family:宋体">执行过程</span></p> <p style="margin-left:24px">5、 ansibel-playbook<span style="font-family:宋体">的几个基本案例</span></p> <p style="text-indent:0"> </p> 最后修改:2021 年 12 月 10 日 10 : 53 AM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 赞赏作者 支付宝微信