Como instalar automaticamente as funções do Ansible Galaxy?

129

Todos os meus playbooks / papéis Ansible são verificados no meu repositório git.

No entanto, para as funções do Ansible Galaxy, eu sempre preciso baixá-las explicitamente, uma a uma, em todas as máquinas das quais quero executar o Ansible.

É até difícil saber com antecedência exatamente quais funções do Ansible Galaxy são necessárias até que o Ansible se queixe de um papel ausente no tempo de execução.

Como se deve gerenciar as dependências da função Ansible Galaxy? Eu gostaria que eles fossem verificados no meu repositório git junto com o restante do meu código ansible ou que fossem identificados e baixados automaticamente quando eu executasse o Ansible em uma nova máquina.

pdeva
fonte
galaxy.ansible.com/docs/using/index.html Aqui está tudo o que você precisa para usar o ansible-galaxy. É um documento bem feito! Mesmo se você é iniciante :)
Ayra
@pdeva Você poderia aceitar uma das respostas válidas abaixo?
GG.

Respostas:

148

Você deve usar um requirements.ymlarquivo para este caso de uso. Descreva as funções necessárias, usando qualquer um dos vários métodos de instalação:

# Install a role from the Ansible Galaxy
- src: dfarrell07.opendaylight

# Install a role from GitHub
- name: opendaylight
  src: https://github.com/dfarrell07/ansible-opendaylight

# Install a role from a specific git branch
- name: opendaylight
  src: https://github.com/dfarrell07/ansible-opendaylight
  version: origin/master

# Install a role at a specific tag from GitHub
- name: opendaylight
  src: https://github.com/dfarrell07/ansible-opendaylight
  version: 1.0.0

# Install a role at a specific commit from GitHub
- name: opendaylight
  src: https://github.com/dfarrell07/ansible-opendaylight
  version: <commit hash>

Em seguida, instale-os:

ansible-galaxy install -r requirements.yml

Aqui está um exemplo de trabalho (instalando o OpenDaylight usando o Ansible como um provisionador do Vagrant). Consulte os documentos Ansible relevantes para obter mais informações.

dfarrell07
fonte
Veja também a resposta de @Kieran Andrews abaixo. Expande este.
Marco Ferrari
1
Na verdade, isso não está instalando automaticamente as dependências de função de um manual, mas explicitamente instalando uma lista de dependências que foram listadas manualmente pelo humano que criou o manual.
Neil
53

Como sugerido, você pode usar a galáxia ansible para essa necessidade.

O Ansible possui um recurso no qual você pode criar um requirements.ymlarquivo que lista todas as suas funções. Você pode descobrir isso aqui: http://docs.ansible.com/ansible/latest/galaxy.html#installing-multiple-roles-from-a-file

Por exemplo (requirements.yml):

- src: yatesr.timezone

Em seguida, você executa ansible-galaxy install -r requirements.ymlesse arquivo para baixar todas as funções listadas lá.

Se você deseja automatizá-lo ainda mais, é possível criar um script de shell simples que executará os dois comandos.

Por exemplo (ansible.sh):

./ansible.sh

ansible-galaxy install -r requirements.yml
ansible-playbook playbook.yml -i inventory 
Kieran Andrews
fonte
1
Apenas testado, exibe uma mensagem de que as funções já foram baixadas, sem erros. Versão2.2.1
Igonato
Se o manual usar as funções da galáxia que você está instalando, elas não serão executadas na primeira vez que o manual for chamado, pois sua presença é verificada antes do download. Chamar o manual pela segunda vez selecionará as funções recém-instaladas.
Ben
Atualizei como agora o faço, com um script de wrapper para reduzir comandos.
Kieran Andrews
19

Costumo me encontrar instalando um Java JDK. O uso de uma função facilita esse toque. Eu tentei de duas maneiras diferentes (incluindo muitos módulos .git e submódulo ... Eu tenho que usar vários sistemas git para trabalhar e tudo fica feio). Meu maior requisito é que eu não verifique o código da função no meu projeto do playbook, principalmente para manter tudo em um só lugar.

O conteúdo do meu arquivo 'requirements.yml':

- src: https://github.com/staylorx/ansible-role-wls-prep.git
  version: master
  name: staylorx.wls-prep

- src: https://my-work-git-extravaganza.com
  version: 2.x
  name: coolplace.niftyrole

#From Ansible Galaxy
- src: staylorx.oracle-jdk

Eu corro um manual separado, install-functions.yml:

---

- hosts: localhost

  tasks:
    - file:
        path:  roles
        state: absent

    - local_action:
        command ansible-galaxy install -r requirements.yml --roles-path roles

    - lineinfile:
        dest:   .gitignore
        regexp: '^\/roles$'
        line:   '/roles'
        state:  present

