Debian
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
我看不出您如何使該變數區分作業系統。我將如何將該變數定義為
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"
我試圖避免每次都創建一個全新的任務,因為唯一的區別是要安裝的包名稱,我創建的其餘角色是跨作業系統類型的冪等。
我看不出您如何使該變數區分作業系統。我如何根據發行版將該變數定義為 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'