紹介する内容
- ansibleをlocal(127.0.0.1)のport(55556)を指定して実行します
- sshログイン可能なdockerコンテナ(amazonlinux2)作成します
結論
デプロイ試しに活用できます
- production環境のリソース(AWSなど)を使わずにansibleを試せます
- デプロイ(Deployer、Capistranoなど)試しにも応用できると思います
- dockerイメージをAWS公式のamazonlinux2を使用したから、AWSのEC2に近い試しになれると思います
紹介始めます
ディレクトリ構成
全体ソースコードは https://github.com/cheekykorkind/qiita-example/tree/master/ansible/to-docker で確認できます
ansibleのport指定、localに対して実行する実装周り説明
- playbookとinventoryによってport(55556)、local(127.0.0.1)指定されます
- playbookは
ansible/local_docker_book.yml
ファイルです- playbookのhostsはinventoryファイルに書いた
local_docker
にします
- playbookのhostsはinventoryファイルに書いた
- inventoryは
ansible/local_hosts
ファイルです- inventoryでlocalを意味する
127.0.0.1
にします - inventoryで
ansible_port=55556
で使いたいpostを指定します
- inventoryでlocalを意味する
- playbookは
sshログイン実装周り説明
- 公開鍵docker-ssh-key.pubを加えたauthorized_keysファイル持って待機しているdockerコンテナに対して、ansibleが秘密鍵docker-ssh-keyを使ってsshログインします
- 公開鍵は
docker-ssh/docker-ssh-key.pub
ファイルです - 秘密鍵は
docker-ssh/docker-ssh-key
ファイルです - 公開鍵を加えたauthorized_keysは
docker-ssh/authorized_keys
ファイルです -
docker-compose.yml
ファイルで./docker-ssh:/home/ec2-user/.ssh
にマウントしているから、ansible実行するマシンとdockerコンテナ両方でファイルが使用可能です-
entrypoint.sh
ファイルで公開鍵、秘密鍵、authorized_keysの所有者をansible実行するマシンのユーザーと同じく設定し、権限を調整しています- dockerコンテナ中のユーザーのUIDをansible実行するマシンのユーザーのUIDと同じくすることで両方ファイル所有権を気にせずに使えます
-
-
docker-compose.yml
ファイルでansibleが使うportを用意しますports: '55556:22'
- dockerコンテナに開いたportにsshログイン作業処理してくれる
sshd
をバックグラウンドで起動しておきます-
entrypoint.sh
で/usr/sbin/sshd -D
部分です
-
-
sshd
は指定された名前の秘密鍵/etc/ssh/ssh_host_rsa_key
がないと怒りますから、使用しませんがssh秘密鍵を作っておきます-
Dockerfile
のRUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ''
部分です
-
- dockerコンテナに開いたportにsshログイン作業処理してくれる
- ansible実行コマンド
ansible-playbook local_docker_book.yml -i local_hosts -u ec2-user --private-key ../docker-ssh/docker-ssh-key
でsshに使う秘密鍵を指定してます- i: カスタムinventoryファイルパスを指定
- u:sshログインするユーザー名
- private-key:sshログインで使う秘密鍵
- https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html
- 公開鍵は
試し順番です
ansibleはファイルnginx.repo
を2箇所(/etc/yum.repos.d/nginx.repo
、/home/ec2-user/nginx.repo
)にをコピーする内容です。
実行成功したら、dockerコンテナの/etc/yum.repos.d/nginx.repo
、/home/ec2-user/nginx.repo
にファイルが見えます。
- docker composeがあるデレクトリー移動に移動します
cd qitta-example/ansible/to-docker
- dockerコンテナをバックグラウンドで起動します
DOCKER_UID=$(id -u $USER) DOCKER_GID=$(id -g $USER) docker-compose up -d
- Ansibleのplaybookがあるデレクトリーに移動します
cd qitta-example/ansible/to-docker/ansible
- Ansible実行します(両方同じです。どっちでも実行可能です)
ansible-playbook local_docker_book.yml -i local_hosts -u ec2-user --private-key ../docker-ssh/docker-ssh-key
sh local_docker_book.sh