我有一个使用很多变量的 Ansible 角色,并且由于这些变量是在服务器配置之后调整的(例如它正在使用的操作系统版本),所以我的目录“MyRole/vars”充满了针对不同情况的不同文件。
在“MyRole/vars”中我有:
- RedHat6_安装.yml
- Redhat7_安装.yml
- RedHat8_安装.yml
- RedHat6_卸载.yml
- RedHat7_卸载.yml
- RedHat8_卸载.yml
等等...
我想知道是否可以将变量分组到一个文件中并为其制定条件,例如:
主要.yml:
- uninstall_var_1
when: >
ansible_distribution_major_version == 6
- uninstall_var_2
when: >
ansible_distribution_major_version == 7
- uninstall_var_3
when: >
ansible_distribution_major_version == 8
and so on...
答案1
可能有更好的方法可以做到这一点,我期待看到它们,但我目前正在做的事情看起来很像这样。取自我正在使用的自定义fail2ban角色:
变量看起来像这样。我为每个变量都创建了变量文件{{ansible_os_family}}
,然后为{{ansible_distribution}}_{{ansible_distribution_major_version}}
可能需要它们的任何变量进行覆盖。
$ ls -l
lrwxrwxrwx. 1 error error 24 May 7 07:51 fail2ban_os_CentOS_6.yml -> fail2ban_os_RedHat_6.yml
lrwxrwxrwx. 1 error error 22 May 7 07:51 fail2ban_os_CentOS.yml -> fail2ban_os_RedHat.yml
-rw-rw-r--. 1 error error 64 May 7 07:51 fail2ban_os_Debian.yml
-rw-rw-r--. 1 error error 64 May 7 07:51 fail2ban_os_Fedora.yml
-rw-rw-r--. 1 error error 62 May 7 07:51 fail2ban_os_RedHat_6.yml
-rw-rw-r--. 1 error error 64 May 7 07:51 fail2ban_os_RedHat.yml
-rw-rw-r--. 1 error error 62 May 7 07:51 fail2ban_os_Ubuntu_14.yml
-rw-rw-r--. 1 error error 65 May 7 07:51 fail2ban_os_Ubuntu.yml
$ cat fail2ban_os_Ubuntu.yml
fail2ban_backend: systemd
fail2ban_banaction: iptables-multiport
$ cat fail2ban_os_Fedora.yml
fail2ban_backend: systemd
fail2ban_banaction: firewallcmd-ipset
要加载这些文件,roles/fail2ban/tasks/main.yml
请按如下方式开始:
---
- include_vars: fail2ban_os_{{ansible_os_family}}.yml
ignore_errors: True
- include_vars: fail2ban_os_{{ansible_distribution}}_{{ansible_distribution_major_version}}.yml
ignore_errors: True
这意味着变量文件不需要存在。当然,如果所需的变量没有在某处定义,后面的任务就会失败,然后你就可以去定义你错过的变量。
为了保持一致性和可维护性,通用操作系统系列变量文件包含代表最新支持的发行版的变量,而特定发行版的覆盖则适用于较旧的发行版。