2014-10-31 5 views
31

그룹을 만드는 작업이 있습니다. 나는 새 그룹 권한을 가지고에 의존하는 명령을 실행해야 또 다른 작전에서다시 시작하지 않고 그룹 만들기 및 사용

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

. 불행하게도이 작업은 새로운 그룹이 로그 아웃하고 다시 로그인 한 후에 만로드되기 때문에 작동하지 않습니다.

su -l USERNAME

또는

newgrp docker; newgrp

그러나 아무것도 일 :

내가 좋아하는 몇 가지 물건을 시도했습니다. 호스트에 재접속을 요청하고 상대방을 강제로 변경하는 변경 사항이 있습니까? 재부팅이 마지막 옵션입니다.

+0

잘못된 설명이없는 한 그룹은'user'가 아닌'group' 모듈을 사용하여 만듭니다. – Mxx

+1

그는 아마도 "사용자를 그룹에 추가"라고 말하려고했습니다. docker를 설치하면 이미 그룹이 생성되었을 것입니다. (덧붙여 말하자면 똑같은이 문제에 직면하고있다.) – Gigablah

+0

정확히 이것이 내 문제이다. 그룹은 이미 존재합니다. – Mark

답변

12

이 Ansible이 들어 나는 갤럭시 역할을 만들어 : 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 

또는 필요한 경우 처리기를 발사하십시오.

당신은 ssh를 제어 소켓을 사용하십니까 : Ansible < 1.9에 대한 23,516,

이 대답을 참조? ssh config에서 ControlMaster이 활성화되어 있다면이 동작을 설명 할 수 있습니다. 모든 작업에 대해 Anecess는 다시 연결되므로 사용자는 다음 작업에 할당 된 올바른 역할을 가져야합니다. 비록 당신이 ssh 세션 공유를 사용할 때 Anabilities는 물론 열린 ssh 연결을 다시 사용하기 때문에 다시 로그인하지 않을 것입니다.

당신은 당신의 ansible.cfg에서 세션 공유를 비활성화 할 수 있습니다 : 세션 공유 이후

[ssh_connection] 
ssh_args= -S "none" 

가 Ansible가 재생 속도를 좋은 일, 대안은있다. 현재 사용자의 모든 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 

이렇게하면 다음 작업에서 다시 로그인 할 수 있습니다.

+0

거기에 config 파일에있는 것보다 플레이 북에 ssh 연결 옵션을 추가하는 방법이 있습니까? – codecowboy

+2

또한 ssh 세션을 강제 종료하면 재촉하는 것이 불가능할 수도 있습니다. – codecowboy

+0

알 수 없습니다. 비록 [This answer] (http://stackoverflow.com/a/33935139/2753241)에 따르면, Ansible 2에서이를 인벤토리에 정의 할 수 있습니다. 이는 변수를 정의하여 설정하는 것이 가능할 수도 있음을 나타냅니다 그 이름으로. – udondan

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 초 동안 일시 중지 한 다음 sshd을 삭제하십시오. 2 초 후에 완료 될 작업을 확인하기 시작합니다. 최대 허용 시간은 3 초입니다. 제한된 테스트에서 현재 사용자의 그룹을 최소한의 지연만으로 새로 고치는 문제를 해결하는 것으로 보입니다.

6

해당 버전 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 
+0

Vagrant + Ansible 사용 : 'ERROR! 연결을 재설정 할 수 없습니다 : connect socket (/home/hubro/.ansible/cp/276d6f8b70) : 해당 파일이나 디렉토리가 없습니다. ' 어떤 아이디어? – Hubro

0

시도, 그것은 내 옆에서 작동 (는 thinest 솔루션인지 모르겠다). 이상하게도 meta: reset_connection은 Ansible과 함께 작동하지 않습니다. 2.4

- name: reset ssh connection 
    local_action: 
    module: file 
    path: "~/.ansible/cp" 
    state: absent 
관련 문제