Estou começando com ansible e o utilizarei, entre outros, para instalar pacotes em várias distribuições Linux.
Vejo nos documentos que os comandos yum
e apt
são separados - qual seria a maneira mais fácil de unificá-los e usar algo como isto:
- name: install the latest version of Apache
unified_install: name=httpd state=latest
ao invés de
- name: install the latest version of Apache on CentOS
yum: name=httpd state=latest
when: ansible_os_family == "RedHat"
- name: install the latest version of Apache on Debian
apt: pkg=httpd state=latest
when: ansible_os_family == "Debian"
Entendo que os dois gerenciadores de pacotes são diferentes, mas ainda têm um conjunto de usos básicos comuns. Outros orquestradores ( salt, por exemplo ) têm um único comando de instalação.
Respostas:
Atualização: A partir do Ansible 2.0, agora existe um módulo genérico e abstrato
package
Exemplos de uso:
Agora, quando o nome do pacote é o mesmo em diferentes famílias de sistemas operacionais, é tão simples quanto:
Quando o nome do pacote difere entre as famílias de SO, você pode manipulá-lo com arquivos de distribuição ou vars específicos da família de SO:
Em seguida, para cada sistema operacional com o qual você deve lidar de maneira diferente ... crie um arquivo vars:
EDIT:
Como Michael DeHaan (criador do Ansible) optou por não abstrair os módulos do gerenciador de pacotes, como o Chef faz,Se você ainda estiver usando uma versão mais antiga do Ansible (Ansible <2.0) , infelizmente precisará lidar com isso em todos os seus playbooks e funções. IMHO isso empurra um monte de trabalho repetitivo desnecessário para playbook e autores de papéis ... mas é do jeito que é atualmente. Observe que não estou dizendo que devemos tentar abstrair os gerenciadores de pacotes enquanto ainda tentamos oferecer suporte a todas as opções e comandos específicos, mas apenas temos uma maneira fácil de instalar um pacote que seja independente do gerenciador de pacotes. Também não estou dizendo que todos devemos entrar no Gerenciador de Pacotes Inteligentesbandwagon, mas que algum tipo de camada de abstração da instalação de pacotes em sua ferramenta de gerenciamento de configuração é muito útil para simplificar playbooks / livros de receitas entre plataformas. O projeto Smart parece interessante, mas é bastante ambicioso unificar o gerenciamento de pacotes em distribuições e plataformas sem muita adoção ainda ... será interessante ver se é bem-sucedido. O problema real é que os nomes dos pacotes às vezes tendem a ser diferentes nas distribuições, portanto ainda precisamos fazer declarações ou
when:
declarações de casos para lidar com as diferenças.A maneira como tenho lidado com isso é seguir essa
tasks
estrutura de diretórios em um manual ou função:E então tenho isso no meu
main.yml
:Isto em
foo.yml
(para o pacote 'foo'):Depois, para os diferentes gerenciadores de pacotes:
Apt:
Yum:
Homebrew:
Observe que isso é muito repetitivo e não SECO , e embora algumas coisas possam ser diferentes nas diferentes plataformas e tenham que ser tratadas, geralmente acho que isso é detalhado e pesado quando comparado ao Chef:
E sim, há o argumento de que alguns nomes de pacotes são diferentes nas distribuições. E, embora atualmente haja uma falta de dados facilmente acessíveis , arrisco-me a adivinhar que os nomes de pacotes mais populares são comuns em distribuições e podem ser instalados por meio de um módulo gerenciador de pacotes abstraído. Casos especiais precisariam ser tratados de qualquer maneira e já exigiriam trabalho extra para tornar as coisas menos secas . Em caso de dúvida, consulte pkgs.org .
fonte
Você pode abstrair os gerenciadores de pacotes por meio de fatos
Tudo o que você precisa é de uma lógica que se ajuste
ansible_pkg_mgr
aapt
ouyum
etc.A Ansible também está trabalhando para fazer o que você deseja em um módulo futuro .
fonte
ansible_pkg_mgr
se para qualquer empacotador que conhece. Não é necessário fazer nada. Eu uso esse construto específico em qualquer lugar.Do Ansible 2.0, existe o novo
Package
-modul.http://docs.ansible.com/ansible/package_module.html
Você pode usá-lo como sua proposta:
Você ainda precisa considerar diferenças de nome.
fonte
Confira a documentação da Ansible sobre importações condicionais .
Uma tarefa para garantir que o apache esteja em execução, mesmo que os nomes dos serviços sejam diferentes em cada sistema operacional.
fonte
Você não deseja fazer isso porque certos nomes de pacotes diferem entre as distribuições. Por exemplo, nas distros relacionadas ao RHEL, o popular pacote de servidores da web é chamado
httpd
, e nas distros relacionadas ao Debianapache2
. Da mesma forma, com uma enorme lista de outros sistemas e bibliotecas de suporte.Pode haver um conjunto de parâmetros básicos comuns, mas também há vários parâmetros mais avançados que são diferentes entre os gerenciadores de pacotes. E você não quer estar em uma situação ambígua em que, para alguns comandos, você use uma sintaxe e para outros comandos, use outra sintaxe.
fonte
salt
consegue unificar os dois gerenciadores de pacotes. De qualquer forma, vou recorrer a uma configuração dupla, então.