Ansible Container не может загрузить libsudo_util.so.0 для выполнения привилегированного модуля

Я пытаюсь использовать Ansible Container для базового примера, который должен установить Node в образе. Когда я использую ansible-container build команда, после успешного построения образа проводника, она не может выполнить первую задачу с sudo связанная ошибка Требуемая задача требует root привилегии, которые будут выполнены.

Я использую Debian GNU/Linux 9.2 (stretch) с Docker 17.09.0-ce, установленным через репозиторий Docker APT. Я пробовал с Ansible как из Debian Stretch (2.2.1.0-2), так и из Pypi (2.4.1.0). Я попробовал Ansible Container из Pypi (0.9.3rc0) и из последнего источника Git. Я всегда получаю одну и ту же ошибку.

Модуль 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 команда с sudo предварительно, потому что только 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

1 ответ

Решение

Я нашел причину для этого:

Базовое изображение debian:stretch не включает в себя sudo, Поэтому решение было установить become_method в su вместо. Обычно это можно сделать для каждой задачи, хоста или книги. Поскольку неясно, где находится эквивалент Playbook в 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.

Другие вопросы по тегам