2017-11-14 31 views
0

イメージ内にNodeをインストールするはずの基本的な例として、Aniable Containerを使用しようとしています。 ansible-container buildコマンドを使用すると、導体イメージを正常に作成した後、sudoというエラーが発生した最初のタスクが失敗します。問題のタスクにはroot特権が必要です。権限のあるコンテナが特権モジュールの実行のためにlibsudo_util.so.0をロードできません

私は、Docker APTリポジトリを通じてDocker 17.09.0-ceをインストールしたDebian GNU/Linux 9.2(ストレッチ)を実行しています。私はDebian Stretch(2.2.1.0-2)とPypi(2.4.1.0)の両方からAnsibleを使って試しました。私はPypi(0.9.3rc0)と最新のGitソースからAnatile 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を作成しようとするサービスの両方ベース画像。

rootが私のシステムのDockerソケットにアクセスする可能性があるので、が付加されたansible-container buildコマンドを前に実行しています。ここで

は私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_methodsuに設定するという解決策がありました。通常、これはタスク、ホスト、またはプレイブックごとに行うことができます。プレイブックの同等の部分が危険なコンテナにある場所とホストのコンセプトがどのように当てはまるかは明白ではないので、私は本当にタスクレベルを使用するオプションしか持っていませんでした。

イメージに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コンテナ画像生成を可能にするためにこれらの依存関係が含まれてベース画像を生成することであろう。

関連する問題