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