我从ansible开始,并将使用它在几个 Linux 发行版上安装软件包。
我在文档中看到yum
andapt
命令是分开的 - 统一它们并使用如下内容的最简单方法是什么:
- name: install the latest version of Apache
unified_install: name=httpd state=latest
代替
- name: install the latest version of Apache on CentOS
yum: name=httpd state=latest
when: ansible_os_family == "RedHat"
- name: install the latest version of Apache on Debian
apt: pkg=httpd state=latest
when: ansible_os_family == "Debian"
我知道这两个包管理器是不同的,但它们仍然有一组共同的基本用法。其他编排器(例如 salt)只有一个安装命令。
更新:从 Ansible 2.0 开始,现在有一个通用和抽象的
package
模块用法示例:
现在,当不同操作系统系列的包名称相同时,它很简单:
当软件包名称因操作系统系列而异时,您可以使用发行版或操作系统系列特定的 vars 文件来处理它:
然后,对于您必须以不同方式处理的每个操作系统...创建一个 vars 文件:
编辑:
由于 Michael DeHaan(Ansible 的创建者)选择不像Chef那样抽象出包管理器模块,如果您仍在使用旧版本的 Ansible (Ansible < 2.0),不幸的是,您需要在所有剧本和角色中处理此操作。 恕我直言,这将许多不必要的重复工作推给了剧本和角色作者……但这就是目前的情况。请注意,我并不是说我们应该尝试抽象包管理器,同时仍然尝试支持它们的所有特定选项和命令,但只是有一种简单的方法来安装与包管理器无关的包。我也不是说我们都应该使用智能包管理器潮流,但是配置管理工具中的某种包安装抽象层对于简化跨平台的剧本/食谱非常有用。Smart 项目看起来很有趣,但是在没有太多采用的情况下统一跨发行版和平台的包管理是相当雄心勃勃的……看看它是否成功将会很有趣。真正的问题是不同发行版的包名称有时会有所不同,因此我们仍然需要使用案例语句或
when:
语句来处理差异。我一直在处理它的方式是
tasks
在剧本或角色中遵循这个目录结构:然后在我的
main.yml
:这在
foo.yml
(对于包'foo'):然后对于不同的包管理器:
易于:
百胜:
自制:
请注意,这是非常重复的,而不是DRY,尽管有些事情在不同的平台上可能会有所不同并且必须处理,但通常我认为与 Chef 相比,这是冗长且笨拙的:
是的,有人认为某些包名称在不同发行版中是不同的。尽管目前缺乏易于访问的数据,但我敢猜测大多数流行的包名称在发行版中都很常见,并且可以通过抽象的包管理器模块安装。无论如何都需要处理特殊情况,并且已经需要额外的工作来减少 DRY 如果有疑问,请查看pkgs.org。
您可以通过事实抽象出包管理器
您所需要的只是一些设置
ansible_pkg_mgr
为apt
或yum
等的逻辑。Ansible也在努力在未来的模块中做你想做的事情。
从 Ansible 2.0 开始,有了新的
Package
-modul。http://docs.ansible.com/ansible/package_module.html
然后你可以像你的提议一样使用它:
您仍然必须考虑名称差异。
查看 Ansible 关于Conditional Imports的文档。
即使每个操作系统的服务名称不同,一项任务也能确保 apache 正在运行。
您不想这样做,因为发行版之间的某些包名称不同。例如,在与 RHEL 相关的发行版中,流行的 Web 服务器包被命名为
httpd
,而在 Debian 相关的发行版中,它被命名为apache2
。同样,还有大量其他系统和支持库。可能有一组通用的基本参数,但还有一些更高级的参数,它们在包管理器之间是不同的。并且您不希望处于模棱两可的情况下,对于某些命令您使用一种语法,而对于其他命令您使用另一种语法。
最重要的答案似乎都链接到损坏的页面。这看起来像正确的 URL:https ://docs.ansible.com/ansible/latest/collections/ansible/builtin/package_module.html