强制 Ansible 注销以刷新用户组

Mad*_*key 10 permissions ansible docker docker-compose ansible-playbook

我正在使用 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
Run Code Online (Sandbox Code Playgroud)

在后来的剧本(但相同的剧本)中,我将执行以下操作:

-   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
Run Code Online (Sandbox Code Playgroud)

这在第一次运行时永远不起作用。“构建”任务总是失败,抱怨它找不到 docker(这是由于缺少访问权限)。如果我手动登录,因为{{ansible_user}}我可以很好地运行 docker,并且如果我等待足够长的时间(以便 Ansible 将打开一个新的 SSH 会话,我认为)剧本也可以正常工作,这让我相信{{ansible_user}}没有由于 Ansible 将 SSH 会话重新用于剧本中的所有任务,因此选择了新组。

所以我该怎么做?我也试过

-   name: build
    become: yes
    become_user: "{{ansible_user}}"
    become_method: su
    command: docker-compose build --pull
    args:
        chdir: /docker
Run Code Online (Sandbox Code Playgroud)

这样ansible会进入一个新会话,但这可能会失败,因为我需要输入密码,而且我认为没有办法直接在任务中做到这一点。

关于如何以非黑客的方式解决这个问题的任何想法?我不敢相信这是一个如此罕见的用例,以至于没有标准的方法来解决这个问题。可能我只是忽略了一些东西。

Zor*_*che 14

我不确定它是否适合你,但我建议你尝试添加一个 reset_connection。

- name: reset ssh connection
  meta: reset_connection
Run Code Online (Sandbox Code Playgroud)

这里有一个例子。

您可能希望将其添加为处理程序,并从您的用户/组修改任务中通知它。然后还添加一个,meta: flush_handlers以便仅在需要时重置连接。