こんにちは、RSSでクラウド基盤を担当しているH.Dです。
弊社では、 Compute Engine の構築作業を行う際、ミドルウェアのインストール・設定を手動で行っていました。
しかし、最近 Ansible を導入して初期構築の作業を自動化しました。
今回はCompute Engineの初期構築作業を自動化するまでの手順について解説します。
Ansible とは
Ansible は、オープンソースの構成管理ツールの1種です。
構成管理ツールとは、事前に用意したファイルをもとにして、ソフトウェアのインストールやサーバーの設定変更を自動で実行できるツールのことです。
Ansible とよく比較されるツールとして、「Chef」「Puppet」が挙げられますが、
Ansible はエージェントのインストールを必要とせず、
処理を行いたいサーバーにSSH接続ができる環境を用意すれば使用することができます。
また、「Chef」はRuby、「Puppet」は独自の言語で構成ファイルを記述する必要がありますが、AnsibleはYAMLを使用してPlaybook と呼ばれるファイルに処理内容を記述するので、
処理した内容がわかりやすく、学習コストが低いことがメリットです。
一方で、YAMLを使用しているために複雑な処理を書きづらくなっています。
導入した背景
インスタンス構築を行う際、
手動でミドルウェアのインストールや設定変更をすると時間がかかります。
また、作業手順書は存在するものの人が作業するため、人的ミスが発生する可能性があります。
実際に、「バージョンが違うミドルウェアがインストールされていた」「サービス自動起動の有効化・無効化が社内標準通りの設定になっていなかった」
などの弊害がありました。
そこで構成管理ツールを活用することでミドルウェアのインストール・設定の自動化を行い、作業効率の向上と人的ミスをなくすことを目指しました。
構成管理ツールの中でAnsibleを選んだ理由としては、
以下3点が挙げられます。
- 初期構築のほとんどがミドルウェアのインストールであり、複雑な処理が不要である。
- エージェントのインストール・設定が不要であり、導入コストが低い。
- YAMLでの記述であるため、社内で理解できる人が多い。
環境情報
Anbile core 2.15.9
Python 3.10.12
pip 22.0.2
構成図
まず、Google Cloud で Ansible用のプロジェクトを作成しました。
その後、Ansible用のサービスアカウントを割り当てたインスタンスを構築し、そのインスタンスにAnsibleをインストールしました。
Ansibleインスタンスから対象となっているインスタンスに接続するために、SSHプロトコルを使用します。
弊社ではGoogle Cloud で提供されている「Identity-Aware Proxy(IAP)」というサービスを利用してCompute Engineを保護しています。
そのため、Ansible サービス アカウントを認証させてから対象のインスタンスに接続します。

事前準備
それでは、今回の構成でAnsible を使用できるように設定していきます。
接続するために必要なことは以下4つです。
- Ansible のインストール
- Ansibleのプラグインのインストール
- サービスアカウントに対してIAMの設定
- Ansibleファイルの設定
Ansible のインストール
コマンドを実行するだけなので、具体的なコマンドは省略します。
お使いのOSに合わせて以下のドキュメントを参考にインストールします。
https://docs.ansible.com/ansible/2.9_ja/installation_guide/intro_installation.html
Ansible のプラグインのインストール
Ansible のベストプラクティスとして、
クラウドプラットフォームを使用する場合、
Dynamic Inventory を使用することが推奨されています。
Ansible をインスタンスにインストールしただけでは、Dynamic Inventory を Google Cloud で使用することはできません。
使用するためには、Google Cloudに接続するためのプラグインが提供されているため、それをインストールする必要があります。
まず、事前準備として、
そのプラグインを使用するために、Pythonのモジュールをインストールします。
pip install requests google-auth
その後、Google Cloudのプラグインをインストールします。
ansible-galaxy collection install google.cloud
https://docs.ansible.com/ansible/latest/collections/google/cloud/gcp_compute_inventory.html
https://docs.ansible.com/ansible/2.9_ja/scenario_guides/guide_gce.html
サービスアカウントに対してIAMの設定
Ansible がインストールされているインスタンスが対象のインスタンスにアクセスできるように、サービスアカウントにIAMを設定する必要があります。
今回は事前定義ロールを使用し、下記4つのロールをサービスアカウントに付与しました。
- IAPで保護されたトンネルユーザー
- Compute ネットワーク 閲覧者
- Compute OS 管理者ログイン
- サービス アカウント ユーザー
Ansibleファイルの設定
ディレクトリ構成
下記のようなディレクトリ構成にしました。

