使用Ansibleplaybook在设备上自动安装和更新软件。Ansible是一种流行的自动化工具,系统管理员和开发人员使用它来使计算机系统保持最佳状态。和可扩展框架一样,Ansible本身功能有限,真正的功能体现在很多模块中。在某种程度上,Ansible模块是Linux系统的命令。它们为特定问题提供解决方案,维护计算机时的一项常见任务是使所有计算机保持更新和一致。我曾经使用包的文本列表来或多或少地保持系统同步:我会列出我的笔记本电脑上安装的包,然后将其与我的台式机或其他服务器进行交叉引用,手动弥补差异。当然,在Linux机器上安装和维护应用程序是Ansible的一个基本特性,这意味着你可以在你关心的机器上列出你想要的东西。寻找合适的Ansible模块Ansible模块数量众多,您如何找到适合您工作的模块?在Linux中,您可以在应用程序菜单或/usr/bin中找到要运行的应用程序。使用Ansible时,可以参考Ansible模块索引。该指数按类别列出。稍微搜索一下,您可能会找到所需的模块。对于包管理,Packaging模块可用于几乎所有具有包管理器的系统。动手编写Ansible剧本首先,在您的本地计算机上选择一个包管理器。例如,如果您计划在运行Fedora的笔记本电脑上编写Ansible指令(在Ansible中称为“剧本”),请从dnf模块开始。如果您在ElementaryOS上编写,请使用apt模块等。这样您就可以开始测试和验证,然后扩展到其他计算机。第一步是创建一个代表您的剧本的目录。这不是绝对必要的,但这是一个好习惯。Ansible只需要一个配置文件就可以在YAML中运行,但是如果你以后想扩展playbook,你可以通过改变目录和文件来控制Ansible。现在,只需创建一个名为install_packages或类似的目录:$mkdir~/install_packages你可以随意命名Ansible的剧本,但通常它被称为site.yml:$touch~/install_packages/site.yml在你喜欢的文本中打开site.yml编辑器并添加以下内容:----hosts:localhosttasks:-name:installpackagesbecome:truebecome_user:rootdnf:state:presentname:-tcsh-htopyou使用的模块名称必须调整以匹配你的发行版正在使用。在此示例中,我使用dnf,因为我正在FedoraLinux上编写剧本。就像Linux终端中的命令一样,知道如何调用Ansible模块就成功了一半。此示例剧本遵循标准剧本格式:主机是一台或多台计算机。在此示例中,目标机器是localhost,这是您当前正在使用的机器(不是您希望Ansible连接到的远程系统)。任务是您要在主机上执行的任务列表。name是任务的人性化名称。在这种情况下,我使用安装包,因为这就是任务正在做的事情。become允许Ansible更改运行此任务的用户。become_user允许Ansible成为root用户来运行这个任务。这是必要的,因为只有root用户才能使用dnf安装应用程序。dnf是模块名,可以在Ansible网站的模块索引中找到。dnf下的节点专用于dnf模块。这是模块文档的关键。与Linux命令的手册页一样,模块文档会告诉您可用的选项和所需的参数。Ansible文档安装包是一项相对简单的任务,只需要两个要素。state选项指示Ansible检查系统上是否存在包,而name选项列出要查找的包。Ansible会根据机器的状态进行调整,因此模块指令总是暗示着变化。如果Ansible扫描系统状态并发现playbook中描述的系统(在本例中存在tcsh和htop)与实际状态存在冲突,那么Ansible的工作就是进行必要的更改以使系统与playbook匹配。Ansible可以通过dnf(或apt或任何其他包管理器)模块进行更改。每个模块可能有一组不同的选项,因此在编写playbook时请务必参考模块文档。除非您非常熟悉模块,否则这是期望模块完成其工作的唯一合理方式。验证YAML剧本是用YAML编写的。因为YAML遵循严格的语法,所以安装yamllint来检查playbook很有帮助。更好的是,有一个特定于Ansible的linting工具,称为ansible-lint,专为playbook制作。在继续之前,安装它。在Fedora或CentOs上:$sudodnfinstallyamllintpython3-ansible-lint在Debian、Elementary或Ubuntu上,相同:$sudoaptinstallyamllintansible-lint使用ansible-link来验证你的剧本。如果你不能使用ansible-lint,你可以使用yamllint。$ansible-lint~/install_packages/site.yml成功时不返回任何内容,但如果文件中有错误,则必须在继续之前修复它们。复制和粘贴过程中的常见错误包括省略最后一行末尾的换行符,以及使用制表符而不是空格进行缩进。在文本编辑器中修复它们,重新运行ansible-llint,并重复该过程,直到ansible-lint或yamllint没有返回任何内容。使用Ansible安装应用程序现在你有了一个可验证有效的playbook,你终于可以在你的本地机器上运行它了,因为你碰巧知道playbook定义了需要root权限的任务,所以你必须在调用Ansible时使用--ask-become-pass选项,因此系统将提示您输入管理员密码。开始安装:$ansible-playbook--ask-become-pass~/install_packages/site.ymlBECOMEpassword:PLAY[localhost]*********************************任务[收集事实]************************************ok:[localhost]TASK[installpackages]**********************************ok:[localhost]PLAYRECAP********************************localhost:ok=0changed=2unreachable=0failed=0[...]在这些之后命令被执行后,目标系统将处于与脚本中描述的相同状态。在远程系统上安装应用程序时,用如此多的操作代替一个简单的命令可能会适得其反,但Ansible的优势在于它可以在所有系统上实现自动化。您可以使用条件语句让Ansible在不同系统上使用特定模块,但现在,假设所有机器都使用相同的包管理器。要连接到远程系统,必须在/etc/ansible/hosts文件中定义远程系统,该文件随Ansible一起安装,所以它已经存在,但它可能是空的,除了一些解释性注释。使用sudo在你最喜欢的文本编辑器中打开它。您可以通过IP地址或主机名来定义主机(只要主机名是可解析的)。比如你在/etc/hosts里定义了liavara,能ping通,那么你就可以在/etc/ansible/hosts里把liavara设置为host。或者,如果您正在运行名称服务器或Avahi服务器并且可以pingliavara,那么您可以在/etc/ansible/hosts中定义它。否则,您必须使用其IP地址。您还必须成功建立到目标主机的安全外壳(SSH)连接。最简单的方法是使用ssh-copy-id命令,但如果您以前从未与主机建立SSH连接,请阅读我关于如何创建自动SSH连接的文章。在/etc/ansible/hosts文件中输入主机名或IP地址后,您可以更改剧本中的主机定义:----hosts:alltasks:-name:installpackagesbecome:truebecome_user:rootdnf:state:presentname:-tcsh-htop再次运行ansible-playbook:$ansible-playbook--ask-become-pass~/install_packages/site.yml这一次,playbook将在您的远程系统上运行。如果添加更多主机,有很多方法可以过滤哪个主机执行哪个任务。例如,您可以创建主机组(用于服务器的网络服务、用于台式机的工作站等)。适用于混合环境的Ansible到目前为止,我们假设Ansible配置的所有主机都运行相同的操作系统(使用dnf命令进行包管理的操作系统)。那么,如果您想管理不同发行版的主机,例如Ubuntu(使用apt)或Arch(使用pacman)或其他操作系统怎么办?只要目标操作系统有包管理器(MacOs的Homebrew,Windows的Chocolatey),Ansible就会派上用场。这是Ansible的优势最明显的地方。在shell脚本中,您必须检查目标主机上有哪些包管理器可用,即使使用纯Python,您也必须检查操作系统。Ansible不仅内置了这些功能,而且还具有在playbook中使用命令结果的机制。您可以使用action关键字来执行由Ansible事实收集子系统提供的变量定义的任务,而不是使用dnf模块。----hosts:alltasks:-name:installpackagesbecome:truebecome_user:rootaction:>{{ansible_pkg_mgr}}name=htop,transmissionstate=presentupdate_cache=yesaction关键字将加载目标插件。在这种情况下,它使用ansible_pkg_mgr变量,该变量在初始信息收集期间由Ansible填充。您不需要告诉Ansible收集有关其运行的操作系统的信息,因此很容易错过这一点,但您会在运行剧本时在默认输出中看到它:TASK[GatheringFacts]******************************************ok:[localhost]action插件使用来自此探测器的信息,使用相关包管理器命令填充ansible_pkg_mgr以安装名称参数后列出的包。使用8行代码,您可以克服很少有其他脚本选项允许的复杂的跨平台挑战。使用Ansible现在是21世纪,我们都希望我们的计算机设备相互连接并且相对一致。无论您维护两台计算机还是200台计算机,您都不必一遍又一遍地执行相同的维护任务。使用Ansible同步你生活中的计算机设备,看看Ansible还能为你做些什么。
