Как настроить пользователя SSH по умолчанию для подключений Ansible

AnsibleAnsibleBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

Ansible – это мощный инструмент автоматизации, упрощающий управление удаленными серверами. Одним из важнейших аспектов Ansible является возможность установления безопасных SSH-соединений с этими серверами. В этом руководстве мы рассмотрим, как установить пользователя SSH по умолчанию для подключений Ansible, обеспечивая плавный и эффективный рабочий процесс для ваших задач управления серверами.

Это Guided Lab, который предоставляет пошаговые инструкции, чтобы помочь вам учиться и практиковаться. Внимательно следуйте инструкциям, чтобы выполнить каждый шаг и получить практический опыт. Исторические данные показывают, что это лабораторная работа уровня средний с процентом завершения 71%. Он получил 100% положительных отзывов от учащихся.

Установка и настройка Ansible

Прежде чем настраивать пользователя SSH для Ansible, необходимо убедиться, что Ansible правильно установлен и настроен в нашей системе.

Установка Ansible

Начнем с установки Ansible. Откройте терминал и выполните следующие команды:

sudo apt update
sudo apt install -y ansible

После завершения установки убедитесь, что Ansible установлен правильно, проверив его версию:

ansible --version

Вы должны увидеть вывод, аналогичный следующему:

ansible [core 2.12.x]
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/home/labex/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3/dist-packages/ansible
  ansible collection location = /home/labex/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/bin/ansible
  python version = 3.10.x (main, Ubuntu, x86_64)
  jinja version = 3.0.3
  libyaml = True

Создание рабочей директории Ansible

Далее давайте создадим структуру каталогов для нашего проекта Ansible. Это поможет нам организовать наши файлы:

mkdir -p ~/project/ansible/inventory
cd ~/project/ansible

Создание базового файла инвентаризации

Ansible использует файлы инвентаризации для определения хостов, которыми он управляет. Давайте создадим простой файл инвентаризации:

echo "[webservers]
localhost ansible_connection=local" > ~/project/ansible/inventory/hosts

Этот файл инвентаризации определяет группу под названием webservers только с одним хостом, localhost, и сообщает Ansible использовать локальное соединение, а не SSH, для этого хоста.

Теперь давайте проверим нашу инвентаризацию:

ansible -i inventory/hosts --list-hosts all

Вы должны увидеть вывод, подобный:

  hosts (1):
    localhost

Это показывает, что Ansible распознает нашу инвентаризацию и хосты, определенные в ней.

Понимание SSH-соединений и конфигурации Ansible

Ansible в основном использует SSH для подключения к удаленным хостам и выполнения команд. Давайте рассмотрим, как Ansible устанавливает SSH-соединения и как мы можем настроить пользователя SSH по умолчанию.

Как Ansible использует SSH

По умолчанию Ansible пытается использовать текущего пользователя вашей системы для установления SSH-соединений. Это означает, что если вы вошли в систему как пользователь labex и запускаете команду Ansible, Ansible попытается подключиться к удаленным хостам как пользователь labex.

Такое поведение по умолчанию не всегда может быть тем, что вам нужно. Например:

  • Удаленный сервер может требовать другого пользователя для доступа
  • Возможно, вы захотите использовать выделенного пользователя для задач автоматизации
  • Разные серверы могут требовать разных пользователей

Иерархия конфигурации Ansible

Ansible использует иерархию источников конфигурации, чтобы определить, какого пользователя SSH использовать:

  1. Параметры командной строки (наивысший приоритет)
  2. Параметры, специфичные для задач, в плейбуках
  3. Переменные хостов и групп в инвентаризации
  4. Файл конфигурации Ansible
  5. Значения по умолчанию (наименьший приоритет)

Давайте создадим базовый файл конфигурации Ansible, чтобы лучше это понять:

cat > ~/project/ansible/ansible.cfg << 'EOF'
[defaults]
inventory = ./inventory/hosts
host_key_checking = False
EOF

Этот файл конфигурации сообщает Ansible:

  • Использовать наш файл инвентаризации по умолчанию
  • Отключить проверку ключей хостов (полезно для тестирования в лабораторных средах)

Давайте рассмотрим файл, который мы только что создали:

cat ~/project/ansible/ansible.cfg

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

Тестирование базовой команды Ansible

Теперь давайте запустим базовую команду Ansible, чтобы увидеть текущего пользователя:

cd ~/project/ansible
ansible localhost -m command -a "whoami"

Вывод должен показать:

localhost | CHANGED | rc=0 >>
labex

Это подтверждает, что Ansible выполняет команды от имени текущего пользователя (labex).

Настройка пользователя SSH по умолчанию для Ansible

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

Метод 1: Использование файла конфигурации Ansible

Самый простой способ установить глобального пользователя SSH по умолчанию — через файл конфигурации Ansible. Давайте изменим наш файл ansible.cfg:

cat > ~/project/ansible/ansible.cfg << 'EOF'
[defaults]
inventory = ./inventory/hosts
host_key_checking = False
remote_user = ansible_user
EOF

