Debian

Ansible ansible.builtin.package 變數替換

  • July 4, 2022

按照這裡的例子; 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"

我試圖避免每次都創建一個全新的任務,因為唯一的區別是要安裝的包名稱,我創建的其餘角色是跨作業系統類型的冪等。

我看不出您如何使該變數區分作業系統。我如何根據發行版將該變數定義為 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

如果您需要更多粒度(例如,將在 Fedora、CentOS、Red Hat 等下,而具有特定發行版的名稱),您可以使用ansible_distribution代替。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'

引用自:https://unix.stackexchange.com/questions/708567