Ansible ansible.builtin.package 变量替换

Ansible ansible.builtin.package 变量替换

按照此处的示例; 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

我不明白你如何使该变量区分操作系统。我如何将该变量定义为发行版apachehttpd基于发行版?

我知道如何基于发行版制作游戏,但不知道如何使用上面的变量替换,就像这样;

---
- 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_familyansible_os_familyRedhatansible_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'

相关内容