Permissions

強制 Ansible 註銷以刷新使用者組

  • March 8, 2022

我正在使用 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 -ccomamnd,我測試它是否有效:


- 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'

引用自:https://serverfault.com/questions/930804