首页 > 解决方案 > 不同Linux发行版的ansible相同剧本

问题描述

我们为安装了 Ubuntu 的节点设计了一个 ansible playbook。

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

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

Ansible 推荐什么来更好地管理这个场景?

标签: ubuntumoduleansiblecentos

解决方案


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

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

因此,在文件等中setup-Ubuntu.ymlsetup-CentOS.yml您将保留特定于特定 Linux 的所有操作。另请参阅 Geerlingguy 的类似角色作为合适的示例。

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

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

- 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"

推荐阅读