Como usar os arquivos existentes do Vault no Ansible Tower?

3

Eu quero importar inventários existentes que usei anteriormente com Ansible (autônomo), incluindo group_vars e arquivos do Vault no Ansible Tower (3.2.0).

No entanto, parece que não funciona quando os arquivos do Vault entram em ação. Depois de configurar a credencial do arquivo de senha do Vault e criar o inventário usando o tipo de origem "Originado de um projeto" - não consigo selecionar a credencial do Vault em "Detalhes da origem".

Quandoeuocolocomanualmenteesalvoafonte-asincronizaçãofalhacomoseguinteerro:

1.735INFOUpdatinginventory10:TEST1.753DEBUGUsingsysteminstallofansible-inventoryCLI:/usr/bin/ansible-inventory1.753INFOReadingAnsibleinventorysource:/var/lib/awx/projects/_6__ansible_master/inventories/test/hosts1.754DEBUGUsingprivatecredentialdatain'/tmp/awx_123_LXUj9p'.1.755DEBUGUsingfreshtemporarydirectory'/tmp/awx_proot_ZURWmR'forisolation.1.755DEBUGRunningfrom'/var/lib/awx/projects/_6__ansible_master/inventories/test'workingdirectory.Traceback(mostrecentcalllast):File"/usr/bin/awx-manage", line 9, in <module>
    load_entry_point('awx==3.2.0', 'console_scripts', 'awx-manage')()
  File "/lib/python2.7/site-packages/awx/__init__.py", line 107, in manage
  File "/var/lib/awx/venv/awx/lib/python2.7/site-packages/django/core/management/__init__.py", line 354, in execute_from_command_line
    utility.execute()
  File "/var/lib/awx/venv/awx/lib/python2.7/site-packages/django/core/management/__init__.py", line 346, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/var/lib/awx/venv/awx/lib/python2.7/site-packages/django/core/management/base.py", line 394, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/var/lib/awx/venv/awx/lib/python2.7/site-packages/django/core/management/base.py", line 445, in execute
    output = self.handle(*args, **options)
  File "/var/lib/awx/venv/awx/lib/python2.7/site-packages/django/core/management/base.py", line 661, in handle
    return self.handle_noargs(**options)
  File "/lib/python2.7/site-packages/awx/main/management/commands/inventory_import.py", line 1000, in handle_noargs
  File "/lib/python2.7/site-packages/awx/main/management/commands/inventory_import.py", line 243, in load_inventory_source
  File "/lib/python2.7/site-packages/awx/main/management/commands/inventory_import.py", line 179, in load
  File "/lib/python2.7/site-packages/awx/main/management/commands/inventory_import.py", line 163, in command_to_json
RuntimeError: ansible-inventory failed (rc=4) with stdout:

stderr:
ERROR! Attempting to decrypt but no vault secrets found

Eu também tentei criar um arquivo ansible_vault e apontar a variável "vault_password_file" para ele - mas isso também não funcionará (reclamando que não é possível encontrar o arquivo de senhas do vault).

Alguém já encontrou isso antes?

    
por Martial 13.10.2017 / 13:12

3 respostas

2

Parece que isso foi mais um problema de implementação. De acordo com o RedHat, não é recomendado manter os arquivos do vault com o inventário, pois isso significaria que ele descriptografa o arquivo toda vez que a sincronização de inventário é executada.

A maneira como resolvi isso agora é usar "vars_files" no playbook. Parece assim:

  # Secrets
  vars_files:
    - '../../secrets/{{ tower_env }}/vault.yml'

Na Torre, eu passo na variável tower_env, e. "dev" ou "qa", que então descriptografa o arquivo do vault correspondente quando um manual é executado - ao invés de sincronizar inventários.

    
por 27.10.2017 / 10:38
0

Há duas coisas que você está tentando fazer que não são (pelo menos neste momento) suportadas:

  • descriptografando seus segredos no momento da importação do inventário
  • usando ansible-vault para criptografar o arquivo inteiro, ao contrário das variáveis

A terminologia aqui é um pouco pobre, mas veja nestes documentos a seção "Single Encrypted Variable", às vezes eu chamo essas variáveis in-line.

link

O

Ansible agora suporta a movimentação dessas variáveis in-line através do processo de análise de inventário. Este formato também não é menos seguro, é o mesmo algoritmo sob o capô. O nome das variáveis criptografadas será exposto a pessoas com acesso ao seu controle de origem (o que provavelmente é razoável), mas seu valor será criptografado.

Agora, armazene valores com essa sintaxe em .yml arquivos variáveis em group_vars/ ou host_vars/ pastas. Você deve descobrir que a sincronização de inventário dentro do Tower é bem-sucedida (sem usar nenhuma credencial de cofre) e, quando você navega até o grupo ou host, você vê a forma criptografada da variável.

Quando você executar um livro de exercícios (modelo de trabalho em Torre), anexe uma credencial de cofre nesse momento. Isso atrasa a criptografia até o contexto de tempo de execução quando é realmente necessário.

Exemplo de estrutura de arquivo de inventário:

link

Além disso, como o outro comentário aponta, é possível colocar variáveis criptografadas ou criptografadas em linha inteira nessa estrutura de pastas no controle de origem, e isso será selecionado pelo Ansible e descriptografado pelo vault. credenciais que você anexa ao modelo de trabalho.

    
por 16.10.2018 / 17:43
0

ok - depois da investigação eu posso reconhecer que não há atualmente nenhuma maneira de fazer isso na versão 2.6.5 com o seguinte motivo:

  • é perfeitamente possível criptografar variáveis onde quer que você queira em host_vars ou group_vars
  • a frase secreta do cofre é tomada apenas pelas maneiras:

- vault-password-file parameter

- ask-vault-pass que foi substituído por --vault-id=@prompt

de acordo com o código declarado aqui da linha 220

O que precisaríamos é de outra possibilidade para fornecer a frase secreta do cofre, por exemplo por uma variável de grupo, o que atualmente não é possível.

E isso significa que o Relatório de erros no Github não foi resolvido / substituído por outra coisa. IMHO ainda é descoberto por todos os outros segmentos. Eu continuarei neste tópico de bug do github.

    
por 17.10.2018 / 00:27