【发布时间】:2020-03-29 20:34:59
【问题描述】:
我想在我用 ansible 管理的机器的容器内执行命令。
这可以通过delegate_to 命令实现(参见https://stackoverflow.com/a/41626257/458274):
- name: Add container to inventory
add_host:
name: mycontainer
ansible_connection: docker
changed_when: false
- name: Do something in container
delegate_to: mycontainer
raw: echo "hello world"
但是,我使用的用户无权访问/var/run/docker.sock。我可以通过将用户添加到docker 组来解决此问题,但我认为这是一种糟糕的安全做法,因为使用此用户帐户运行的任何程序现在都可以在没有密码的情况下获得 root 权限。
使用become 也不起作用,因为它也会被委托给容器。
如何使用delegate_to,但先切换到另一个用户?
【问题讨论】:
-
我认为,如果您希望使用 playbook 来定位容器,您需要让本地用户访问 Docker 套接字。
-
这是 docker 的一个危险,并且正负是不可避免的(正负是你可以使用像 kubernetes 或 mesos 这样的中间层来控制计划在 docker 上运行的内容) ;另外,如果 user-A 可以切换到 user-B 并且 user-B 可以运行 docker,那么你就回到了你开始的地方
-
你可以直接调用 docker 命令:
- name: Do something become: yes shell: docker exec mycontainer echo "hello world"。由于 become=yes 它将访问套接字。 -
...为了清楚起见,没有必要使用
delegate_to来定位容器。他们可以像任何其他主机一样在戏剧中使用hosts:指令作为目标。 -
为什么让用户运行 playbook 权限来使用 Docker 应该是一种糟糕的安全实践?如果你从原来的用户切换到另一个用户并且这个另一个用户有使用 Docker 的权限,那么安全风险是一样的:在一种情况下,原来的用户可以直接使用 Docker,在第二种情况下,原来的用户可以变成另一个用户并使用 Docker - 在这两种情况下,原始用户都可以访问 Docker。
标签: docker permissions ansible