はじめに
こんにちは!株式会社デザインワン・ジャパンでインフラ業務を担当している情報戦略部の冨田(@komitta)です。
本日よりデザインワン・ジャパンのテックブログを開設いたしました。 業務で培った内容をアウトプットし、世の中の発展につながることを目的としてゆるく続けていければと思っております。
概要説明
弊社にて運営している口コミサービス エキテンを始めとしたサービスの大半はAWS環境で動かしております。 AWSは使った分だけ課金される従量課金制のため、AWSにサーバーを構築した場合起動した分だけコストが発生いたします。
そのため数は少ないですが以下要望が社内であがっておりました。
そんな(ニッチな)需要に応えるため社内のオンプレのサーバーにAmazon Linux 2のVMを構築しました。という記事になります。
Proxmoxについて
VMを動かすためのHypervisor環境としてオンプレサーバーにはProxmoxを導入しました。 Hypervisorの有名どころでいうとVMwareのESXiやMicrosoftのHyper-Vとかが挙げられますが、あえて今回はマイナー(?)な製品を入れております。
前職でもESXi を使っていたのでESXiでも良かったのですが、どうせなら触ったことのないものを試したいという思いもありこちらを選びました。
触ってみてよかった点は
です。(正直、KVMならなんでもよかった説)
基本GUI管理コンソール画面から操作は行うのですがOSにSSHログインして直接ファイル変更による操作も可能だったためすごく楽な印象でした。(ここについては当然メリデメあると思います)
Amazon Linux 2のVMを構築する
本題です。Proxmoxの構築についてはここでは触れません。 VMの構築は先人の方がまとめてくださった下記記事に沿って作成*2しました。
Cloud-Initで作成するユーザーにSSHの公開鍵を設定することでSSHログインが可能になります。
弊社ではAnsibleを使ったOSのプロビジョニングを行っているため、Ansibleが実行できるようSSH公開鍵を設定およびIPアドレスを設定しました。
Ansible によるプロビジョニング
ローカル環境からプロビジョニングを行うためのディレクトリ構成を以下に記載します。 dockerコンテナよりAnsibleのplaybookを流すことができるように、Ansibleの構成ファイルとdocker-compose.ymlファイルを同じディレクトリに設置しました。
ディレクトリ構成
. ├── ansible │ ├── dev(インベントリファイル) │ ├── group_vars │ ├── roles(ロールの中身は省略) │ │ ├── common-systemd(OSの共通設定用Role) │ │ └── mysql(mysqlインストール用Role) │ └── site.yml(実行するplaybook。roleを記載) ├── docker-compose.yml └── images ├── Dockerfile ├── config └── id_rsa
./ansible/dev
インベントリファイルにホスト名を記載しています。
[dev:children] pve [pve] dev-pve-01-a
./images/DockerFile
Ansibleを実行するためのDocker Imageを作成します。 sshクライアントとAnsibleをインストールし、ここではVMに設定した公開鍵のペアである秘密鍵*3の格納を行います。
FROM debian:10-slim WORKDIR /usr/local/src # ssh client & Ansible install RUN apt update && apt install openssh-server ansible -y && mkdir "/root/.ssh/" COPY config "/root/.ssh/" COPY id_rsa "/root/.ssh/" RUN chown 600 /root/.ssh/id_rsa CMD ["/bin/bash"]
./docker-compose.yml
Ansibleディレクトリをコンテナ上でbind マウントさせることで、ローカル上でAnsibleのplaybookを更新してすぐに反映できるようにしております。
またextra_hostsにインベントリファイルに記載した名前(OSのホスト名)とVMに設定したIPアドレスを記載します。 こうすることでコンテナの/etc/hostsにOSのホスト名とIPアドレスが記載されるため、インベントリファイルに記載したホスト名に対してplaybookを流すことができるようにしました。
version: '3' services: ansible: build: ./images/ tty: true working_dir: /usr/local/src volumes: - ./ansible:/usr/local/src extra_hosts: - "dev-pve-01-a:192.168.1.103"
あとはdocker compose コマンドよりAnsibleクライアントコンテナを起動させ、docker compose execよりansible-playbook コマンドを使用することでVMのプロビジョニングが実行されます。
$ docker compose up -d $ docker compose exec ansible ansible-playbook -i dev site.yml PLAY [all] ************************************************************************************************************* TASK [Gathering Facts] ************************************************************************************************* ok: [dev-pve-01-a] TASK [common-systemd : ホスト名を dev-pve-01-a に設定] ************************************************************************* ok: [dev-pve-01-a] TASK [common-systemd : 言語が日本語設定か確認] ************************************************************************************ ~~~~略~~~~~ TASK [mysql : rootの.my.cnfの編集] ***************************************************************************************** ok: [dev-pve-01-a] PLAY RECAP ************************************************************************************************************* dev-pve-01-a : ok=35 changed=0 unreachable=0 failed=0
おわりに
Dockerコンテナによる開発環境が充実してきた昨今ではオンプレでのサーバー構築を行うことは少なくなってきてると思いますが、 オンプレサーバー機器を所有している場合、このようにEC2に構築したAmazon Linux 2環境と同様の環境を用意することができます。
正直一発目の投稿内容にしては需要が少ないであろうニッチな話題になってしまいましたが、オンプレ好きにとっては作っててすごく楽しかったです。
仲間を募集しております
募集中の職種については以下を御覧ください。 www.wantedly.com