Permissions
強制 Ansible 註銷以刷新使用者組
我正在使用 Ansible 和 Docker 設置伺服器。我目前正在學習這兩種技術,所以如果我在這裡過於愚蠢,請多多包涵。
為了執行執行 Docker 命令,使用者必須在 docker 使用者組中。所以我這樣做:
- name: Ensure group "docker" exists become: yes group: name: docker state: present - name: Add ansible user to docker group become: yes user: name: "{{ansible_user}}" groups: docker append: yes
在後來的劇本(但同樣的劇本)中,我正在執行以下操作:
- name: build command: docker-compose build --pull args: chdir: /docker - name: start services command: docker-compose -f docker-compose.yml up -d args: chdir: /docker
這在第一次執行時永遠不會起作用。“建構”任務總是失敗,抱怨找不到 docker(這是由於缺少訪問權限)。如果我手動登錄,
{{ansible_user}}
我可以很好地執行 docker,並且如果我等待足夠長的時間(以便 Ansible 將打開一個新的 SSH 會話,我想),劇本也可以正常工作,這讓我相信{{ansible_user}}
沒有由於 Ansible 將 SSH 會話重新用於 playbook 中的所有任務,因此選擇了新組。所以我該怎麼做?我也試過
- name: build become: yes become_user: "{{ansible_user}}" become_method: su command: docker-compose build --pull args: chdir: /docker
這樣 ansible 將進入一個新會話,但這可能會失敗,因為我需要輸入密碼,而且我認為沒有辦法直接在任務中執行此操作。
關於如何以非hacky方式解決這個問題的任何想法?我不敢相信這是一個如此罕見的案例,以至於沒有標準的方法來解決這個問題。可能我只是忽略了一些東西。
我不確定它是否適合你,但我建議你嘗試添加一個 reset_connection。
- name: reset ssh connection meta: reset_connection
這裡有一個例子。
您可能希望將此添加為處理程序,並從您的使用者/組修改任務中通知它。然後還添加一個
meta: flush_handlers
,以便僅在需要時重置連接。
我使用了
meta: reset_connection
,但它對我不起作用。所以我使用
su -c
comamnd,我測試它是否有效:- name: perform docker login for ansible_ssh_user shell: | su -c ' docker login xxx:5000 -u xxxx -p xxxxx ' {{ ansible_ssh_user }} # become: yes # become_user: "{{ ansible_ssh_user }}" when: # if use ansible_connection=local, the var ansible_ssh_user will not defined - ansible_connection != 'local' - ansible_ssh_user is defined - ansible_ssh_user != 'root'