Большинство серверов будут изначально развернуты с прямым доступом по SSH для root с ключом SSH или только с паролем, чтобы вы могли настроить сервер. Из-за проблем безопасности я хочу настроить нового пользователя с привилегиями sudo и отключить прямой доступ для root .

Я хочу создать Ansible Playbook, который может выполнить эту задачу для меня, однако я не знаю, можно ли установить ansible_user , ansible_become и т.д. В зависимости от условия типа «Можете ли вы ssh как root?». Можно ли даже позволить Ansible обнаружить это при запуске playbook?

1 ответ1

0

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

Однако, чтобы ответить на вопрос напрямую, вот решение, которое должно работать:

# Experiment to "fix" `ansible_user` depending upon host availability
- hosts: all
  gather_facts: false  # Otherwise initial connection will fail

  vars:
    - bootstrap_user: root

  tasks:
    - debug:
        msg: |
          ansible_user: {{ ansible_user | d('unset') }};
          remote_user: {{ remote_user | d('unset') }}

    - action: ping
      ignore_unreachable: true  # requires Ansible >= 2.7
      ignore_errors: yes
      register: pingtest

    # Works (mostly) for Ansible >= 2.2.
    # Might think this alone would work, but only if NOT *ALL* hosts failed up to
    # this point, which makes running the playbook on only a single host pointless.
    # Therefore, also set `ignore_unrechable` in `ping` above.
    # - https://github.com/ansible/ansible/issues/26362
    # - https://github.com/ansible/ansible/issues/19673
    # - https://github.com/ansible/ansible/issues/18075
    - meta: clear_host_errors

    - name: set ansible_user if no ping failed
      set_fact:
        ansible_user: "{{ bootstrap_user }}"
      when: pingtest.failed | d(pingtest.unreachable) | d(false)

    - debug:
        msg: "ansible_user: {{ ansible_user | d('unset') }}"

    # Connect as ansible_user from here on
    - name: Show remote user
      shell: "echo $USER"
      changed_when: false

В целом, следующие две ссылки помогут вам понять переменные (и приоритет, который важен здесь), а также восстановление после ошибок:

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .