使用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",
### ※途中省略