Comando paramétrico ansible baseado em fatos, como fazer isso?

4

Estou atualizando alguns dos meus ansiosos playbooks para rodar na última versão do Fedora, que agora usa dnf por padrão.

Como a maioria dos meus playbooks também deve ser executada no CentOS, eu gostaria que meu script executasse o comando ansible yum ao executar em uma máquina do CentOS e executasse o comando dnf (novo no Ansible 1.9 ) quando correr contra o Fedora , mas usando o resto da função como está.

Em outras palavras, eu gostaria de escrever uma única operação que possa inteligentemente escolher o comando righ (algo parecido com):

- name: Install zsh
  sudo: yes
  yum|dnf: name=zsh state=latest

... em vez de copiar e colar o mesmo comando duas vezes, substituindo yum por dnf em um dos dois e, em seguida, implementando alguma lógica que diz qual das duas funções distintas deve ser executada:

- name: Install zsh (yum version)
  sudo: yes
  yum: name=zsh state=latest

- name: Install zsh (dnf version)
  sudo: yes
  dnf: name=zsh state=latest

Antes que alguém se apresse: Eu sei que yum em um alias de dnf no Fedora mais recente, e que eu poderia deixar o manual como está ... Minha pergunta é não sobre como escrever playbooks compatíveis com o CentOS / Fedora, a minha questão é sobre escolher um comando diferente para os mesmos parâmetros dependendo do ambiente de destino

    
por mac 30.05.2015 / 16:02

2 respostas

7

O Ansible 2 tem um gerenciador de pacotes genérico agora:

link

Para versões mais antigas, você pode associar gerenciadores de pacotes por meio de fatos

- name: Install packages
  with_items: package_list
  action: "{{ ansible_pkg_mgr }} state=installed name={{ item }}"

Agora, tudo o que você precisa é de uma lógica que defina ansible_pkg_mgr para apt ou yum etc e que toda a lógica when desapareça.

Parece que o Ansible também está trabalhando para fazer o que você quer em um futuro módulo .

    
por 02.06.2015 / 19:53
5

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 ...

    
por 30.05.2015 / 18:45

Tags