按照此处的示例; https://docs.ansible.com/ansible/latest/collections/ansible/builtin/package_module.html#examples
# This uses a variable as this changes per distribution.
- name: Remove the apache package
ansible.builtin.package:
name: "{{ apache }}"
state: absent
我不明白你如何使该变量区分操作系统。我如何将该变量定义为发行版apache
或httpd
基于发行版?
我知道如何基于发行版制作游戏,但不知道如何使用上面的变量替换,就像这样;
---
- name: Upgrade packages
hosts: all
become: true
tasks:
- name: Update all packages to the latest version Debian
ansible.builtin.apt:
update_cache: yes
cache_valid_time: 3600
upgrade: full
when: ansible_facts['os_family'] == "Debian"
- name: Update all packages to the latest version RedHat
ansible.builtin.dnf:
update_cache: yes
name: "*"
state: latest
when: ansible_facts['os_family'] == "RedHat"
我试图避免每次创建一个全新的任务,因为唯一的区别是要安装的包名称,我创建的角色的其余部分在操作系统类型之间是幂等的。
答案1
我不明白你如何使该变量区分操作系统。我如何根据发行版将该变量定义为 apache 或 httpd ?
有很多选择。
一个简单的解决方案是使用vars_files
部分,并让它根据操作系统名称加载变量文件。例如:
- hosts: all
gather_facts: true
vars_files:
- "vars/{{ ansible_os_family|lower }}.yaml"
tasks:
- name: Remove the apache package
ansible.builtin.package:
name: "{{ apache }}"
state: absent
这使用了 的值ansible_os_family
,该值由 Ansible 的事实收集支持提供。鉴于上述任务,您可能有一个vars/redhat.yaml
包含以下内容的文件:
apache: httpd
vars/debian.yaml
或者包含以下内容的文件:
apache: apache2
如果您需要更多粒度,您可以使用ansible_distribution
而不是(例如,将在 Fedora、CentOS、Red Hat 等下,而具有特定发行版的名称)。ansible_os_family
ansible_os_family
Redhat
ansible_distribution
如果您想将其作为角色的一部分来执行此操作,则可以使用include_vars
模块。看例子在文档中:
- name: Load a variable file based on the OS type, or a default if not found. Using free-form to specify the file.
ansible.builtin.include_vars: "{{ lookup('ansible.builtin.first_found', params) }}"
vars:
params:
files:
- '{{ansible_distribution}}.yaml'
- '{{ansible_os_family}}.yaml'
- default.yaml
paths:
- 'vars'