使用Ansible时,根据不同的操作系统发行版切换vars文件

首先

尽管属于同一个软件包,但在不同的发行版中可能会有不同的名称。此外,安装路径和配置文件路径可能会微妙地不同。

例如,Apache2.4的软件包名称在CentOS7中是「httpd」,而在Amazon Linux中则是「httpd24」。可以使用when子句根据任务进行指定,但如果在多个地方使用相同的值,Playbook会变得冗杂。

在这种情况下,事先定义好每个发行版/操作系统环境的变量并能够进行切换是非常方便的。此外,将控制权限制在角色范围内,而不是在全局控制(即在Role的调用者Playbook中控制)会使情况更加清晰。

我将以下总结出这种情况的解决方案。

简而言之

    • vars(roles/????/vars/main.yml)の中ではwhen句で切り替えられない

 

    • 各Roleのタスク(roles/????/tasks/main.yml)で、include_varsを使う

 

    include_varsと併せてwhen句を使う

试一试

环境

我已经在CentOS7和Amazon Linux上进行了确认。
这两个都是通过Virtual Box和Vagrant在本地创建虚拟机的环境。

必要的配置文件、Playbook已在下方链接中公开:
https://github.com/tmiki/server-config

CentOS7 – CentOS 7.

操作系统:CentOS Linux 7.5.1804版本(核心)
Python版本:2.7.5
Ansible版本:2.7.0

亚马逊 Linux

操作系统:Amazon Linux AMI 2017.03
Python版本:2.7.12
Ansible版本:2.6.4

Ansible Playbook的目录结构

假设Ansible Playbook的目录结构如下所示。

/path/to/ansible-playbooks/
  - ansible.cfg
  - ssh_config
  - sys_local.yml  ### ローカルホスト用のPlaybook。この中で各種Roleを読み込む。
  - hosts/  ### 環境ごとのホスト、変数の定義。今回は省略。
  - roles/  ### 各種Roleを格納しているディレクトリ
    - common/
    - common_httpd/  ### 今回はこのRoleの中の話になります。
    - common_supervisor/
    - :
    - :

Playbook的定义是什么?

首先,我们需要为每个操作系统发行版准备变量定义文件。这些文件的名称将为vars-CentOS7.yml和vars-AmazonLinux.yml。
在这些vars文件中,我们将定义变量“httpd_package_name”。

---
httpd_package_name: httpd
---
httpd_package_name: httpd24

在任务中,根据不同的操作系统分发版本,在当句中切换要加载的vars文件。在安装Apache的yum模块的“name”参数中,传递之前定义的“httpd_package_name”变量。

---
- name: Configure packages' name for AmazonLinux
  include_vars: vars-AmazonLinux.yml
  when: (ansible_distribution == "Amazon")

- name: Configure packages' name for CentOS7
  include_vars: vars-CentOS7.yml
  when: (ansible_distribution == "CentOS" and ansible_distribution_major_version == "7")

- name: Install Apache2.4
  yum: name="{{httpd_package_name}}" state=present update_cache=yes

解说 - 补充说明

(Note: This paraphrase is in simplified Chinese)

在不是我们预期的操作系统发行版上运行

如果在除了CentOS7/AmazonLinux以外的发行版上运行此Playbook,将会发生错误,因为“httpd_package_name”变量未定义。

在include_vars中指定变量。

由于指定了「include_vars」,因此在常规的Playbook任务文件中可以使用任意变量。
因此,还可以进行如下指定。

- name: Configure packages' name for each distributions
  include_vars: vars-{{ansible_distribution}}{{ansible_distribution_major_version}}.yml

在CentOS和Ubuntu上,“ansible_distribution_major_version”被正确设置,所以上述问题没有任何影响。
而在Amazon Linux上,“ansible_distribution_major_version”将变为“NA”,需要注意。
可能Amazon Linux 2的该值可能会变为2,但尚未验证。

然而,在这种情况下,”NA”只是一个简单的字符串,只需放置一个名为”vars-AmazonNA.yml”的文件即可。

顺便提一下,“ansible -m setup localhost”的结果如下所示。

$ ansible -m setup localhost
### ※途中省略
        "ansible_distribution": "CentOS",
        "ansible_distribution_file_parsed": true,
        "ansible_distribution_file_path": "/etc/redhat-release",
        "ansible_distribution_file_variety": "RedHat",
        "ansible_distribution_major_version": "7",
        "ansible_distribution_release": "Core",
        "ansible_distribution_version": "7.5.1804",
### ※途中省略
$ ansible -m setup localhost
### ※途中省略
        "ansible_distribution": "Amazon",
        "ansible_distribution_file_parsed": true,
        "ansible_distribution_file_path": "/etc/system-release",
        "ansible_distribution_file_variety": "Amazon",
        "ansible_distribution_major_version": "NA",
        "ansible_distribution_release": "NA",
        "ansible_distribution_version": "2017.03",
### ※途中省略
广告
将在 10 秒后关闭
bannerAds