Створіть некористуючого користувача та відключіть кореневий SSH в Ansible


9

Я намагаюся написати ігрову книжку Ansible, щоб завантажувати свої сервери. За замовчуванням на Linode я можу входити лише як root із паролем, тому моя книга реєструється як корінь, створює некорінного користувача з ключем SSH та вимикає root та пароль SSH.

Це проблема, тому що я тепер не можу запустити цю програму знову, оскільки кореневий вхід вимкнено! Я хотів би, щоб ігрова книга була бездоменною і не повинна додавати та видаляти хости після завантаження.


1
Ви можете знайти тут щось натхнення .
Костянтин Суворов

Відповіді:


5

Мені подобається це робити так:

- hosts: all
  remote_user: root
  gather_facts: no
  tasks:
    - name: Check ansible user
      command: ssh -q -o BatchMode=yes -o ConnectTimeout=3 ansible@{{ inventory_hostname }} "echo OK"
      delegate_to: 127.0.0.1
      changed_when: false
      failed_when: false
      register: check_ansible_user
    - block:
      - name: Create Ansible user
        user:
          name: ansible
          comment: "Ansible user"
          password: $6$u3GdHI6FzXL01U9q$LENkJYHcA/NbnXAoJ1jzj.n3a7X6W35rj2TU1kSx4cDtgOEV9S6UboZ4BQ414UDjVvpaQhTt8sXVtkPvOuNt.0
          shell: /bin/bash
      - name: Add authorized key
        authorized_key:
          user: ansible
          key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
          exclusive: yes
      - name: Allow sudo for ansible
        copy:
          content: ansible ALL=(ALL) ALL
          dest: /etc/sudoers.d/ansible
          mode: 0600
      when: check_ansible_user | failed

Я намагаюся підключитися до віддаленого хоста зі своїм відповідальним користувачем. Якщо це неможливо (під час першого запуску), я підключаюсь як root та створюю відповідального користувача разом із його authorized_keysфайлом та sudoправами.

При наступних запусках підключення як відповідальний користувач працює, тому блок завдань можна пропустити.

Після завантаження віддаленого хоста я можу продовжувати роботу з відповідальним користувачем та become:

- hosts: all
  remote_user: ansible
  become: yes
  roles:
    - ...

Чи вручну ви змінюєте remote_userсвою книгу в програмі після цього першого запуску? Це не бездумно. Я сподіваюся, що мені чогось не вистачає.
Дефер

1
Ви робите, я нічого не змінюю вручну. Два зразки коду представляють дві різні п'єси (можливо, це допомагає уявити їх як названі bootstrap.ymlта site.yml, куди site.ymlвходить bootstrap.ymlраніше, ніж усе інше). Якщо перше завдання bootstrap.ymlпровалиться, всі інші завдання цієї п’єси пропускаються і site.ymlприймаються на себе.
Майкл Троянек

копіювати-вставити фрагмент коду, але анзібль скаче , що блок завдань: "skip_reason": "Conditional result was False". Запуск вистави -vvvпоказує, що ssh call повертається"msg": "non-zero return code", "rc": 255,
Рафа

Я виправив змінивши whenумову:when: not "OK" in check_ansible_user.stdout
Рафа,

2

Я б зробив наступне:

  • створіть роль (щось на кшталт "бази"), де ви (серед іншого) створіть відповідного користувача (та правила судо), щоб ansible використовував
  • створити або адаптувати свою роль для SSH, керувати sshd_config(я б радив рекомендувати вам керувати усім файлом, використовуючи a template, але це залежить від вас) та відключати кореневі входи
  • зробіть вашу роль SSH залежно від базової ролі, наприклад, використання мета.

Для першої ролі (базової) я схильний використовувати щось на кшталт:

 name: base | local ansible user | create user
  user:
    name: "{{ local_ansible_user }}"
    group: "{{ local_ansible_group }}"
    home: "/home/{{ local_ansible_user }}"
    state: present
    generate_ssh_key: "{{ local_ansible_generate_key }}"
    ssh_key_bits: 4096
    ssh_key_type: rsa
  tags:
    - ansible
    - local_user

- name: base | local ansible user | provision authorised keys
  authorized_key:
    user: "{{ local_ansible_user }}"
    state: present
    key: "{{ item }}"
  with_items: "{{ local_ansible_authorised_keys }}"
  tags:
    - ansible
    - authorised_keys

Для конфігурації SSH я би використовував:

- name: openssh | server | create configuration
  template:
    src: sshd_config.j2
    dest: /etc/ssh/sshd_config
    owner: root
    group: root
    mode: "0640"
    validate: "/usr/sbin/sshd -tf %s"
  notify:
    - openssh | server | restart
  tags:
    - ssh
    - openssh

Залежно ролі анзібль в документуються тут .

Ви також можете просто скористатися замовленням у вашій книзі, щоб зробити це.

У мене є декілька відповідей на github (з яких взято вище), якщо ви хочете бачити це в контексті


2

Якщо ви створюєте свої сервера на Linode з модулем Linode можна зареєструвати return valueв linodeзавданню і включає в себе завдання початкового завантаження з умовою перевірки на Outout завдання Linode. Це повинно бути безсильним. Спробуйте щось подібне:

- linode:
    api_key: 'longStringFromLinodeApi'
    name: linode-test1
    plan: 1
    datacenter: 2
    distribution: 99
    password: 'superSecureRootPassword'
    private_ip: yes
    ssh_pub_key: 'ssh-rsa qwerty'
    swap: 768
    wait: yes
    wait_timeout: 600
    state: present
  register: linode_node

- include: bootstrap.yml
  when: linode_node.changed

bootstrap.yml ніж міститиме всі завдання, необхідні для відключення входу в ssh root тощо.


-1

Можливо, ви могли просто змінити ansible_ssh_userв інвентарі після завантаження хоста?

[targets]

other1.example.com ansible_connection=ssh ansible_ssh_user=root # new host
other2.example.com ansible_connection=ssh ansible_ssh_user=user # bootstrapped host
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.