Ansible Container无法加载libsudo_util.so.0以执行特权模块

时间:2017-11-14 08:26:17

标签: docker ansible debian sudo ansible-container

我正在尝试使用Ansible Container作为一个基本示例,它应该在图像中安装Node。当我使用ansible-container build命令时,在成功构建导体图像后,它会导致第一个任务失败,并出现sudo相关错误。有问题的任务需要执行root个权限。

我正在通过Docker APT存储库安装Docker 17.09.0-ce运行Debian GNU / Linux 9.2(stretch)。我试用了Debian Stretch(2.2.1.0-2)和Pypi(2.4.1.0)的Ansible。我从Pypi(0.9.3rc0)和最新的Git源代码尝试了Ansible Container。我总是得到完全相同的错误输出。

Ansible模块抱怨以下内容:

sudo: error while loading shared libraries: libsudo_util.so.0: cannot open shared object file: No such file or directory

正在运行的任务如下所示:

- name: Add the Node Source repository signing certificate to APT
  apt_key:
    id: 9FD3B784BC1C6FC31A8A0A1C1655A0AB68576280
    keyserver: hkps://hkps.pool.sks-keyservers.net
  become: yes

导体以及我尝试创建的服务都使用debian:stretch基本图像。

我正在运行带有ansible-container build的{​​{1}}命令,因为只有sudo可以访问我系统上的Docker套接字。

以下是我root的内容:

container.yml

这是完整的错误输出:

version: "2"
settings:
  conductor:
    base: debian:stretch
  project_name: container_test
services:
  nodejs:
    from: debian:stretch
    roles:
      - nodejs
registries: {}

1 个答案:

答案 0 :(得分:1)

我找到了原因:

基本图片debian:stretch不包含sudo。因此,解决方案是将become_method设置为su。通常,这可以按任务,主持人或剧本完成。因为在Ansible Container中等效的剧本以及主机的概念如何应用并不明显,我只能选择使用任务级别。

我决定添加一个角色,在图片中安装sudo,并仅为此角色中的单独任务设置become_methodsu。在应用该角色时,不需要进一步更改,原始任务也可以正常工作。

然后是一个后续问题,也没有安装GnuPG来正确完成apt_key模块任务。以下解决方案解决了这两个问题:

- become: yes
  become_method: su
  block:
    - name: Update package cache
      apt:
        update_cache: yes
        cache_valid_time: 86400

    - name: Install GnuPG
      package:
        name: gnupg2
        state: present

    - name: Install sudo
      package:
        name: sudo
        state: present

据说更干净的选择是生成已包含这些依赖关系的基本映像,以便更简化Ansible Container映像生成。