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

Переименуйте пользователя linux (и его домашнюю папку) с помощью Ansible

У меня есть пользователь Linux с различными папками и файлами в их доме:

User: foo
/home/foo/somefolder

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

User: bar
/home/bar/somefolder

Я бы сделал это вручную с

sudo usermod --login new_username old_username 

С последующим

sudo usermod --home /home/new_username --move-home new_username 

Могу ли я создать роль Ansible, чтобы делать это за меня?

В Ансибле пользовательский модуль Я могу найти:

home        Optionally set the user's home directory.
move_home   If set to yes when used with home=, attempt to move the user's old home directory to the specified directory if it isn't there already and the old home exists.

Звучит так, будто предполагается изменение, но как указать само переименование?

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

  1. Добавляет ключ ssh пользователю root (как старый пользователь)
  2. Изменяет sshd, чтобы root мог войти (как старый пользователь)
  3. Убивает все запущенные процессы пользователем (как root)
  4. Перемещает домашний каталог (как root)
  5. Переименовывает пользователя (как root)
  6. Восстанавливает старую конфигурацию sshd (как root)

Необходимо установить три переменные: одну для старого имени пользователя, одну для нового имени пользователя и одну для ключа ssh, который нужно добавить в root.

---
- name: "Rename user"
  hosts: all
  become: true
  gather_facts: no
  ignore_errors: true
  vars:
    ssh_key: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_ed25519.pub') }}"
    old_username: john
    new_username: johnny

  handlers:
    - name: restart sshd
      service:
        name: ssh
        state: restarted

  tasks:
    - name: Install ssh key for root access
      authorized_key:
        user: root
        key: "{{ ssh_key }}"
        state: present
      remote_user: "{{ old_username }}"

    - name: Make sure root can ssh in
      lineinfile:
        dest: /etc/ssh/sshd_config
        backup: yes
        regexp: "^PermitRootLogin"
        line: "PermitRootLogin prohibit-password"
        state: present
      remote_user: "{{ old_username }}"
      register: sshd_config
      notify: restart sshd

    - name: Kill processes by user
      shell: "pkill -u {{ old_username }}"
      remote_user: root
      ignore_errors: true

    - name: Move home directory
      user:
        name: "{{ old_username }}"
        home: "/home/{{ new_username }}"
        move_home: yes
      remote_user: root

    - name: Rename user
      command: "usermod --login {{ new_username }} {{ old_username }}"
      remote_user: root
      ignore_errors: true

    - name: Restore sshd config
      copy:
        remote_src: yes
        src: "{{ sshd_config.backup }}"
        dest: /etc/ssh/sshd_config
      remote_user: root
      notify: restart sshd