Eu tenho uma tarefa ansible que cria um novo usuário no ubuntu 12.04;
- name: Add deployment user
action: user name=deployer password=mypassword
ele é concluído conforme o esperado, mas quando eu entro como esse usuário e tento usar o sudo com a senha, eu a defino sempre diz que está incorreta. O que estou fazendo de errado?
password
não deve estar em texto simples, mas sim pré-hash.Respostas:
Se você ler o manual do
user
módulo do Ansible , ele o direcionará para o repositório github de exemplos do Ansible para obter detalhes sobre como usar opassword
parâmetro .Lá você verá que sua senha deve ter um hash.
Se seu playbook ou linha de comando ansible tiver sua senha no estado em que se encontra em texto simples, isso significa que o hash de sua senha registrado no arquivo shadow está errado. Isso significa que quando você tenta autenticar com sua senha, seu hash nunca coincidirá.
Além disso, consulte as Perguntas frequentes do Ansible sobre algumas nuances do parâmetro de senha e como usá-lo corretamente.
fonte
openssl passwd -salt <salt> -1 <plaintext>
para gerar o hash de senha, em vez do Python one-liner que você tem acima. Tive alguns problemas para obter a saída correta do Python, provavelmente devido à minha própria incompetência e o comando openssl funcionou melhor./etc/shadow
depois de definir a senha manualmente usandopasswd <user>
.Posso ser tarde demais para responder, mas recentemente descobri que os filtros jinja2 têm a capacidade de lidar com a geração de senhas criptografadas. No meu
main.yml
, estou gerando a senha criptografada como:"uusername" e "upassword" são passados
--extra-vars
para o manual e observe que usei o filtro jinja2 aqui para criptografar a senha passada.Eu adicionei o tutorial abaixo relacionado a isso no meu blog
fonte
password={{upassword|password_hash('sha512', upassword_salt)}}
. Isso permite que você coloque salt em um cofre de variáveis , como você provavelmente faria comupassword
também, mantendo ambos fora de tasks.yml.update_password: on_create
o módulo de usuário a esta resposta para evitar que as senhas expirem para usuários já criados.pip install passlib
. Então, para ser capaz de usar um vault cifrado corda em linha eu tive que reformatar com o seguinte aditamento:password: {{ upassword | string | password_hash('sha512') }}
. Isso evita a mensagem de errosecret must be unicode or bytes, not ansible.parsing.yaml.objects.AnsibleVaultEncryptedUnicode
Quero propor mais uma solução:
Por que é melhor? Como já foi observado aqui, as jogadas de Ansible devem ser idempotentes. Você deve pensar neles não como uma sequência de ações em estilo imperativo, mas como um estado desejado, estilo declarativo. Como resultado, você deve ser capaz de executá-lo várias vezes e obter o mesmo resultado, o mesmo estado do servidor.
Tudo isso parece ótimo, mas existem algumas nuances. Um deles é o gerenciamento de usuários. "Estado desejado" significa que toda vez que você executar uma jogada que crie um usuário, ele será atualizado para corresponder exatamente a esse estado. Por "atualizado" quero dizer que sua senha também será alterada. Mas provavelmente não é o que você precisa. Normalmente, você precisa criar um usuário, definir e expirar sua senha apenas uma vez, outras execuções de jogo não devem atualizar sua senha.
Felizmente, o Ansible possui um
update_password
atributo nouser
módulo que resolve esse problema. Misturando isso com variáveis registradas, você também pode expirar sua senha somente quando o usuário estiver realmente atualizado.Observe que se você alterar o shell do usuário manualmente (suponha que você não goste do shell que o administrador malvado forçou em seu jogo), o usuário será atualizado, portanto, sua senha expirará.
Observe também como você pode usar facilmente senhas iniciais em texto simples em jogos. Não há necessidade de codificá-los em outro lugar e colar hashes, você pode usar o filtro Jinja2 para isso. No entanto, isso pode ser uma falha de segurança se alguém fizer o login antes de você.
fonte
"{{ '{{vaulted_password}}' | password_hash('sha512') }}"
não parece funcionar ...{{ vaulted_password | password_hash('sha512') }}
, ondevaulted_password
está a chave para o valor no cofre?update_password: on_create
não parece trabalho (há um bug aberto sobre isso a partir de 2017), então as senhas vai mudar qualquer vez que há uma mudança de estado de um usuário.O módulo 'usuário' do Ansible gerencia os usuários de forma idempotente . No manual abaixo, a primeira tarefa declara state = present para o usuário. Observe que ' registrar: novo usuário' na primeira ação ajuda a segunda ação a determinar se o usuário é novo (newuser.changed == True) ou existente (
newuser.changed==False
), para gerar a senha apenas uma vez.O manual do Ansible contém:
fonte
tente assim
fonte
O objetivo da função nesta resposta é gerar uma senha aleatória para new_user_name e expirar a senha imediatamente. O new_user_name é necessário para alterar a senha em seu primeiro logon.
create_user.yml:
roles / create_user / tasks / main.yml:
Quando você deseja criar um novo usuário:
fonte
Esta é a maneira mais fácil:
fonte
É assim que funcionou para mim
fonte
Apenas para completar, postarei o comando ad-hoc usando ansible, pois também há um problema.
Primeiro, tente gerar uma senha criptografada usando o utilitário mkpasswd que está disponível na maioria dos sistemas Linux:
Em seguida, tente o comando ansible ad-hock:
Mas certifique-se:
--sudo
ou obtém um erro como (useradd: cannot lock /etc/passwd; try again later
)fonte
A definição da tarefa para o módulo de usuário deve ser diferente na versão mais recente do Ansible.
fonte
Combinando algumas soluções acima, criei um manual que gera hashes de senha corretos automaticamente com base em senhas de texto simples armazenadas em um arquivo de cofre ansible local criptografado:
Execute este comando usando a opção "--ask-vault-pass" para descriptografar o arquivo do vault (consulte ansible-vault para obter informações sobre como gerenciar um vault criptografado).
fonte
Como criar uma senha criptografada para passar para
password
auser
tarefa var para Ansible (do comentário de @Brendan Wood):O resultado será semelhante a:
Exemplo de
user
tarefa:UPD: crypt using SHA-512 veja aqui e aqui :
Pitão
Perl
Rubi
fonte
Você pode usar o ansible-vault para usar chaves secretas em manuais. Defina sua senha em yml.
ex. passar: segredo ou
criptografe seu arquivo de segredos com:
ansible-vault encrypt /path/to/credential.yml
ansible pedirá uma senha para criptografá-lo. (vou explicar como usar esse passe)
E então você pode usar suas variáveis onde quiser. Ninguém pode lê-los sem a chave do cofre.
Uso da chave do Vault:
passando o argumento ao executar o manual.
ou você pode salvar em um arquivo como password.txt e se esconder em algum lugar. (útil para usuários de CI)
No seu caso: inclua vars yml e use suas variáveis.
fonte
password={{user.pass}}
irá expandir para incluir a senha real, enquanto o ansible espera o hash lá.Gerando senha aleatória para o usuário
primeiro precisa definir a variável de usuários e seguir abaixo
tarefas:
fonte
A resposta de Mxx está correta, mas você o
crypt.crypt()
método python não é seguro quando diferentes sistemas operacionais estão envolvidos (relacionado ao algoritmo glibc hash usado em seu sistema).Por exemplo, não funcionará se você gerar seu hash a partir do MacOS e executar um manual no Linux. Nesse caso, você pode usar passlib (
pip install passlib
para instalar localmente).fonte
Nenhuma das soluções funcionou diretamente no meu Mac controlando o Ubuntu. Portanto, para o bem dos outros, combinando as respostas Mxx e JoelB, aqui está a solução Python 3 atual:
O resultado será
$1$SomeSalt$UqddPX3r4kH3UL5jq5/ZI.
, como na resposta de Mxx '.Melhor ainda , use SHA512 em vez de MD5:
Resultado:
fonte
Eu criei um ansible-playbook que permite criar uma conta Linux que permite autenticação por senha.
Consulte CreateLinuxAccountWithAnsible .
A senha com hash é gerada usando o
mkpasswd
comando. Eu forneci maneiras de instalarmkpasswd
em diferentes sistemas operacionais.Aqui estão as etapas necessárias para usar meu script:
Substitua
<your_user_name>
e<your_password>
dentrorun.sh
com seu nome de usuário e senha desejados.Altere as informações de conexão
inventory
para que o ansible possa se conectar à máquina para criar um usuário.Execute
./run.sh
para executar o script.fonte
Se desejar fazer isso como um comando ad-hoc Ansible, você pode fazer o seguinte:
Resultado do comando acima:
fonte
Sei que estou atrasado para a festa, mas há outra solução que estou usando. Pode ser útil para distros que não possuem o
--stdin
binário passwd.Label in
loop_control
é responsável por imprimir apenas o nome de usuário. Todo o manual ou apenas as variáveis do usuário (você pode usarvars_files:
) devem ser criptografados com ansible-vault.fonte
Minha solução é usar lookup e gerar senha automaticamente.
fonte
Tentei muitos utilitários, incluindo mkpasswd, Python etc. Mas parece que há algum problema de compatibilidade com o Ansible na leitura de valores HASH gerados por outras ferramentas. Finalmente funcionou pelo próprio valor do ansible #.
ansible all -i localhost, -m debug -a "msg = {{'yourpasswd' | password_hash ('sha512', 'mysecretsalt')}}"
Livro de cantadas -
fonte
Bem, estou totalmente atrasado para a festa :) Eu precisava do ansible play que cria vários usuários locais com senhas aleatórias. Foi isso que eu inventei, usei alguns dos exemplos do início e os juntei com algumas mudanças.
create-user-with-password.yml
/roles/create-user-with-password/tasks/main.yml
fonte