$ mkdir ~/install_packages
你可以根据自己的喜好来命名 Ansible 的剧本,但通常将其命名为 site.yml:$ touch ~/install_packages/site.yml
在你最喜欢的文本编辑器中打开 site.yml,添加以下内容:---- hosts: localhosttasks:- name: install packagesbecome: truebecome_user: rootdnf:state: presentname: - tcsh - htop
你必须调整使用的模块名称以匹配你使用的发行版在此示例中,我使用 dnf 是因为我在 Fedora Linux 上编写剧本就像 Linux 终端中的命令一样,知道 如何 来调用 Ansible 模块就已经成功了一半这个示例剧本遵循标准剧本格式:hosts 是一台或多台计算机在本示例中,目标计算机是 localhost,即你当前正在使用的计算机(而不是你希望 Ansible 连接的远程系统)tasks 是你要在主机上执行的任务列表name 是任务的人性化名称在这种情况下,我使用 install packages,因为这就是该任务正在做的事情become 允许 Ansible 更改运行此任务的用户become_user 允许 Ansible 成为 root 用户来运行此任务这是必须的,因为只有 root 用户才能使用 dnf 安装应用程序dnf 是模块名称,你可以在 Ansible 网站上的模块索引中找到dnf 下的节点是 dnf 模块专用的这是模块文档的关键所在就像 Linux 命令的手册页一样,模块文档会告诉你可用的选项和所需的参数Ansible 文档安装软件包是一个相对简单的任务,仅需要两个元素state 选项指示 Ansible 检查系统上是否存在 软件包,而 name 选项列出要查找的软件包Ansible 会针对机器的 状态 进行调整,因此模块指令始终意味着更改假如 Ansible 扫描了系统状态,发现剧本里描述的系统(在本例中,tcsh 和 htop 存在)与实际状态存在冲突,那么 Ansible 的任务是进行必要的更改来使系统与剧本匹配Ansible 可以通过 dnf(或 apt 或者其它任何包管理器)模块进行更改每个模块可能都有一组不同的选项,所以在编写剧本时,要经常参考模块文档除非你对模块非常熟悉,否则这是期望模块完成工作的唯一合理方法验证 YAML剧本是用 YAML 编写的因为 YAML 遵循严格的语法,所以安装 yamllint 来检查剧本是很有帮助的更妙的是,有一个专门针对 Ansible 的检查工具称为 ansible-lint,它专门为剧本而生在继续之前,安装它在 Fedora 或 CentOs 上:$ 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-llint,重复这个过程,直到 ansible-lint 或 yamllint 没有返回为止使用 Ansible 安装一个应用现在你有了一个可验证的有效剧本,你终于可以在本地计算机上运行它了,因为你碰巧知道该剧本定义的任务需要 root 权限,所以在调用 Ansible 时必须使用 --ask-become-pass 选项,因此系统会提示你输入管理员密码开始安装:$ ansible-playbook --ask-become-pass ~/install_packages/site.ymlBECOME 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 通,那么你可以在 /etc/ansible/hosts 中将 liavara 设置为主机或者,如果你正在运行一个域名服务器或 Avahi 服务器并且可以 ping 通 liavara,那么你就可以在 /etc/ansible/hosts 中定义它否则,你必须使用它的 IP 地址你还必须成功地建立与目标主机的安全 shell(SSH)连接最简单的方法是使用 ssh-copy-id 命令,但是如果你以前从未与主机建立 SSH 连接, 阅读我关于如何创建自动 SSH 连接的文章 一旦你在 /etc/ansible/hosts 文件中输入了主机名或 IP 地址后,你就可以在剧本中更改 hosts 定义:---- 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
这次,剧本会在你的远程系统上运行如果你添加更多主机,则有许多方法可以过滤哪个主机执行哪个任务例如,你可以创建主机组(服务器的 webserves,台式机的 workstations等)适用于混合环境的 Ansible到目前为止,我们一直假定 Ansible 配置的所有主机都运行相同的操作系统(都是是使用 dnf 命令进行程序包管理的操作系统)那么,如果你要管理不同发行版的主机,例如 Ubuntu(使用 apt)或 Arch(使用 pacman),或者其它的操作系统时,该怎么办?只要目标操作系统具有程序包管理器( MacOs 有 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 收集有关其运行操作系统的事实,所以很容易忽略这一点,但是当你运行一个剧本时,你会在默认输出中看到它:TASK [Gathering Facts] ok: [localhost]
action 插件使用来自这个探针的信息,使用相关的包管理器命令填充 ansible_pkg_mgr,以安装在 name 参数之后列出的程序包使用 8 行代码,你可以克服在其它脚本选项中很少允许的复杂跨平台难题使用 Ansible现在是 21 世纪,我们都希望我们的计算机设备能够互联并且相对一致无论你维护的是两台还是 200 台计算机,你都不必一次又一次地执行相同的维护任务使用 Ansible 来同步生活中的计算机设备,看看 Ansible 还能为你做些什么via: opensource.com作者: Seth Kenlon 选题: lujun9972 译者: MjSeven 校对: wxy本文由 LCTT 原创编译, Linux中国 荣誉推出点击“了解更多”可访问文内链接(图片来源网络,侵删)
0 评论