여기의 예를 따르십시오. 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
해당 변수를 OS별로 어떻게 만드는지 이해할 수 없습니다. 이 변수를 릴리스 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"
유일한 차이점은 설치할 패키지 이름이고 내가 만드는 나머지 역할은 OS 유형 간에 멱등성이 있기 때문에 매번 새로운 작업을 생성하지 않으려고 노력하고 있습니다.
답변1
해당 변수를 OS별로 어떻게 만드는지 이해할 수 없습니다. 배포판에 따라 이 변수를 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'