É possível alterar a senha do usuário atual dentro da banda com ansible?

4

Eu tenho uma distribuição Linux recém-instalada. Ele tem um usuário regular com uma senha padrão e uma conta root bloqueada (sem senha na raiz - não pode ser SSH como diretamente). Eu quero ser capaz de executar um playbook ansible para configurar este servidor e bloquear essa conta padrão, alterando sua senha, sem fazer extra out-of-band etapas.

A maior parte da configuração que o meu manual faz precisa ser root, por isso ele é configurado para ssh como o usuário padrão, tornar-se root e executar todos os comandos. Isso funciona bem. O problema está mudando as senhas.

Se eu tentar alterar ansiosamente a senha do usuário usando o módulo de usuário, ele será bem-sucedido, mas todas as tarefas depois disso falharão. Mesmo se eu fizer a alteração como o último passo no meu manual, todos os manipuladores que devem ser executados no final falharão.

Há duas sugestões que encontrei on-line para perguntas semelhantes:

  • Use as chaves RSA
  • Use uma reprodução inicial para testar de alguma forma e altere a senha

O uso de chaves RSA exige que você configure o RSA com antecedência e, portanto, não está dentro da banda.

Eu tenho tentado usar um jogo inicial para fazer isso de alguma forma, mas até agora, no segundo, a jogada inicial falha ao fazer o login com a senha padrão, ansible sai com um erro e ignora outras tarefas, e a próxima jogada .

Existe também uma maneira de fazer isso usando ssh-pass, como demonstrado aqui , que deve funcionar, mas isso parece mais um truque, e o ssh-pass nem sempre está facilmente disponível, como em máquinas MacOS rodando ansible.

Um tópico semelhante foi discutido aqui há mais de uma década, mas parece que Dave contornou isso configurando o Linux para exibir uma mensagem "Account Disabled" quando você tenta fazer o login como usuário padrão e mudando o usuário, o que também parece funcionar, mas é diferente de simplesmente alterar a senha do usuário padrão.

Existe alguma coisa que pode ser feita por ansible para alterar a senha do usuário que está executando como, sem desconectar?

    
por Tal 23.04.2018 / 18:16

2 respostas

2

Is there a way to make Ansible try the default password, and keep running the playbook if that fails?

Aqui está um exemplo, não corresponde exatamente ao que você mencionou, mas pode ser um ponto de partida.

---
# SYNOPSIS
# try authentication using keys, if that fails, fall back to default credentials

- import_playbook: ../bootstrap.yml

- hosts: linux_systems
  gather_facts: no
  become: yes
  any_errors_fatal: true
  vars: 
    ansible_user_first_run: vagrant
    ansible_pass_first_run: vagrant
  tasks:

  - block:
    - name: Check if connection is possible using keys
      command: ssh -F {{project_dir}}/.ssh/ansible_ssh_config -o User={{ ansible_user }} -o ConnectTimeout=10 -o PreferredAuthentications=publickey -o PubkeyAuthentication=yes {{ ansible_host }} /bin/true
      register: result
      connection: local
      ignore_errors: yes
      changed_when: False

    - name: If using user_first_run
      connection: local
      set_fact:
        using_first_run: true
      when: result is failed

    - name: If no connection, change ansible_user
      connection: local
      set_fact:
        ansible_user: "{{ ansible_user_first_run }}"
      when: result is failed

    - name: If no connection, change ansible_ssh_pass
      connection: local
      set_fact:
        ansible_ssh_pass: "{{ ansible_pass_first_run }}"
      when: result is failed

    - name: If no connection, change ansible_become_pass
      connection: local
      set_fact:
        ansible_become_pass: "{{ ansible_pass_first_run }}"
      when: result is failed

    # since any_errors_fatal this should fail the play
    # if we still cannot reach all hosts.
    - name: Check if connection is possible
      raw: /bin/true
      changed_when: False

    tags:
    - always

  - name: Perform a ansible ping
    ping: {}
    
por 23.04.2018 / 22:04
0

Uau - eu sou burro. Eu não posso acreditar o quão simples a solução acabou sendo.

Meu manual é parecido com isto agora:

---
- hosts: RaspberryPis
  become: True
  become_user: root

  tasks:
    - name: Do stuff
      notify:
        - restart some service

  handlers:
    - name: restart some service
      systemd:
        name: some_service
        state: restarted

- hosts: RaspberryPis
  become: True
  become_user: root

  tasks:

    - name: Set pi password
      user:
        name: pi
        password: "{{ 'test'|password_hash('sha512', 'mysalt') }}"

Eu corro com ansible-playbook --ask-pass . A primeira corrida, eu dou a senha padrão. Na próxima corrida, dou a nova senha. Basicamente, é sempre a senha que o dispositivo tem atualmente.

É claro que, por razões de segurança, você deseja que a nova senha seja uma variável proveniente de um cofre ansible, ou algo assim, mas essa é a ideia, e parece funcionar.

Tê-lo em uma jogada separada no final garante que os manipuladores da sua jogada principal sejam executados antes que a senha seja alterada. Desta forma, alterar a senha do usuário é realmente o último passo.

Eu não acredito que nunca pensei nisso antes.

Isso é tão simples quanto eu poderia fazer isso. Existe uma maneira de fazer Ansible tentar a senha padrão, e continuar executando o playbook se isso falhar? Dessa forma, eu poderia ter tanto o padrão quanto a nova senha no meu cofre, e só precisaria fornecer a senha do vault - não a senha do usuário atual e a senha do vault?

    
por 23.04.2018 / 19:29