Manual sem caminho relativo aos vars


8

Eu já tinha um monte de playbooks, então comecei a organizá-los no diretório de playbooks . Isso causa que deve haver caminhos relativos aos arquivos vars.

Manual real:

---
- hosts:  aws_instance.jenkins-agents
  user:   ec2-user
  vars_files:
    - ../../../vars/main.yaml
    - ../../../vars/vault.yaml
  ...

Existe alguma maneira de manter a estrutura de diretórios, mas evite a família de loceness ( ../../../)?

Conheço as funções Você pode especificar o caminho para elas, mas não encontrei nada semelhante para vars_files

Condições do projeto:

  1. Precisamos executar os playbooks a partir da raiz do projeto
  2. Os diretórios vars e playbooks estão na raiz do projeto
  3. Este projeto não possui inventário / hosts estáticos, mas é gerado rapidamente quando você executa algum manual

11
Talvez você possa usar uma variável para sua parte relativa ../../../vars?
Tensibai

Respostas:


6

Você notará que as recomendações oficiais para o layout do diretório colocam todos os manuais no nível raiz. Isso é intencional, pois o Ansible não lida bem com outros esquemas.

Você pode colocar playbooks em um subdiretório, como você começou a fazer, mas isso exigirá (como você já encontrou) o uso de caminhos relativos dos playbooks para quaisquer outros recursos que eles usarem; O Ansible usa o caminho do playbook para iniciar sua pesquisa, é assim que está escrito. Na maioria das vezes, é exatamente com isso que você lida quando decide mudar para onde os playbooks vivem.

No entanto, você parece ter mais aninhamento do que deveria:

---
- hosts:  aws_instance.jenkins-agents
  user:   ec2-user
  vars_files:
    - ../../../vars/main.yaml
    - ../../../vars/vault.yaml
  ...

Por que você está navegando em três diretórios? Eu esperaria um layout que seja como o oficial, mas com uma subpasta para playbooks; então você acabaria com apenas

---
- hosts:  aws_instance.jenkins-agents
  user:   ec2-user
  vars_files:
    - ../vars/main.yaml
    - ../vars/vault.yaml
  ...

o que é uma mudança muito mais pequena.


Em segundo lugar, é muito raro que você realmente queira usar vars_files. A maioria das variáveis ​​usadas no Ansible varia de acordo com o host (e, portanto, deve estar na group_vars/ host_varsna raiz do projeto) ou é específica da função (e, portanto, deve estar no vars/ defaultsno diretório da função). Alguns links de documentação:

Pessoalmente, acho que é melhor ter o mínimo possível em suas cartilhas, mas delegar tudo para as funções. Aqui está um exemplo de manual completo em sua configuração:

- hosts: aws_instance.jenkins-agents
  roles:
    - ../roles/jenkins_agent

Isso oferece muito mais flexibilidade para reutilização.

E se você não desejar usar caminhos relativos para funções, poderá substituí roles_path-lo ansible.cfgno diretório raiz de onde executa os comandos Ansible.


2

Como ainda não posso comentar a resposta de 030 (acabei de abrir uma conta), responderei aqui.

Os diretórios vars do grupo são relativos ao caminho Ansible.

Você não precisa executar o Ansible em / etc / ansible. Você pode executá-lo em ~ / .hidden / directory / stuff, se desejar. Apenas certifique-se de manter uma estrutura de diretórios. Ou seja:

/pipeline/   # ansible playbooks are here
/pipeline/roles
/pipeline/group_vars

Então você pode executar algo como

cd /pipeline
ansible-playbook deploy_app.yml

O qual lerá os vars do grupo na pasta pipeline / group_vars. É melhor fazer o cd para sua pasta raiz ansible primeiro, pois ela procura caminhos da pasta atual em que você está, se ela não puder encontrá-los no local padrão (/ etc / ansible), para que você possa colocar seu ansible.cfg em / pipeline sem precisar especificar outros argumentos de linha de comando. Você também pode definir opcionalmente caminhos específicos dentro do ansible.cfg.

Você pode dar um passo adiante e configurar vars de grupo separados para cada ambiente / local / etc:

/pipeline/prod/group_vars/all.yml
/pipeline/dev/group_vars/all.yml

E execute da seguinte maneira usando include-vars.

ansible-playbook deploy_app.yml -i prod


Eu recomendaria classificar as variáveis ​​por grupos, a única coisa é que, se você colocar seus inventários em um subdiretório, deverá colocar um link simbólico para group_vars e hosts_vars no subdiretório de inventários.
Jiri Klouda

1

Para evitar esses problemas, é por isso que existem Anfitriões e Grupos .

/etc/ansible/group_vars/raleigh # can optionally end in '.yml', '.yaml', or '.json'
/etc/ansible/group_vars/webservers
/etc/ansible/host_vars/foosball

Isso não responde à minha pergunta, mas é interessante ter os valores digamos por grupo. As variáveis ​​que temos estão relacionadas principalmente a grupos específicos. Apenas a /etcvariante não funcionaria para nós. Espero que seja capaz de buscá-las no projeto.
Mailo Světel

Ele não precisa residir na pasta etc. Se os hosts e grupos vars diretórios estão localizados no diretório ansible em seguida, ele irá trabalhar
030
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.