В этой конфигурации мы добавили параметр remote_user, который сообщает Ansible использовать ansible_user в качестве пользователя SSH по умолчанию для всех соединений.

Метод 2: Настройка пользователя в файле инвентаризации

Другой подход — определить пользователя SSH в файле инвентаризации. Этот метод позволяет вам устанавливать разных пользователей для разных хостов или групп.

Давайте изменим наш файл инвентаризации:

cat > ~/project/ansible/inventory/hosts << 'EOF'
[webservers]
localhost ansible_connection=local

[dbservers]
db.example.com ansible_user=db_admin

[all:vars]
ansible_user=default_user
EOF

В этом примере:

  • Мы добавили новую группу под названием dbservers с хостом db.example.com и указали, что Ansible должен использовать пользователя db_admin при подключении к этому хосту.
  • Мы также добавили переменную группы ansible_user=default_user, которая применяется ко всем хостам, если она не переопределена.

Метод 3: Использование параметров командной строки

Вы также можете указать пользователя SSH непосредственно в командной строке при выполнении команд Ansible:

ansible localhost -m command -a "whoami" -u specific_user

Опция -u сообщает Ansible использовать specific_user для этой конкретной команды, переопределяя любого пользователя, определенного в файлах конфигурации или инвентаризации.

Метод 4: Настройка пользователя в плейбуках

При использовании плейбуков Ansible вы можете указать пользователя SSH на уровне play:

Давайте создадим простой плейбук, чтобы продемонстрировать это:

cat > ~/project/ansible/user_demo.yml << 'EOF'
---
- name: Demonstrate user configuration
  hosts: localhost
  remote_user: playbook_user
  
  tasks:
    - name: Show current user
      command: whoami
      register: current_user
      
    - name: Display current user
      debug:
        msg: "Current user is {{ current_user.stdout }}"
EOF

В этом плейбуке параметр remote_user устанавливает пользователя SSH в playbook_user для всех задач в этом play.

Приоритет пользователей в Ansible

Понимание приоритета этих различных методов важно:

  1. Параметры командной строки (флаг -u) имеют наивысший приоритет
  2. Настройки уровня задач в плейбуках
  3. Настройки уровня play в плейбуках
  4. Переменные хостов в инвентаризации
  5. Переменные групп в инвентаризации
  6. Настройки файла конфигурации (remote_user в ansible.cfg)
  7. Пользователь системы по умолчанию (наименьший приоритет)

Это означает, что более конкретные настройки пользователя переопределяют более общие.

Тестирование и проверка конфигурации пользователя SSH

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

Тестирование настройки файла конфигурации

Во-первых, давайте выполним простую команду Ansible, чтобы увидеть, применяются ли настройки нашего файла конфигурации:

cd ~/project/ansible
ansible localhost -m command -a "whoami"

Поскольку мы подключаемся к localhost с помощью ansible_connection=local, Ansible по-прежнему будет выполнять команды от имени текущего пользователя, независимо от настройки remote_user. Однако, если бы это было удаленное соединение, Ansible попытался бы использовать пользователя ansible_user, которого мы указали в конфигурации.

Использование ansible-inventory для проверки настроек пользователя

Ansible предоставляет команду ansible-inventory, которая позволяет нам увидеть, как Ansible интерпретирует нашу инвентаризацию, включая настройки пользователя SSH:

ansible-inventory --list

Эта команда выводит представление инвентаризации в формате JSON, показывая все переменные, связанные с каждым хостом, включая настройки пользователя SSH.

Тестирование настроек пользователя с помощью плейбука

Давайте запустим плейбук, который мы создали на предыдущем шаге:

ansible-playbook user_demo.yml

Вывод покажет что-то вроде:

PLAY [Demonstrate user configuration] ******************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Show current user] *******************************************************
changed: [localhost]

TASK [Display current user] ****************************************************
ok: [localhost] => {
    "msg": "Current user is labex"
}

PLAY RECAP *********************************************************************
localhost                  : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Вывод показывает, что команда по-прежнему выполняется от имени пользователя labex, что ожидаемо, потому что мы подключаемся к localhost с помощью ansible_connection=local.

Создание примера реальной конфигурации пользователя SSH

Давайте создадим более реалистичный пример, который демонстрирует, как настроить конфигурацию пользователя SSH для удаленных хостов. Мы создадим новый плейбук:

cat > ~/project/ansible/remote_user_example.yml << 'EOF'
---
- name: Example of remote user configuration
  hosts: all
  remote_user: admin_user
  
  tasks:
    - name: This task uses the play-level user (admin_user)
      debug:
        msg: "This would run as admin_user"
      
    - name: This task uses a specific user
      debug:
        msg: "This would run as operator_user"
      remote_user: operator_user
      
    - name: This task uses become to elevate privileges
      debug:
        msg: "This would run as the root user"
      become: true
      become_user: root
EOF

В этом плейбуке:

  • Мы устанавливаем remote_user: admin_user на уровне play, который применяется ко всем задачам по умолчанию
  • Вторая задача переопределяет это с помощью remote_user: operator_user
  • Третья задача использует become: true для повышения привилегий до пользователя root