ansible.conf
inventory に記述している「enable_plugins」は、Google Cloudのプラグインを使用するために必須で書かなければなりません。
それ以外の記述は必須ではありません。
今回は、共通の処理を記述する「common」ディレクトリにPlaybookを配置しているため、
「defaults」でパスを通すようにしています。
[defaults]
roles_path = ../common/roles
[inventory]
enable_plugins = gcp_compute
[ssh_connection]
private_key_file = ~/.ssh/your_key
gcp.yml
公式ドキュメントでは、「auth_kind」に「serviceaccount」が指定されていますが、
今回はインスタンスに割り当てたAnsible用のサービスアカウントを使用したいため、
「auth_kind」は「machineaccount」を指定しています。
plugin: gcp_compute
#GCPプロジェクトID
projects:
- test-project
auth_kind: machineaccount
groups:
gce_instance: yes
service_account_email: default
hostnames:
- name
group_vars/all.yml
Ansible には、 group という考え方があり、
Playbook を実行する対象のサーバーをグループ化することができます。
group_vars ディレクトリは、グループ化したインスタンスに特定の変数を設定することができます。
今回は全てのインスタンスに対して共通で使用する変数を設定したいため、
all.yml を作成し、以下の内容を記述します。
「ansible_ssh_common_args」「ansible_connection」はIAPの保護がかかっているインスタンスにSSH接続をするために必要です。
それ以外は、使用している環境に合わせて設定してください。
ansible_ssh_common_args: "-o ProxyCommand='gcloud compute start-iap-tunnel {{ inventory_hostname }} 22 --listen-on-stdin --zone {{ zone }} --project {{ hostvars[inventory_hostname]['project'] }}'"
ansible_connection: ssh
ansible_user: "Ansible Service Account User"
ansible_ssh_private_key_file: ~/.ssh/your_key
host_vars
host_vars ディレクトリは、接続するインスタンスに対して個別で変数を割り当てるときに使用します。
今回は、ミドルウェアをインストールするときのバージョン指定で一部使用しました。
接続確認
基本的にどんなPlayBookを用意しても問題ないのですが、
今回は「connection_test.yml」という Playbook に ls コマンドを使用する 処理を記述して確認します。
connection_test.yml
- hosts: all
roles:
- role: connection_test
roles/connection_test
- name: ls command
ansible.builtin.command:
cmd: ls
接続確認ができ、無事に ls コマンドが実行できていれば、
あとは自動化したい処理を Playbook に記述していくだけです。
ここでは説明しませんが、
「ロール」を使用することで処理を再利用することができ、より管理しやすくなります。
社内で行った自動化事例
最後に、社内で用意したPlaybookの一覧を紹介します。
社内では、初期構築時に以下の作業を行っています。
・セキュリティや監視関連のエージェントインストールおよび設定
・gcsfuse のインストール
・タイムゾーンの設定
・再起動
・Web サーバーソフトのインストール
・Git, PHP 等のインストール
以前は初期構築作業に30分〜1時間程度かかっていましたが、
これらの Playbook を用意することで、「host_vars」で変数さえ設定すればインストール作業が完了し、実作業時間は10分程度になりました。
終わりに
最後まで読んでくださってありがとうございました。
社内ではまだまだ自動化できるものが多くあると感じているので、
今後は初期構築だけでなくいろいろとチャレンジしていきたいと思います。
レイスシステムソリューションズ株式会社のソフトウェア開発や、
採用に関するお問い合わせについては、下記のリンクにてお問い合わせください。
-1.png)



