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

我正在试图使用Ansible容器为应该在图像中安装节点的基本示例。 当我使用ansible-container build命令时,在成功build立导体图像之后,第一个任务失败,导致与sudo相关的错误。 有问题的任务需要执行root权限。

我正在运行Debian GNU / Linux 9.2(扩展版),通过Docker APT存储库安装Docker 17.09.0-ce。 我试用了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 

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

我正在运行带有sudoansible-container build命令,因为只有root可以访问我的系统上的Docker套接字。

这里是我的container.yml的内容:

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

这是完整的错误输出:

 Building Docker Engine context... Starting Docker build of Ansible Container Conductor image (please be patient)... Parsing conductor CLI args. Docker™ daemon integration engine loaded. Build starting. project=container_test Building service... project=container_test service=nodejs PLAY [nodejs] ****************************************************************** TASK [Gathering Facts] ********************************************************* ok: [nodejs] TASK [nodejs : Add the Node Source repository signing certificate to APT] ****** fatal: [nodejs]: FAILED! => {"changed": false, "module_stderr": "sudo: error while loading shared libraries: libsudo_util.so.0: cannot open shared object file: No such file or directory\n", "module_stdout": "", "msg": "MODULE FAILURE", "rc": 127} to retry, use: --limit @/tmp/tmpTRBQDe/playbook.retry PLAY RECAP ********************************************************************* nodejs : ok=1 changed=0 unreachable=0 failed=1 ERROR Error applying role! engine=<container.docker.engine.Engine object at 0x7f84da0c5ed0> exit_code=2 playbook=[{'hosts': u'nodejs', 'roles': ['nodejs'], 'vars': {}}] Traceback (most recent call last): File "/usr/local/bin/conductor", line 11, in <module> load_entry_point('ansible-container', 'console_scripts', 'conductor')() File "/_ansible/container/__init__.py", line 19, in __wrapped__ return fn(*args, **kwargs) File "/_ansible/container/cli.py", line 408, in conductor_commandline **params) File "/_ansible/container/__init__.py", line 19, in __wrapped__ return fn(*args, **kwargs) File "/_ansible/container/core.py", line 843, in conductorcmd_build raise RuntimeError('Build failed.') RuntimeError: Build failed. Conductor terminated. Cleaning up. command_rc=1 conductor_id=e8899239ad1017a89acc97396d38ab805d937a7b3d74e5a7d2741d7b1124bb0c save_container=False ERROR Conductor exited with status 1 

我find了原因:

基本的图像debian:stretch不包括sudo 。 因此,一个解决scheme是添加设置为subecome_method而不是。 通常情况下,这可以完成每个任务,主机或剧本。 因为剧本的等价物在Ansible Container中的位置并不明显,主机的概念如何应用,所以我只能真正select使用任务级别。

我决定添加一个在图像中安装sudo的angular色,并且只为该angular色中的孤立任务设置成为become_method 。 执行angular色的应用,不需要进一步的改变,原来的任务工作。

接下来的问题是,GnuPG也没有被安装来正确地完成apt_key模块任务。 以下解决scheme解决了这两个问题:

 - 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映像生成。