当前位置: 首页 > 科技观察

Linux自动化运维工具Ansible(二)

时间:2023-03-17 19:24:21 科技观察

YAML简介YAML是一种可读性很强的数据序列表达格式。YAML引用了许多其他语言,包括:XML、C语言、Python、Perl和电子邮件格式RFC2822。ClarkEvans于2001年在***上发表了这种语言,IngydotNet和OrenBen-Kiki也是这种语言的共同设计者。YAMLAin'tMarkupLanguage,也就是说,YAML不是XML。然而,在开发这种语言时,YAML实际上意味着:“YetAnotherMarkupLanguage”(仍然是一种标记语言)。其特点包括:YAML可读性好YAML脚本语言交互性好YAML使用实现语言的数据类型YAML具有一致的信息模型YAML易于实现YAML可基于流进行处理YAML具有很强的表达能力和良好的可扩展性YAML语法YAML的语法类似于其他高级语言,可以轻松表达列表、哈希表和标量等数据结构。其结构(Structure)用空格显示,序列(Sequence)中的项用“-”代替;Map中的键值对以“:”分隔。YAML文件扩展名通常是.yaml或.yml。下面是一个例子。2个重要的结构组成部分:list和directorylistlist的所有元素都以“-”开头,例如:dictionary字典由key和valuef标识,例如:key:value也可以放在{}中表示,例如:多个映射组成一个字典,一个列表可以包含多个字典。YAML中的变量命名变量名只能由字母、数字和下划线组成,并且只能以字母开头。factsfacts是正在通信的远程目标主机发回的信息,存储在ansible变量中。要获取指定远程主机支持的所有事实,可以使用以下命令:#ansiblehostname-msetup该命令可以获取被监控主机的各种信息,获取后将信息保存到变量中。自定义变量可以在yaml中使用vars关键字来定义变量:变量指的是特殊的变量,iteration当有需要重复执行的任务时,可以使用迭代机制。它的使用格式是将要迭代的内容定义为item变量引用,使用with_items语句指定要迭代的元素列表。示例:例如:在受控端添加2个用户方法一:通用方法方法一:使用变量法方法二:使用迭代法实际上,元素可以在with_items中使用,也可以是hash,例如:库存文件格式inventory文件遵循INI文件风格,方括号中的字符为组名。同一主机可以同时合并到多个不同的组;另外,如果目标主机使用非默认的SSH端口,也可以在主机名后加上冒号和端口号来标记。如果主机名遵循类似的命名模式,您还可以使用列表来标识每个主机。例如,在清单中定义用于剧本的主机时,可以将主机变量添加到主机变量。例如:组变量组变量是指分配给指定组中所有主机的剧本中可用的变量。例如:在组嵌套清单中,组中还可以包含其他组,变量也可以分配给组中的主机。但是这些变量只能在ansible-playbook中使用,ansible不支持。例如:inventory参数当ansible基于ssh连接到inventory中指定的远程主机时,也可以通过参数指定其交互方式;常用的参数如下:ansible的循环机制有比较高级的功能,大家可以试试。剧本剧本是一个或多个“剧本”的列表。play的主要作用是将预先合并到一个group中的hosts打扮成ansible中task预先定义的角色。从根本上说,所谓任务无非就是调用ansible的模块。通过将多个剧本组织成一个剧本,可以按照预先安排好的机制,将它们组合起来合唱一部大戏。playbook基本组件1,HostsandUsers中每一个play的目的是让一个或一些host以指定用户的身份执行任务。hosts用于指定执行指定任务的主机,可以是一个或多个以冒号分隔的主机组。remote_user用于指定在远程主机上执行任务的用户。但是,remote_user也可以在每个任务中使用。也可以通过指定sudo来执行远程主机上的任务,sudo可以用来播放全局或者某些特定的任务。此外,你甚至可以使用sudo_user来指定sudo时切换的用户。2.任务列表和actionplay的主要部分是任务列表。任务列表中的每个任务在hosts中指定的所有主机上依次执行,即第一个任务在所有主机上完成后,第二个任务开始。运行bottom-downplaybook时,如果中途出错,所有执行过的任务都会回滚,修改playbook后再执行即可。任务的目的是执行指定参数的模块,模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为结果是相同的。每个任务都应该有它的名字,用于playbook的执行结果输出。建议其内容尽可能清楚地描述任务执行步骤。如果未提供名称,则操作的结果将用于输出。可以使用“action:moduleoptions”或“module:options”的格式来定义任务,为了向后兼容推荐使用后者。如果一行动作内容过多,可以在行首使用几个空白字符来换行。在众多模块中,只有command和shell模块只需要给出一个列表即可,无需使用“key=value”格式。例如,如果命令或脚本的退出代码不为零,则可以使用以下代替:或使用ignore_errors忽略错误消息:3.处理程序用于在相关资源发生变化时采取某些操作。可以使用“notify”动作在每次播放结束时触发,这样可以避免每次发生多次变化时都执行指定的操作。相反,它只在所有更改完成后执行一次指定的操作。操作。notify中列出的操作称为handlers,即handler中定义的操作在notify中调用。处理程序是一个任务列表,与上述任务没有根本区别。tagtags用于让用户选择运行或通过playbook中的某些代码。Ansible是幂等的,所以它会自动跳过没有变化的部分。即便如此,有些代码仍然会花费很长时间来测试它们是否没有改变。这时候如果确定没有变化,可以通过标签跳过这些代码片段。示例:部署基于playbooks的web服务1.提供Inventory文件2.编辑playbooks脚本3.准备配置文件,将web配置放在指定目录src=/root/httpd.conf4.开始部署示例:查看端口:如果此时配置文件发生变化:至此,配置基本完成。