Этот пример показывает различные уровни, на которых вы можете настроить пользователя SSH в Ansible.

Расширенная настройка пользователя SSH и устранение неполадок

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

Использование SSH-ключей с Ansible

При подключении к удаленным хостам рекомендуется использовать аутентификацию по SSH-ключам вместо паролей. Давайте посмотрим, как настроить аутентификацию по SSH-ключам в Ansible:

cat > ~/project/ansible/ssh_key_example.yml << 'EOF'
---
- name: Example using SSH key authentication
  hosts: all
  remote_user: secure_user
  vars:
    ansible_ssh_private_key_file: ~/.ssh/id_rsa
  
  tasks:
    - name: Show SSH connection details
      debug:
        msg: "Connecting as {{ ansible_user }} using key {{ ansible_ssh_private_key_file }}"
EOF

В этом примере:

  • Мы устанавливаем remote_user: secure_user в качестве пользователя SSH по умолчанию
  • Мы указываем файл закрытого ключа SSH для использования с помощью ansible_ssh_private_key_file

Настройка разных пользователей для разных сред

В реальных сценариях вам может потребоваться использовать разных пользователей SSH для разных сред (разработка, промежуточная среда, production). Давайте посмотрим, как этого добиться:

mkdir -p ~/project/ansible/group_vars

Теперь давайте создадим файлы переменных группы для разных сред:

cat > ~/project/ansible/group_vars/development << 'EOF'
---
ansible_user: dev_user
EOF

cat > ~/project/ansible/group_vars/production << 'EOF'
---
ansible_user: prod_user
ansible_ssh_private_key_file: ~/.ssh/prod_key
EOF

Обновите файл инвентаризации, чтобы включить эти группы сред:

cat > ~/project/ansible/inventory/hosts << 'EOF'
[webservers]
localhost ansible_connection=local

[development]
dev.example.com

[production]
prod1.example.com
prod2.example.com

[all:vars]
ansible_user=default_user
EOF

С этой конфигурацией:

  • Хосты в группе development будут использовать пользователя SSH dev_user
  • Хосты в группе production будут использовать пользователя SSH prod_user и определенный SSH-ключ
  • Все остальные хосты будут использовать пользователя SSH default_user

Устранение неполадок конфигурации пользователя SSH

Если у вас возникли проблемы с конфигурацией пользователя SSH в Ansible, вот несколько шагов по устранению неполадок:

1. Проверьте интерпретированную инвентаризацию Ansible

Чтобы увидеть, как Ansible интерпретирует вашу инвентаризацию, включая все значения переменных:

ansible-inventory --list

2. Запустите Ansible с подробным выводом

Запуск Ansible с повышенной детализацией может помочь выявить проблемы с подключением:

ansible localhost -m ping -vvv

Флаг -vvv увеличивает уровень детализации, отображая подробную информацию о процессе подключения SSH.

3. Проверьте подключение SSH вручную

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

ssh -i ~/.ssh/id_rsa username@hostname

4. Проверьте наличие ошибок подключения SSH

Общие ошибки подключения SSH включают:

  • Permission denied (publickey): Это указывает на проблему с аутентификацией по SSH-ключу
  • Host key verification failed: Это происходит, когда ключ хоста изменился
  • Connection refused: Это указывает на то, что служба SSH не запущена или заблокирована брандмауэром

5. Создайте плейбук для тестирования конфигурации Ansible

Давайте создадим простой плейбук для тестирования нашей конфигурации пользователя SSH:

cat > ~/project/ansible/test_ssh_config.yml << 'EOF'
---
- name: Test SSH user configuration
  hosts: all
  gather_facts: no
  
  tasks:
    - name: Display connection information
      debug:
        msg: |
          Connected to: {{ inventory_hostname }}
          User: {{ ansible_user | default('not set') }}
          SSH Key: {{ ansible_ssh_private_key_file | default('not set') }}
EOF

Запустите этот плейбук, чтобы увидеть информацию о подключении для каждого хоста:

ansible-playbook -i inventory/hosts test_ssh_config.yml

Этот плейбук покажет вам пользователя SSH и ключ, которые Ansible использует для каждого хоста, что может помочь выявить проблемы с конфигурацией.

Резюме

В этой лабораторной работе вы узнали, как настроить пользователя SSH по умолчанию для подключений Ansible, используя различные методы. Теперь вы понимаете, как:

  1. Установить и настроить Ansible с базовой конфигурацией
  2. Настроить пользователя SSH по умолчанию через файл конфигурации Ansible
  3. Настроить пользователей SSH на разных уровнях: инвентаризация, плейбук и командная строка
  4. Проверить и протестировать конфигурацию пользователя SSH
  5. Устранять распространенные проблемы с подключением SSH

Эти навыки позволят вам более эффективно управлять своей инфраструктурой с помощью Ansible, обеспечивая безопасные и надежные подключения к вашим удаленным серверам. Правильно настроив пользователя SSH для ваших подключений Ansible, вы сможете реализовать последовательные рабочие процессы автоматизации в различных средах, поддерживая при этом надлежащие методы обеспечения безопасности.