Назад | Перейти на главную страницу

Можно ли изменить пароль текущего пользователя внутри группы с помощью ansible?

У меня недавно установлен дистрибутив Linux. У него есть обычный пользователь с паролем по умолчанию и заблокированная учетная запись root (без пароля для root - нельзя использовать SSH напрямую). Я хочу иметь возможность запустить доступную playbook для настройки этого сервера и заблокировать эту учетную запись по умолчанию, изменив ее пароль, без дополнительных действий вне диапазона.

Для большинства настроек, которые выполняет моя книга, требуется root, поэтому он настроен на использование ssh в качестве пользователя по умолчанию, становится пользователем root и запускает все команды. Это нормально работает. Проблема в смене паролей.

Если я попытаюсь изменить пароль пользователя с помощью пользовательского модуля, он будет успешным, но все задачи после этого терпят неудачу. Даже если я сделаю изменение в качестве последнего шага в моей книге, все обработчики, которые должны запускаться в конце, выйдут из строя.

Есть 2 предложения, с которыми я столкнулся в Интернете по аналогичным вопросам:

Использование ключей RSA требует предварительной настройки RSA и, следовательно, не является внутриполосным.

Я пытался использовать начальную игру, чтобы как-то это сделать, но до сих пор во второй начальной игре не удается войти в систему с паролем по умолчанию, доступный выход с ошибкой и игнорирует другие задачи и следующую игру.

Также есть способ сделать это с помощью ssh-pass, как показано. Вот, который должен работать, но это больше похоже на взлом, а ssh-pass не всегда легко доступен, как на машинах MacOS, на которых работает ansible.

Обсуждалась аналогичная тема Вот более десяти лет назад, но похоже, что Дейв обошел это, установив в Linux отображение сообщения «Учетная запись отключена» при попытке войти в систему как пользователь по умолчанию и вместо этого сменив пользователя, что тоже звучит так, как будто это должно работать, но отличается от простого изменения пароля пользователя по умолчанию.

Есть ли что-нибудь, что можно сделать с помощью ansible, чтобы изменить пароль пользователя, от имени которого он работает, без отключения?

Есть ли способ заставить Ansible попробовать пароль по умолчанию и продолжать запускать playbook, если это не удается?

Вот пример, он не совсем соответствует тому, что вы упомянули, но может быть отправной точкой.

---
# 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: {}

Вау - я тупой. Не могу поверить, насколько простым оказалось решение.

Моя книга сейчас выглядит примерно так:

---
- 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') }}"

Я управляю этим с ansible-playbook --ask-pass. При первом запуске я даю ему пароль по умолчанию. При следующем запуске я даю ему новый пароль. По сути, это всегда пароль, который есть у устройства.

Конечно, по соображениям безопасности вы хотите, чтобы новый пароль был переменной, поступающей из доступного хранилища или чего-то в этом роде, но это идея, и, похоже, она работает.

Наличие его в отдельной игре в конце гарантирует, что обработчики из вашей основной игры запустятся до того, как пароль будет изменен. Таким образом, изменение пароля пользователя действительно является последним шагом.

Не могу поверить, что никогда раньше не думал об этом.

Это настолько просто, насколько я мог это сделать. Есть ли способ заставить Ansible попробовать пароль по умолчанию и продолжать запускать playbook, если это не удается? Таким образом, я мог бы иметь в своем хранилище как пароль по умолчанию, так и новый пароль, и мне нужно было бы указать только пароль хранилища, а не текущий пароль пользователя и пароль хранилища?