译者:MjSeven
Ansible是系统管理员和开发人员拿来保持计算机系统处于最佳状态的一种流行的手动化工具。与可扩充框架一样,Ansible本身功能有限,它真正的功能彰显在许多模块中。在某种程度上,Ansible模块就是Linux系统的命令。它们针对特定问题提供解决方案,而维护计算机时的一项常见任务是使所有计算机的更新和一致。
我以前使用软件包的文本列表来保持系统或多或少的同步:我会列举电脑笔记本上安装的软件包,之后将其与台式机或另一台服务器之间进行交叉参考,自动填补差别。其实,在Linux机器上安装和维护应用程序是Ansible的一项基本功能,这意味着你可以在自己关心的计算机上列举所需的内容。
找寻正确的Ansible模块
Ansible模块的数目十分庞大,怎样找到能完成你任务的模块?在Linux中linux软件默认安装目录,你可以在应用程序菜单或中查找要运行的应用程序。使用Ansible时,你可以参考Ansible模块索引。
这个索引根据类别列举。稍加搜索,你就很可能找到所需的模块。对于包管理,Packaging模块几乎适用于所有带包管理器的系统。
动手写一个Ansible剧本
首先,选择本地计算机上的包管理器。诸如,假如你准备在运行Fedora的电脑笔记本上编撰Ansible指令(在Ansible中称为“剧本(playbook)”),这么从dnf模块开始。假如你在ElementaryOS上编撰,使用apt模块,以这种推。这样你就可以开始进行测试和验证,并可以在之后扩充到其它计算机。
第一步是创建一个代表你的剧本的目录。这不是绝对必要的,但这是一个好习惯。Ansible只须要一个配置文件就可以运行在YAML中,而且假如你之后想要扩充剧本,你就可以通过改变目录和文件的方法来控制Ansible。如今,只需创建一个名为或类似的目录:
你可以按照自己的喜好来命名Ansible的剧本,但一般将其命名为:
在你最喜欢的文本编辑器中打开,添加以下内容:
你必须调整使用的模块名称以匹配你使用的发行版。在此示例中,我使用dnf是由于我在FedoraLinux上编撰剧本。
如同Linux终端中的命令一样,晓得怎样来调用Ansible模块就早已成功了一半。这个示例剧本遵守标准剧本格式:
◈是一台或多台计算机。在本示例中,目标计算机是,即你当前正在使用的计算机(而不是你希望Ansible联接的远程系统)。
◈是你要在主机上执行的任务列表。
◈是任务的人性化名称。在这些情况下,我使用,由于这就是该任务正在做的事情。
◈容许Ansible修改运行此任务的用户。
◈容许Ansible成为用户来运行此任务。这是必须的,由于只有root用户能够使用dnf安装应用程序。
◈dnf是模块名称,你可以在Ansible网站上的模块索引中找到。
dnf
下的节点是dnf模块专用的。这是模块文档的关键所在。如同Linux命令的指南页一样,模块文档会告诉你可用的选项和所需的参数。
Ansible文档
安装软件包是一个相对简单的任务,仅须要两个元素。选项指示Ansible检测系统上是否存在软件包,而选项列举要查找的软件包。Ansible会针对机器的状态进行调整,因而模块指令仍然意味着修改。如果Ansible扫描了系统状态,发觉剧本里描述的系统(在本例中,和htop存在)与实际状态存在冲突,这么Ansible的任务是进行必要的修改来使系统与剧本匹配。Ansible可以通过dnf(或apt或则其它任何包管理器)模块进行修改。
每位模块可能都有一组不同的选项,所以在编撰剧本时,要常常参考模块文档。除非你对模块十分熟悉,否则这是期望模块完成工作的惟一合理方式。
验证YAML
剧本是用YAML编撰的。由于YAML遵守严格的句型,所以安装yamllint来检测剧本是很有帮助的。更妙的是,有一个专门针对Ansible的检测工具称为ansible-lint,它专门为剧本而生。在继续之前linux系统下载,安装它。
在Fedora或CentOs上:
在Debian、Elementary或Ubuntu上,同样的:
使用ansible-link来验证你的剧本。假如你没法使用ansible-lint,你可以使用yamllint。
成功则不返回任何内容linux软件默认安装目录,但若果文件中有错误,则必须先修补它们,之后再继续。复制和粘贴过程中的常见错误包括在最后一行的末尾省略换行符、使用制表符而不是空格来缩进。在文本编辑器中修补它们,重新运行,重复这个过程,直至ansible-lint或yamllint没有返回为止。
使用Ansible安装一个应用
如今你有了一个可验证的有效剧本,你总算可以在本地计算机上运行它了,由于你偶然晓得该剧本定义的任务须要root权限,所以在调用Ansible时必须使用选项,因而系统会提示你输入管理员密码。
开始安装:
这种命令被执行后,目标系统将处于与剧本中描述的相同的状态。
在远程系统上安装应用程序
通过如此多操作来替换一个简单的命令可能会适得其反,然而Ansible的优势是它可以在你的所有系统中实现手动化。你可以使用条件句子使Ansible在不同的系统上使用特定的模块,然而现今,假设所有计算机都使用相同的包管理器。
要联接到远程系统,你必须在文件中定义远程系统,该文件与Ansible是一起安装的,所以它早已存在了,但它可能是空的,不仅一些解释性注释之外。使用在你喜欢的文本编辑器中打开它。
你可以通过其IP地址或主机名(只要主机名可以解析)定义主机。诸如,假如你早已在中定义了并可以成功通,这么你可以在少将设置为主机。或则,假如你正在运行一个域名服务器或Avahi服务器而且可以通,这么你就可以在中定义它。否则,你必须使用它的IP地址。
你还必须成功地构建与目标主机的安全shell(SSH)联接。最简单的方式是使用命令,而且假如你曾经未曾与主机构建SSH联接,阅读我关于怎样创建手动SSH联接的文章。
一旦你在文件中输入了主机名或IP地址后,你就可以在剧本中修改定义:
再度运行:
此次linux定时器,剧本会在你的远程系统上运行。
假如你添加更多主机,则有许多方式可以过滤那个主机执行那个任务。比如,你可以创建主机组(服务器的,台式机的等)。
适用于混和环境的Ansible
到目前为止,我们仍然假设Ansible配置的所有主机都运行相同的操作系统(都是是使用dnf命令进行程序包管理的操作系统)。这么,假如你要管理不同发行版的主机,譬如Ubuntu(使用apt)或Arch(使用),或则其它的操作系统时,该如何办?
只要目标操作系统具有程序包管理器(MacOs有Homebrew,Windows有Chocolatey),Ansible才能派上用场。
这就是Ansible优势最显著的地方。在shell脚本中,你必须检测目标主机上有什么可用的包管理器,虽然使用纯Python,也必须检测操作系统。Ansible除了外置了这种功能,并且还具有在剧本中使用命令结果的机制。你可以使用关键字来执行由Ansible事实搜集子系统提供的变量定义的任务,而不是使用dnf模块。
关键字会加载目标插件。在本例中,它使用了变量,该变量由Ansible在初始搜集信息期间填充。你不须要告诉Ansible搜集有关其运行操作系统的事实,所以很容易忽视这一点,并且当你运行一个剧本时,你会在默认输出中看见它:
插件使用来自这个探针的信息,使用相关的包管理器命令填充,以安装在参数以后列举的程序包。使用8行代码,你可以克服在其它脚本选项中极少容许的复杂跨平台困局。
使用Ansible
如今是21世纪,我们都希望我们的计算机设备才能互联而且相对一致。无论你维护的是两台还是200台计算机,你都毋须一次又一次地执行相同的维护任务。使用Ansible来同步生活中的计算机设备,瞧瞧Ansible能够为你做些哪些。
via:
作者:SethKenlon选题:lujun9972译者:MjSeven校对:wxy
本文由LCTT原创编译,Linux中国荣誉推出