我正在尝试使用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: {}
答案 0 :(得分:1)
我找到了原因:
基本图片debian:stretch
不包含sudo
。因此,解决方案是将become_method
设置为su
。通常,这可以按任务,主持人或剧本完成。因为在Ansible Container中等效的剧本以及主机的概念如何应用并不明显,我只能选择使用任务级别。
我决定添加一个角色,在图片中安装sudo
,并仅为此角色中的单独任务设置become_method
到su
。在应用该角色时,不需要进一步更改,原始任务也可以正常工作。
然后是一个后续问题,也没有安装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映像生成。