質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.05%

Ansible-benderを使ってコンテナイメージを作成したい。

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 525

score 21

やりたいこと

Ansibleのツールの一つである、ansible-benderを使ってコンテナのイメージを作成しようと考えています。
具体的には、ローカルマシン上で事前に作成したNode.jsをベースにしたフレームワークであるNuxt.jsのひな型プロジェクトパーツをコンテナ内にコピーして起動直前までの状態をコンテナイメージとして作成したいと考えています。
自分の記事の紹介になってしまい恐縮ですが、元々AnsibleでDockerコンテナの管理をdockerモジュールを使って上記のことを検証していました。→AnsibleでDockerコンテナの管理をしてみた
こちらで使用したDockerfileをansible-benderを使用してDockerfileを使わないコンテナイメージの作成をしようと思ったのがansible-benderを使ったきっかけです。

ベースとなったDockerfile
FROM node:latest  
ENV NUXT_HOST=0.0.0.0  
ENV NUXT_TELEMETRY_DISABLED=1  
WORKDIR /app  

COPY ./app/package.json ./app/yarn.lock ./  
RUN yarn install  

COPY ./app .  

CMD ["yarn", "run", "dev"]  

このDockerfileをPlaybookに記載してansible-bender buildでPlaybookのみで実行できるようにしたのが以下のPlaybookとなります。

構成図

├── Prototype  
│   └── app/(Nuxt.jsのひな型)    
└── build_nuxtimage.yml
---
- name: Build Nuxt.js image
  hosts: all
  gather_facts: false
  vars:
    ansible_python_interpreter: /usr/bin/python3
    ansible_bender:
      base_image: "localhost/node-python3"
      ansible_extra_args: "-vvv"

      target_image:
        name: yuta28/bender-test
        working_dir: /app
        environment: 
          NUXT_HOST: 0.0.0.0
        labels:
          built-by: '{{ ansible_user }}'
          cmd: "yarn run dev"        

  tasks:
  - name: Copy Prototype parts
    copy:
      src: "{{ item }}"
      dest: /app/
    with_items:
      - "{{ playbook_dir }}/Prototype/app/package.json"
      - "{{ playbook_dir }}/Prototype/app/yarn.lock"

  - name: Yarn install
    command: "yarn install"

  - name: Copy Prototype
    synchronize:
      src: "{{ playbook_dir }}/Prototype/app" 
      dest: /app

ただこちらのplaybookを実行しますとCopy Prototypeタスクで処理が終わらない状態が続きました。

task path: /home/ec2-user/ansible-bender/simple-test/.build_nuxtimage-20200912-021642705039-umrydddzeh.yaml:10
<yuta28-bender-test-20200912-021638690637-cont> ESTABLISH LOCAL CONNECTION FOR USER: ec2-user
<yuta28-bender-test-20200912-021638690637-cont> EXEC /bin/sh -c '( umask 77 && mkdir -p "` echo /home/ec2-user/.ansible/tmp/ansible-local-24469ah1fy7m1 `"&& mkdir "` echo /home/ec2-user/.ansible/tmp/ansible-local-24469ah1fy7m1/ansible-tmp-1599877156.9603715-28334-161050357341488 `" && echo ansible-tmp-1599877156.9603715-28334-161050357341488="` echo /home/ec2-user/.ansible/tmp/ansible-local-24469ah1fy7m1/ansible-tmp-1599877156.9603715-28334-161050357341488 `" ) && sleep 0'
Using module file /usr/lib/python3.6/site-packages/ansible/modules/files/synchronize.py
<yuta28-bender-test-20200912-021638690637-cont> PUT /home/ec2-user/.ansible/tmp/ansible-local-24469ah1fy7m1/tmp8nv04tk7 TO /home/ec2-user/.ansible/tmp/ansible-local-24469ah1fy7m1/ansible-tmp-1599877156.9603715-28334-161050357341488/AnsiballZ_synchronize.py
<yuta28-bender-test-20200912-021638690637-cont> EXEC /bin/sh -c 'chmod u+x /home/ec2-user/.ansible/tmp/ansible-local-24469ah1fy7m1/ansible-tmp-1599877156.9603715-28334-161050357341488/ /home/ec2-user/.ansible/tmp/ansible-local-24469ah1fy7m1/ansible-tmp-1599877156.9603715-28334-161050357341488/AnsiballZ_synchronize.py && sleep 0'
<yuta28-bender-test-20200912-021638690637-cont> EXEC /bin/sh -c '/usr/bin/python3.6 /home/ec2-user/.ansible/tmp/ansible-local-24469ah1fy7m1/ansible-tmp-1599877156.9603715-28334-161050357341488/AnsiballZ_synchronize.py && sleep 0'


app/配下のひな型プロジェクトファイルの中にnode_modulesディレクトリがありましてこの中に3万近いモジュールファイルがあることでコピーが上手くいかないことが原因だと思われました。
Ansibleに詳しい人から大きなファイルを直接ローカルマシンからコンテナへコピーするよりもAWS S3を経由してコピーするほうがよいという助言をいただきましたので、一度aws_s3モジュールを使ったテストPlaybookを作成しました。

