Quero propor mais uma solução:
- name: Create madhead user
user:
name: madhead
password: "{{ 'password' | password_hash('sha512') }}"
shell: /bin/zsh
update_password: on_create
register: madhead
- name: Force madhead to change password
shell: chage -d 0 madhead
when: madhead.changed
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 no user
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ê.
password
não deve estar em texto simples, mas sim pré-hash.