Como especifico uma senha do sudo para o Ansible de maneira não interativa?
Estou executando o manual do Ansible assim:
$ ansible-playbook playbook.yml -i inventory.ini \
--user=username --ask-sudo-pass
Mas eu quero executá-lo assim:
$ ansible-playbook playbook.yml -i inventory.ini \
--user=username` **--sudo-pass=12345**
Há algum jeito? Quero automatizar o máximo possível a implantação do meu projeto.
Respostas:
Você pode passar variáveis na linha de comando via
--extra-vars "name=value"
. A variável de senha do Sudo éansible_sudo_pass
. Portanto, seu comando seria semelhante a:Atualização 2017 : O Ansible 2.2.1.0 agora usa var
ansible_become_pass
. Qualquer um parece funcionar.fonte
history -c
após a execução do yml..bash_history
.Os documentos recomendam enfaticamente não definir a senha do sudo em texto sem formatação e usá-la
--ask-sudo-pass
na linha de comando ao executaransible-playbook
Atualização de 2016:
Ansible 2.0 (não 100% quando) marcado
--ask-sudo-pass
como obsoleto. Agora, os documentos recomendam o uso--ask-become-pass
, além de trocar o usosudo
pelos manuaisbecome
.fonte
Provavelmente, a melhor maneira de fazer isso - supondo que você não possa usar a solução NOPASSWD fornecida pela scottod é usar a solução de Mircea Vutcovici em combinação com o Ansible Vault .
Por exemplo, você pode ter um manual assim:
Aqui estamos incluindo um arquivo chamado
secret
que conterá nossa senha sudo.Usaremos o ansible-vault para criar uma versão criptografada deste arquivo:
Isso solicitará uma senha e abra seu editor padrão para editar o arquivo. Você pode colocar o seu
ansible_sudo_pass
aqui.por exemplo
secret
:Salve e saia, agora você tem um
secret
arquivo criptografado que o Ansible pode descriptografar quando você executa o seu manual. Nota: você pode editar o arquivo comansible-vault edit secret
(e inserir a senha usada ao criar o arquivo)A peça final do quebra-cabeça é fornecer ao Ansible um
--vault-password-file
que ele usará para descriptografar seusecret
arquivo.Crie um arquivo chamado
vault.txt
e coloque a senha que você usou ao criar seusecret
arquivo. A senha deve ser uma sequência armazenada como uma única linha no arquivo.Dos Documentos Ansible:
Por fim: agora você pode executar seu playbook com algo como
O acima está assumindo o seguinte layout de diretório:
Você pode ler mais sobre o Ansible Vault aqui: https://docs.ansible.com/playbooks_vault.html
fonte
ansible-vault create group_vars/all/ansible.yml
e adicioneansible_sudo_pass: yourpassword
lá. Não há necessidade de playbooks mudança ou inventáriofatal: [localhost]: FAILED! => {"changed": false, "failed": true, "module_stderr": "sudo: a password is required\n", "module_stdout": "", "msg": "MODULE FAILURE", "parsed": false}
Olhando para o código (
runner/__init__.py
), acho que você provavelmente pode configurá-lo no seu arquivo de inventário:Parece haver alguma provisão no
ansible.cfg
arquivo de configuração também, mas não implementada agora (constants.py
).fonte
host_vars
ougroup_vars
diretório e, em seguida, criptografar o arquivo usando ansible-vaultEu não acho que o ansible permitirá que você especifique uma senha nos sinalizadores como deseja. Pode haver algum lugar nas configurações que pode ser definido, mas isso tornaria o uso do ansible menos seguro em geral e não seria recomendado.
Uma coisa que você pode fazer é criar um usuário na máquina de destino e conceder a ele privilégios sudo sem senha para todos os comandos ou uma lista restrita de comandos.
Se você executar
sudo visudo
e digitar uma linha como a abaixo, o usuário 'privilegedUser' não precisará digitar uma senha quando executar algo comosudo service xxxx start
:fonte
A senha do sudo é armazenada como uma variável chamada
ansible_sudo_pass
. Você pode definir esta variável de algumas maneiras:Por host, no arquivo de hosts do seu inventário (
inventory/<inventoryname>/hosts
)Por grupo, no seu arquivo de grupos de inventário (
inventory/<inventoryname>/groups
)Por grupo, em vars de grupo (
group_vars/<groupname>/ansible.yml
)Por grupo, criptografado (
ansible-vault create group_vars/<groupname>/ansible.yml
)fonte
Você pode definir a senha para um grupo ou para todos os servidores de uma vez:
fonte
Eu estava arrancando meu cabelo com esse, agora encontrei uma solução que faz o que eu quero:
1 arquivo criptografado por host que contém a senha do sudo
/ etc / ansible / hosts:
então você cria para cada host um arquivo var criptografado da seguinte forma:
com conteúdo
como você organiza a senha do cofre (digite via --ask-vault-pass) ou por cfg é com você
com base nisso, suspeito que você pode criptografar todo o arquivo hosts ...
fonte
ansible-playback
. Eu tive que usar-e @vault/filename.ext
o cofre com minhaansible-playbook
ligação.Uma maneira mais inteligente de fazer isso é armazenar sua
sudo
senha em um cofre seguro, como LastPass ou KeePass, e depois passá-la para oansible-playbook
uso de,-e@
mas em vez de codificar o conteúdo em um arquivo real, você pode usar a construção-e@<(...)
para executar um comando em um sub-shell e redirecione sua saída (STDOUT) para um descritor de arquivo anônimo, alimentando efetivamente a senha para o-e@<(..)
.Exemplo
O acima está fazendo várias coisas, vamos dividir.
ansible-playbook -i /tmp/hosts pb.yml
- obviamente, executando um manual via ansible-playbook$(lpass show folder1/item1 --password)"
- executa a CLI LastPasslpass
e recupera a senha para usarecho "ansible_sudo_pass: ...password..."
- pega a string 'ansible_sudo_pass:' e a combina com a senha fornecida porlpass
-e@<(..)
- reúne o que foi dito acima e conecta o subshell de<(...)
como um descritor de arquivo paraansible-playbook
consumo.Outras melhorias
Se você preferir não digitar isso toda vez, pode simplesmente coisas assim. Primeiro, crie um alias
.bashrc
como você gosta:Agora você pode executar seu playbook assim:
Referências
fonte
--extra-vars @<(echo ansible_become_pass: $(op get item <item name> | jq --raw-output '.details.sections[0].fields[] | select(.t=="password").v'))
/dev/fd/63
a senha do descritor de arquivo temporário não será divulgada.Se você se sente confortável em manter senhas em arquivos de texto sem formatação, outra opção é usar um arquivo JSON com o parâmetro --extra-vars (certifique-se de excluir o arquivo do controle de origem):
O Ansible suporta esta opção desde a versão 1.3 .
fonte
você pode escrever a senha do sudo para o seu playbook no arquivo hosts assim:
fonte
O cofre Ansible foi sugerido algumas vezes aqui, mas eu prefiro o git-crypt para criptografar arquivos confidenciais nos meus playbooks. Se você estiver usando o git para manter seus playbooks ansíveis, é fácil. O problema que encontrei no cofre ansible é que, inevitavelmente, acabo encontrando cópias criptografadas do arquivo com o qual quero trabalhar e preciso descriptografá-lo antes de poder trabalhar.
git-crypt
oferece um melhor fluxo de trabalho IMO.Com isso, você pode colocar suas senhas em um var no seu playbook e marcá-lo como um arquivo criptografado da
.gitattributes
seguinte maneira:Seu manual será criptografado de forma transparente no Github. Então você só precisa instalar sua chave de criptografia no host usado para executar o ansible ou seguir as instruções na documentação para configurá-la
gpg
.Há boas perguntas e respostas sobre o encaminhamento de
gpg
chaves como asssh-agent
chaves SSH de encaminhamento aqui: /superuser/161973/how-can-i-forward-a-gpg-key-via-ssh-agent .fonte
Você pode usar o
sshpass
utilitário como abaixo,fonte
O uso do ansible 2.4.1.0 e o seguinte devem funcionar:
E basta executar o manual com este inventário como:
fonte
Meu truque para automatizar isso era usar uma variável de ambiente e acessá-la via
--extra-vars="ansible_become_pass='{{ lookup('env', 'ANSIBLE_BECOME_PASS') }}'"
.Exporte uma var env, mas evite o histórico do bash / shell (inclua um espaço ou outros métodos). Por exemplo:
Pesquise a var env ao passar a
ansible_become_pass
variável extra paraansible-playbook
, por exemplo:Boas respostas alternativas:
ansible_become_pass
. Isso é decente. No entanto, para as equipes paranóicas que precisam compartilhar senhas do cofre ansible e executar execuções ansible com contas individuais, elas podem usar a senha do cofre compartilhado para reverter a senha do sistema operacional (roubo de identidade). Indiscutivelmente, você precisa confiar em sua própria equipe?@
do @ slm gerada para o descritor de arquivo temporário e usando o prefixo para ler a variável ansible do descritor de arquivo . Evita pelo menos o histórico do bash. Não tenho certeza, mas espero que o eco do subshell não seja capturado e exposto no log de auditoria (por exemplo, auditd).fonte
Você pode usar o cofre ansible, que codificará sua senha no cofre criptografado. Depois disso, você pode usar a variável from vault nos playbooks.
Alguma documentação sobre o ansible vault:
http://docs.ansible.com/playbooks_vault.html
Estamos usando-o como cofre por ambiente. Para editar o vault, temos o comando como:
ansible-vault edit inventories/production/group_vars/all/vault
Se você quiser chamar a variável do vault, precisará usar o ansible-playbook com parâmetros como:
ansible-playbook -s --vault-password-file=~/.ansible_vault.password
Sim, estamos armazenando a senha do cofre no diretório local em texto simples, mas não é mais perigoso, como armazenar a senha raiz de todos os sistemas. A senha raiz está dentro do arquivo do Vault ou você pode tê-lo como um arquivo sudoers para o seu usuário / grupo.
Eu estou recomendando usar o arquivo sudoers no servidor. Aqui está um exemplo para o administrador do grupo:
%admin ALL=(ALL) NOPASSWD:ALL
fonte
Basta ligar para o seu manual com
--extra-vars "become_pass=Password"
torne-se_pass = ('ansible_become_password', 'ansible_become_pass')
fonte
Depois de cinco anos, vejo que esse ainda é um assunto muito relevante. Um tanto espelhando a resposta de leucos que eu acho melhor no meu caso, usando apenas ferramentas ansible (sem autenticação centralizada, tokens ou qualquer outra coisa). Isso pressupõe que você tenha o mesmo nome de usuário e a mesma chave pública em todos os servidores. Caso contrário, é claro que você precisará ser mais específico e adicionar as variáveis correspondentes ao lado dos hosts:
Adicionar:
Então:
Pelo menos desta forma, você não precisa escrever mais as variáveis que apontam para as senhas.
fonte
A solução acima de @ toast38coza funcionou para mim; apenas esse sudo: yes está obsoleto no Ansible agora. Use torne - se e torne - se_usuário .
fonte
nós também podemos usar o EXPECT BLOCK no ansible para gerar bash e personalizá-lo conforme suas necessidades
fonte
Muito simples e adicione apenas no arquivo variável:
Exemplo:
E adicione estes:
fonte
Apenas um adendo, para que ninguém mais passe pelo aborrecimento que fiz recentemente:
AFAIK, a melhor solução é uma das linhas gerais de toast38coza's acima. Se fizer sentido vincular seus arquivos de senha e seu manual estaticamente, siga o modelo dele com
vars_files
(ouinclude_vars
). Se você deseja mantê-los separados, é possível fornecer o conteúdo do cofre na linha de comando da seguinte maneira:Isso é óbvio em retrospecto, mas aqui estão as dicas:
Aquele maldito sinal @ . Se você deixar de fora, a análise falhará silenciosamente e o ansible-playbook continuará como se você nunca tivesse especificado o arquivo em primeiro lugar.
Você deve importar explicitamente o conteúdo do cofre, com uma linha de comando --extra-vars / -e ou dentro do seu código YAML. O
--ask-vault-pass
sinalizador não faz nada por si só (além de solicitar um valor que pode ou não ser usado posteriormente).Você pode incluir seus "@" se economizar uma hora.
fonte
Isso funcionou para mim ... Arquivo criado /etc/sudoers.d/90-init-users arquivo com NOPASSWD
onde "usuário" é o seu ID do usuário.
fonte