Isto é, até onde eu sei, uma das partes mais confusas da Ansible. Eu sempre pensei que deveria ter uma maneira de descobrir o que o gerenciador de pacotes está em uso sozinho, sem precisar que eu o especifique.
Enquanto isso, tenho muitas funções com tarefas assim:
- name: Update OpenSSH on CentOS
yum: name=openssh state=latest enablerepo=cr
when: ansible_distribution == 'CentOS' and ansible_distribution_major_version|int == 7
notify: restart sshd
- name: Update OpenSSH on RHEL
yum: name=openssh state=latest
when: ansible_distribution == 'RedHat' and ansible_distribution_major_version|int == 7
notify: restart sshd
- name: Update OpenSSH on Fedora
yum: name=openssh state=latest
when: ansible_distribution == 'Fedora' andansible_distribution_major_version|int <= 21
notify: restart sshd
- name: Update OpenSSH on Fedora
dnf: name=openssh state=latest
when: ansible_distribution == 'Fedora' andansible_distribution_major_version|int >= 22
notify: restart sshd
- name: Update OpenSSH on Debian/Ubuntu
apt: name=openssh-server state=latest
when: ansible_os_family == 'Debian'
notify: restart ssh
Isso fica um pouco pesado. No entanto, tem suas vantagens. Se você inspecionar com cuidado, notará que a versão do CentOS é diferente; ele habilita um repositório ao instalar o pacote.
É claro que há uma razão para fazer isso dessa maneira. Em sistemas diferentes, você pode até ter diferentes pacotes nomes , assim você pode acabar tendo que ter tarefas diferentes para eles de qualquer maneira. Mas isso é algo que você pode empurrar em uma variável específica do sistema operacional e, em seguida, fazer algo como:
- include_vars: common_os_{{ansible_distribution}}_{{ansible_distribution_major_version}}.yml
- name: Install minimum system administration packages
yum: name={{item}} state=present
with_items: common_packages_admin
when: ansible_os_family == 'RedHat'
- name: Install minimum system administration packages
apt: name={{item}} state=present
with_items: common_packages_admin
when: ansible_os_family == 'Debian'
Mas, para estender isso para dnf
, será necessário um monte de lógica when:
extra, o que é muito trabalhoso para um ganho absolutamente nulo, já que a compatibilidade do yum da dnf cuidará disso. Aqui está um lugar onde esse módulo hipotético "descobrir automaticamente qual gerenciador de pacotes usar" seria útil.
Mas mesmo se você tivesse um, às vezes você ainda precisa usar gerenciadores de pacotes individuais, porque alguns deles têm ... idiossincrasias.
- name: Install salt-minion
yum: name=salt-minion state=latest
when: ansible_os_family == 'RedHat'
- name: Install salt-minion
apt: name=salt-minion state=latest update_cache=yes
when: ansible_os_family == 'Debian'
Então, o melhor conselho que posso dar é: Espere até que o Ansible tenha uma maneira melhor de lidar com os gerenciadores de pacotes. Ou escreva um ...