适用于不同linux发行版的相同剧本



我们为安装了Ubuntu的节点设计了一个可解析的剧本。

现在,我们必须在新机器(节点(上为使用Centos的不同客户播放相同的Playbook。

问题是,对于Centos,Ansible使用Yum模块(使用Yum包管理器安装模块(。在我们实际的剧本中,我们显然使用了apt模块。

Ansible建议如何更好地管理这种情况?

  • 为Centos重写剧本的版本更好吗
  • 还是最好保持相同的剧本并动态使用";apt";在Ubuntu上?还是百胜
  • 还有其他更合适的解决方案吗

一种常见的方法是为多个发行版编写一个剧本,剧本中有许多条件,或者只是将特定于发行版的任务分离到不同的文件中,并将这些文件包括在主角色中,如

# Perform distro-specific tasks.
- include_tasks: setup-"{{ ansible_distribution }}".yml

因此,在文件setup-Ubuntu.ymlsetup-CentOS.yml等中,您将保留特定于特定Linux的所有操作。也请将Geerlingguy的角色作为一个合适的例子。

如果你只想安装或删除一个包,而不想使用apt或百胜更复杂的功能,你可以使用相当简单的包模块,但如果这对你来说足够了,那么你将获得适用于不同Linux风格的相同代码。

此外,您需要考虑到在Ubuntu和CentOS中,许多文件(包括配置文件和程序二进制文件(位于不同的位置。因此,如果您决定使用包模块,您可以通过以下方式使用外部文件来处理发行版特定的事情:

- name: Load a variable file based on the OS type, or a default if not found.
include_vars: "{{ item }}"
with_first_found:
- "{{ ansible_distribution }}-vars.yaml"
- "{{ ansible_os_family }}-vars.yaml"
- default-vars.yaml

完成此任务后,您可以使用上述文件中定义的变量,这些变量使用特定于您的平台的值初始化,如

- name: Apply some config template
template:
src: my_config_template.j2
dest: "{{ distro_specific_destination }}"
validate: "{{ distro_specific_command }} %s"

问题是,对于Centos,Ansible使用Yum模块(使用Yum包管理器安装模块(。在我们实际的剧本中,我们显然使用了apt模块。

您最好使用package模块,该模块将选择适合目标机器的适当包管理器。然后,您只需要维护每个分发包名称的列表,但任务本身可以是相同的。

也就是说,你可以写这样的东西:

- hosts: all
tasks:
- name: Set OS distribution dependent variables
include_vars: "os_{{ ansible_facts['distribution'] }}.yml"
- name: install required packages
package:
name: "{{ required_packages }}"
state: installed

在你的剧本旁边,有文件os_Ubuntu.ymlos_CentOS.yml,在这些文件中设置required_packages变量。

相关内容

  • 没有找到相关文章

最新更新