Подтвердить что ты не робот

Создание и использование группы без перезагрузки

У меня есть задача, которая создает группу.

- name: add user to docker group
  user: name=USERNAME groups=docker append=yes
  sudo: true

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

Я пробовал некоторые вещи вроде:

su -l USERNAME

или

newgrp docker; newgrp

Но ничего не получилось. Есть ли какие-либо изменения, чтобы заставить Ansible снова подключиться к хосту и сделать переключение? Последним вариантом будет перезагрузка.

4b9b3361

Ответ 1

Для Ansible 2 я создал роль Galaxy: https://galaxy.ansible.com/udondan/ssh-reconnect/

Использование:

- name: add user to docker group
  user: name=USERNAME groups=docker append=yes
  sudo: true
  notify:
    - Kill all ssh connections

Если вам сразу нужна новая группа, вы можете либо вызвать модуль самостоятельно:

- name: Kill own ssh connections
  ssh-reconnect: all=True

Или, наоборот, загорать обработчики при необходимости

- meta: flush_handlers

Для Ansible < 1.9 см. Этот ответ:

Используете ли вы ssh-контроллеры? Если вы активировали ControlMaster в вашей конфигурации ssh, это объясняет поведение. Ansible re-connects для каждой задачи, поэтому пользователь должен иметь правильную роль, назначенную для следующей задачи. Хотя, когда вы используете совместное использование ssh, Ansible, конечно же, повторно использует открытое ssh-соединение и, следовательно, приводит к невозможности входа в систему снова.

Вы можете деактивировать сеанс обмена в ansible.cfg:

[ssh_connection]
ssh_args= -S "none"

Поскольку сеансовое общение - это хорошая вещь, чтобы ускорить Безупречные игры, есть альтернатива. Запустите задачу, которая убивает все ssh-соединения для вашего текущего пользователя.

- name: add user to docker group
  user: name=USERNAME groups=docker append=yes
  sudo: true
  register: user_task

- name: Kill open ssh sessions
  shell: "ps -ef | grep sshd | grep `whoami` | awk '{print \"kill -9\", $2}' | sh"
  when: user_task | changed
  failed_when: false

Это заставит Ansible снова войти в систему при следующей задаче.

Ответ 2

Для Ansible версии 2.3 или новее используйте meta: reset_connection:

- user: name={{ansible_user}} groups=input
- name: reset ssh connection to allow user changes to affect 'current login user'
  meta: reset_connection

Ответ 3

Другим вариантом, который я нашел, было бы использовать async: для того, чтобы поставить в очередь на убийство sshd в фоновом режиме, не полагаясь на открытое соединение. Он кажется невероятно взломанным, но, похоже, он надежно работает как в Ansible 1.9, так и в 2.0.

- name: Kill SSH
  shell: sleep 1; pkill -u {{ ansible_ssh_user }} sshd
  async: 3
  poll: 2`

Пауза в течение 1 секунды, а затем kill sshd. Начните проверку завершения задания через 2 секунды, максимально допустимое время - 3 секунды. В моем ограниченном тестировании, похоже, проблема заключается в обновлении текущих групп пользователей с минимальной задержкой.