---
- name: Build Nuxt.js image
  hosts: all
  gather_facts: false
  vars:
    ansible_python_interpreter: /usr/bin/python3
    ansible_bender:
      base_image: "localhost/node-python3"
      ansible_extra_args: "-vvv"

      target_image:
        name: yuta28/bender-test
        working_dir: /app
        environment: 
          NUXT_HOST: 0.0.0.0
        labels:
          built-by: '{{ ansible_user }}'      

  tasks:
  - name: Upload Prototype to S3
    aws_s3:
      bucket: ansible-bender-bucket
      object: app/nuxt.config.js
      src: "{{ playbook_dir }}/Prototype/app/nuxt.config.js"
      mode: put


こちらのPlaybookを実行しますと以下のようなエラーがでました。

TASK [Upload Prototype to S3] **********************************************************************************************************************************************************
task path: /home/ec2-user/ansible-bender/simple-test/.build_nuxtimage-20200912-024316468577-jjfznsazui.yaml:5
<yuta28-bender-test-20200912-024312325590-cont> RUN [b'buildah', b'mount', b'--', b'yuta28-bender-test-20200912-024312325590-cont']
<yuta28-bender-test-20200912-024312325590-cont> RUN [b'buildah', b'run', b'--', b'yuta28-bender-test-20200912-024312325590-cont', b'/bin/sh', b'-c', b'( umask 77 && mkdir -p "` echo /tmp `"&& mkdir "` echo /tmp/ansible-tmp-1599878598.4473948-102621-228656985697566 `" && echo ansible-tmp-1599878598.4473948-102621-228656985697566="` echo /tmp/ansible-tmp-1599878598.4473948-102621-228656985697566 `" ) && sleep 0']
<yuta28-bender-test-20200912-024312325590-cont> RUN [b'buildah', b'run', b'--', b'yuta28-bender-test-20200912-024312325590-cont', b'/bin/sh', b'-c', b'test -e /home/ec2-user/ansible-bender/simple-test/Prototype/app/nuxt.config.js && sleep 0']
Using module file /usr/lib/python3.6/site-packages/ansible/modules/cloud/amazon/aws_s3.py
<yuta28-bender-test-20200912-024312325590-cont> PUT /home/ec2-user/.ansible/tmp/ansible-local-1025297iswwqko/tmpddey__6x TO /tmp/ansible-tmp-1599878598.4473948-102621-228656985697566/AnsiballZ_aws_s3.py
<yuta28-bender-test-20200912-024312325590-cont> RUN [b'buildah', b'run', b'--', b'yuta28-bender-test-20200912-024312325590-cont', b'/bin/sh', b'-c', b'chmod u+x /tmp/ansible-tmp-1599878598.4473948-102621-228656985697566/ /tmp/ansible-tmp-1599878598.4473948-102621-228656985697566/AnsiballZ_aws_s3.py && sleep 0']
<yuta28-bender-test-20200912-024312325590-cont> RUN [b'buildah', b'run', b'--', b'yuta28-bender-test-20200912-024312325590-cont', b'/bin/sh', b'-c', b'/usr/bin/python3 /tmp/ansible-tmp-1599878598.4473948-102621-228656985697566/AnsiballZ_aws_s3.py && sleep 0']
<yuta28-bender-test-20200912-024312325590-cont> RUN [b'buildah', b'run', b'--', b'yuta28-bender-test-20200912-024312325590-cont', b'/bin/sh', b'-c', b'rm -f -r /tmp/ansible-tmp-1599878598.4473948-102621-228656985697566/ > /dev/null 2>&1 && sleep 0']
<yuta28-bender-test-20200912-024312325590-cont> RUN [b'buildah', b'umount', b'--', b'yuta28-bender-test-20200912-024312325590-cont']
fatal: [yuta28-bender-test-20200912-024312325590-cont]: FAILED! => {
    "changed": false,
    "invocation": {
        "module_args": {
            "aws_access_key": null,
            "aws_secret_key": null,
            "bucket": "ansible-bender-bucket",
            "debug_botocore_endpoint_logs": false,
            "dest": null,
            "dualstack": false,
            "ec2_url": null,
            "encrypt": true,
            "encryption_kms_key_id": null,
            "encryption_mode": "AES256",
            "expiry": 600,
            "headers": null,
            "ignore_nonexistent_bucket": false,
            "marker": "",
            "max_keys": 1000,
            "metadata": null,
            "mode": "put",
            "object": "app/nuxt.config.js",
            "overwrite": "always",
            "permission": [
                "private"
            ],
            "prefix": "",
            "profile": null,
            "region": null,
            "retries": 0,
            "rgw": false,
            "s3_url": null,
            "security_token": null,
            "src": "/home/ec2-user/ansible-bender/simple-test/Prototype/app/nuxt.config.js",
            "validate_certs": true,
            "version": null
        }
    },
    "msg": "Failed to import the required Python library (botocore or boto3) on ip-172-31-8-50.ap-northeast-1.compute.internal's Python /usr/bin/python3. Please read module documentation and install in the appropriate location. If the required library is installed, but Ansible is using the wrong Python interpreter, please consult the documentation on ansible_python_interpreter"
}


必要なPythonライブラリが不足していると出ていますが、boto3もbotocoreもインストールはされています。Python interpreterの指定が間違っているのというのがよく分からず、一応冒頭で明示的にansible_python_interpreter: /usr/bin/python3を指定しましたが、結果は変わりませんでした。

結論

ansible-benderで大量のファイルをローカルからコンテナへコピーする方法として他にどのような方法がありますでしょうか?
アドバイスいただけますと幸いです。

どうぞよろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.05%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る