在Ansible中更新apt缓存,并在不同于root用户的情况下进行操作

68次阅读
没有评论

问题描述

在使用Ansible时,遇到一个问题。在Dockerfile中,他创建了一个名为gianluca的用户,然后使用Ansible playbook尝试更新apt缓存。但是,当主用户不是root时,become: true似乎无法实现在root用户下运行apt-get update,然后切换回用户gianluca来完成剩余的playbook操作。用户希望找到一种解决方案,能够在不安装sudo并提供密码的情况下解决这个问题。另外,用户想知道其他人是如何解决这个问题的。

解决方案

请注意以下操作可能涉及到版本差异,以及对Docker、Ansible等工具的正确配置。

方案1

要在不同于root用户的情况下更新apt缓存并执行Ansible playbook,可以使用以下方法:
1. 使用 become: true,但是在Ansible playbook的任务中,使用特权执行器(become_method)以及特权用户(become_user)属性来指定更新apt缓存时使用root用户,然后再切换回gianluca用户执行其他任务。以下是一个示例的Ansible playbook片段:

---
- hosts: localhost
  tasks:
    - name: Update Apt cache
      become: true
      become_user: root
      become_method: sudo
      apt: update_cache=yes
      changed_when: False

    - name: Run other tasks as user gianluca
      become: true
      become_user: gianluca
      become_method: su
      # 在这里添加其他任务

在上面的示例中,我们使用两个任务,第一个任务使用become: true来以root用户权限执行apt-get update,然后将特权用户切换回gianluca。第二个任务以gianluca用户执行其他任务。

方案2

使用特权容器可能是解决此问题的另一种方法,但需要确保容器中的gianluca用户具有适当的权限。
另一种方法是使用特权容器。特权容器允许容器内的进程拥有与主机操作系统相同的权限,这可能会解决你的问题。以下是一个示例的Dockerfile片段,其中使用特权容器:

FROM ubuntu

# 允许特权
# 请注意,特权容器可能会带来一些安全风险,需要谨慎使用
# 确保你的gianluca用户在容器内具有适当的权限
# 你也可以考虑添加安全性措施,如使用非root用户执行特权操作
RUN echo 'Set disable_coredump false' >> /etc/sudo.conf

ARG DEBIAN_FRONTEND=noninteractive

RUN apt-get update
RUN apt-get install -y git software-properties-common ansible
RUN apt-get install -y build-essential curl
RUN apt-get install -y vim

RUN addgroup --gid 1000 gianluca
RUN adduser --gecos gianluca --uid 1000 --gid 1000 --disabled-password gianluca

# 运行特权容器
# 以root用户执行apt-get update,然后以gianluca用户继续后续操作
USER root
RUN apt-get update

USER gianluca
WORKDIR /home/gianluca
COPY . .
RUN make playbook

在上面的示例中,我们在Dockerfile中添加了一行将disable_coredump设置为false的命令,以允许特权操作。然后在容器内,我们首先以root用户权限执行apt-get update,然后切换到gianluca用户执行后续操作。

请注意,特权容器可能会带来一些安全风险,需要谨慎使用,特别是在生产环境中。另外,确保你的gianluca用户在容器内具有适当的权限。

方案3

如果你不想使用特权容器,可以考虑在Dockerfile中切换用户来执行不同的任务。
如果你不想使用特权容器,也可以在Dockerfile中切换用户来执行不同的任务。以下是一个示例的Dockerfile片段,其中在不同的阶段使用不同的用户执行操作:

FROM ubuntu AS update_cache

# 更新apt缓存时以root用户执行
RUN apt-get update

FROM update_cache AS build

# 构建阶段以gianluca用户执行其他操作
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get install -y git software-properties-common ansible
RUN apt-get install -y build-essential curl
RUN apt-get install -y vim

RUN addgroup --gid 1000 gianluca
RUN adduser --gecos gianluca --uid 1000 --gid 1000 --disabled-password gianluca

USER gianluca
WORKDIR /home/gianluca
COPY . .
RUN make playbook

在上面的示例中,我们使用多个阶段(build stages)来实现在不同的用户下执行不同的操作。首先,在update_cache阶段,我们以root用户执行apt-get update。然后,在build阶段,我们以gianluca用户执行其他操作。这样可以在不使用特权容器的情况下,以不同的用户执行不同的任务。

方案4

考虑为gianluca用户授予适当的sudo权限,以在Docker容器内以sudo身份运行apt-get update
如果你考虑为gianluca用户授予适当的sudo权限,那么在Docker容器内以sudo身份运行apt-get update可能是一个解决

正文完