Eu executo esse primeiro manual, depois executo minhas funções em qualquer manual normalmente. Para mim, o segredo é garantir que seja ignorado pelo git, para não verificar os papéis por engano. Além disso, como sempre limpo a pasta, garanto que não preciso forçar ou ignorar erros.

staylorx
fonte
Ele falhará com 'função não encontrada' antes mesmo de executar o comando local.
Daniel Andrei Mincă
1
@ Daniel Danieli, você precisa usar o modo dinâmico, ex include_role. Verifique esta opção
user1686407
4

Outra solução é usar sub-módulos git. Afinal, o Ansible Galaxy é apenas um diretório de repositórios do github ...

Eu uso este comando para adicionar automaticamente qualquer função do Galaxy como um submódulo:

ansible-galaxy info <package> | grep -A 1 github_repo | tr '\n' ' ' | sed -e "s/.*github_repo: \([^[:space:]]*\)[^\w]*github_user: \([^[:space:]]*\)[[:space:]]*/git submodule add git:\/\/github.com\/\2\/\1.git roles\/\2.\1/g" | sh

Confirme as alterações no seu repositório git. Quando você clonar seu repositório no futuro, certifique-se de cloná-lo com submódulos, por exemplogit clone ... --recursive

Uma vantagem disso é que um submódulo git sempre faz referência a uma versão específica (git commit-hash). Isso impedirá que você execute atualizações não testadas em seu ambiente produtivo. Uma nova versão da função Galaxy pode ter erros ou funcionar completamente diferente do que antes. Com um submódulo git, você decide se e quando atualiza uma função para a nova versão.

Além disso, você não precisará cuidar adicionalmente das funções da galáxia na lista negra .gitignorepara evitar comprometer o código deles no seu repositório.

udondan
fonte
5
Esta é uma prática ruim na minha opinião. Geralmente, é mais simples usar as ferramentas de gerenciamento de dependências do que juntar repositórios SCM, especialmente quando estamos falando de submódulos git para SCM.
David Resnick
1
Acordado. Na verdade, não estou mais usando isso. Ainda assim, é uma abordagem válida, já que a galáxia ansible está longe de ser perfeita. O Galaxy não procurará atualizações, mesmo que uma versão seja colidida em seu arquivo de requisitos, se você forçá-lo a baixar novamente todas as funções com o --forcesinalizador não documentado, ele não mostrará se ou o que realmente mudou. É uma caixa preta que você só pode controlar se mantiver as funções de galáxia baixadas no SCM. Por outras razões, é uma boa ideia, de qualquer maneira. Ao puxar submódulos, você vê pelo menos quais funções foram alteradas.
udondan
Aliás, todos os problemas dos sub-módulos, o AFAIK, são desprezíveis nessa situação porque estão relacionados à modificação de seu conteúdo. Puxando está perfeitamente bem por minha experiência ..
udondan
4

Você pode usar uma função Ansible para instalar as funções necessárias usando o módulo de comando .

Aqui está um exemplo muito básico que é executado ansible-galaxy install:

- name: Install roles from Ansible Galaxy
  command: ansible-galaxy install {{ item.item }}
  with_items:
    - "{{ ansible_roles_list }}"

O ansible_roles_listpode ser fornecido como uma variável ou como um parâmetro de função.

Se você fizer isso em uma função, ela deverá ser aplicada antes de outras funções que você deseja instalar usando-a, em um manual separado. Isso ocorre porque o Ansible verifica se todas as funções estão disponíveis antes de executar o manual em que você as referencia.

Marco Ferrari
fonte
egg and chicken :)
bazeusz
2

Até o momento, até onde eu sei, não há uma maneira automática de baixar funções em tempo de execução. Sua melhor aposta é comprometê-los em seu próprio repositório ou ter uma documentação adequada listando todos os requisitos. Você pode até criar um manual de instruções antes do voo que instale suas funções. :)

Mxx
fonte
3
Você pode usar um arquivo requirements.txt para isso. Veja: docs.ansible.com/…
toast38coza
0

Aqui, meus requisitos estão na função e são usados ​​no install.yml

main.yml

 # tasks file for MY_ROLE
- name: Install requirements
  local_action: command ansible-galaxy install -r {{ role_path }}/requirements.yml -p /etc/ansible/roles

- include_tasks: install.yml 
.  
├── playbook.yml  
├── inventory  
├── roles  
│    └── My_Role   
│        ├── tasks  
│        │   └── main.yml  
│        │   └── install.yml  
│        └── requirements.yml
TJVerne
fonte