やりたいこと
Ansibleのツールの一つである、ansible-bender
を使ってコンテナのイメージを作成しようと考えています。
具体的には、ローカルマシン上で事前に作成したNode.jsをベースにしたフレームワークであるNuxt.jsのひな型プロジェクトパーツをコンテナ内にコピーして起動直前までの状態をコンテナイメージとして作成したいと考えています。
自分の記事の紹介になってしまい恐縮ですが、元々AnsibleでDockerコンテナの管理をdockerモジュールを使って上記のことを検証していました。→AnsibleでDockerコンテナの管理をしてみた
こちらで使用したDockerfileをansible-benderを使用してDockerfileを使わないコンテナイメージの作成をしようと思ったのがansible-benderを使ったきっかけです。
ベースとなったDockerfile
Docker
1FROM node:latest 2ENV NUXT_HOST=0.0.0.0 3ENV NUXT_TELEMETRY_DISABLED=1 4WORKDIR /app 5 6COPY ./app/package.json ./app/yarn.lock ./ 7RUN yarn install 8 9COPY ./app . 10 11CMD ["yarn", "run", "dev"]
このDockerfileをPlaybookに記載してansible-bender build
でPlaybookのみで実行できるようにしたのが以下のPlaybookとなります。
構成図
├── Prototype │ └── app/(Nuxt.jsのひな型) └── build_nuxtimage.yml
YAML
1--- 2- name: Build Nuxt.js image 3 hosts: all 4 gather_facts: false 5 vars: 6 ansible_python_interpreter: /usr/bin/python3 7 ansible_bender: 8 base_image: "localhost/node-python3" 9 ansible_extra_args: "-vvv" 10 11 target_image: 12 name: yuta28/bender-test 13 working_dir: /app 14 environment: 15 NUXT_HOST: 0.0.0.0 16 labels: 17 built-by: '{{ ansible_user }}' 18 cmd: "yarn run dev" 19 20 tasks: 21 - name: Copy Prototype parts 22 copy: 23 src: "{{ item }}" 24 dest: /app/ 25 with_items: 26 - "{{ playbook_dir }}/Prototype/app/package.json" 27 - "{{ playbook_dir }}/Prototype/app/yarn.lock" 28 29 - name: Yarn install 30 command: "yarn install" 31 32 - name: Copy Prototype 33 synchronize: 34 src: "{{ playbook_dir }}/Prototype/app" 35 dest: /app 36
ただこちらの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を作成しました。
YAML
1--- 2- name: Build Nuxt.js image 3 hosts: all 4 gather_facts: false 5 vars: 6 ansible_python_interpreter: /usr/bin/python3 7 ansible_bender: 8 base_image: "localhost/node-python3" 9 ansible_extra_args: "-vvv" 10 11 target_image: 12 name: yuta28/bender-test 13 working_dir: /app 14 environment: 15 NUXT_HOST: 0.0.0.0 16 labels: 17 built-by: '{{ ansible_user }}' 18 19 tasks: 20 - name: Upload Prototype to S3 21 aws_s3: 22 bucket: ansible-bender-bucket 23 object: app/nuxt.config.js 24 src: "{{ playbook_dir }}/Prototype/app/nuxt.config.js" 25 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で大量のファイルをローカルからコンテナへコピーする方法として他にどのような方法がありますでしょうか?
アドバイスいただけますと幸いです。
どうぞよろしくお願いいたします。
あなたの回答
tips
プレビュー