grasys blog

Google Cloud でAnsible をスモールスタートしてみる

初めまして i10 と申します。もしかしたら、この名前に見覚えのある方はお久しぶりかもです。かれこれ7年くらい前まで渋谷でインフラエンジニアをやっておりました。今は恵比寿でインフラエンジニアをやっております。いわゆる復帰勢というやつです。

先日、一ヶ月先輩のmoridy さんがAnsible に関する入門記事を書いておりましたが、便乗して自分もAnsible に関する記事を書こうと思います。

Ansible のユースケースの一つとして、パブリッククラウド上に作成したVMインスタンスにパッケージや設定などを入れ込む作業(以下、構成管理)を自動化させ、複数台展開や一括での設定変更を容易にさせることが挙げられます。今回はそのパブリッククラウドとして弊社がよく取り扱うGoogle Cloud に焦点を当てたいと思います。

Ansible を動かすサーバをどこに置くのか

構成管理される側のVMインスタンスに下準備としてあらかじめ設定や追加パッケージ等(いわゆるエージェント)が要らないエージェントレスな構成管理ツール = Ansible ですが、一方で実行するためのサーバは必要になってきます。

構成管理される側のVMインスタンスと同じVPC(ないし疎通が取れるネットワーク)にAnsible 用のVMインスタンスを設置したり、個人管理など比較的規模が小さければ通信経路を確保した上でローカル環境にAnsible をインストールして直接実行する等、さまざまな設置パターンが考えられます。今回はGoogle Cloud の機能の一つであるCloud Shell 上にAnsible 実行環境を置く形をとります。

Google Cloud Shell でAnsible を利用するための準備

Google Cloud Shell では/homeディレクトリに無料の5GBの永続ストレージ(※)がマウントされています。※ ただし、120日間以上アクセスが無いと削除されるので注意が必要です

/homeディレクトリ以外は一時的(エフェメラル)なので、パッケージを追加でインストールするなどの変更は永続されません。具体的には、1時間以上操作がないとCloud Shell のVMが削除され、その際に/home以外の変更差分も破棄され元に戻ります。

今回取り扱うAnsible はCloud Shell にはインストールされていないので次のように手動で毎回インストールするか、

sudo apt update
sudo apt install ansible

継続的にAnsible を使いたい場合は環境のカスタマイズを参考に、ユーザのホームディレクトリ(/home/<ユーザ名>/)直下に.customize_environmentというファイルを作り、次のように書き込みます。

#!/bin/sh
apt update
apt -y install ansible

形式的にはシェルスクリプトではありますが、基本的に手動で実行させて使うものではないのでchmodでの実行権限の付与は不要で、また、管理者権限で自動実行されるものなのでスクリプト中にsudoの付加も不要です。

念のため正しく動作するか確かめるために、次のように手動で管理者権限で実行できるので、手動でインストールした時と同じような挙動をしているか確認できます。

sudo sh $HOME/.customize_environment

上記スクリプトはCloud Shell を起動した際(無操作状態から1時間以上経過していた際)に毎回バックグラウンド実行されることになるので、起動してからインストールされて使用できるようになるまでタイムラグがあります。(自動追加したいパッケージの総数、合算のサイズ等に依存します)

以上の手順でインストールしたAnsible が問題なく起動できるか次のように確認します。

ito@cloudshell:~$ ansible --version
ansible 2.10.8
  config file = None
  configured module search path = ['/home/ito/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3/dist-packages/ansible
  executable location = /usr/bin/ansible
  python version = 3.9.2 (default, Feb 28 2021, 17:03:44) [GCC 10.2.1 20210110]
ito@cloudshell:~$ 

問題なく起動できることを確認できました。※ 何かしら問題があると例外(Exception)が表示されます

それにしても、2.10 って…(広義の)Ansible とAnsible-core(当初名称: Ansible-base)が分離した頃のバージョン…ふ、古い…? いやもしかしたらAnsible の進化が速いのかもしれません。

ito@cloudshell:~$ pip list
Package                               Version
------------------------------------- ------------
~ 中略 ~
ansible-base                          2.10.8
~ 後略 ~

余談として、pip でなるべく新しいバージョンをインストールしたい場合は(virtualenv やvenv などで仮想環境を適宜用意した上で)

pip install ansible requests google-auth

(余談その2) Ansible デカ過ぎ・インストール時間長すぎ、もっとコンパクトに(ansible-core + Google Cloud モジュール)インストールしたい場合は

pip install ansible-core requests google-auth
ansible-galaxy collection install google.cloud

.customize_environmentにapt コマンドの代わりに工夫して入れ込むことが出来れば毎回のインストールのタイムラグがより短くなるかもしれません。上記部分だけをそのまま入れてしまうと管理者ユーザ・権限として実行される都合上、不整合が生じるので参考までにお願いします。一応の動作確認は、手動(一般ユーザ・権限)でvenv と仮想環境を使わない場合とでそれぞれ確認しています。/home以外の環境が永続されないのは、逆に言えば環境汚れを気にせず、お試しで直接インストールして確認ができていいのかもしれません。

Ansible でGoogle Cloud リソースへのアクセスやPlaybook 実行

plugin: gcp_compute
projects:
  - <Ansible で構成管理したいプロジェクト>
auth_kind: machineaccount
hostnames:
  - name
service_account_email: default

上記のようなgcp.yamlを作成し、次のように実行すると

ansible-inventory --list -i gcp.yaml

VMインスタンスやVPCといったGoogle Cloud 上の指定したプロジェクトのインベントリ情報が取得できるかと思います。次のような表示がされる場合、プロジェクト名が間違っていたり権限が無かったりなどにより情報取得に失敗しています。

ito@cloudshell:~$ ansible-inventory --list -i gcp.yaml
{
    "_meta": {
        "hostvars": {}
    },
    "all": {
        "children": [
            "ungrouped"
        ]
    }
}
ito@cloudshell:~$

また、取得したホスト情報を活用して、構成管理したいホストとの疎通の確保やssh 鍵の配置などを済ませ、次のような動作確認用の最小限のPlaybook を書いて

- name: Play test
  hosts: i10-test

ansible-playbookを実行して、問題無く動作することが確認できれば、スモールスタートなAnsible サーバの完成です。

ito@cloudshell:~$ ansible-playbook -i gcp.yaml play.yaml --private-key=.ssh/google_compute_engine

PLAY [Play test] *********************************************************************************************

TASK [Gathering Facts] ***************************************************************************************
ok: [i10-test]

PLAY RECAP ***************************************************************************************************
i10-test                   : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

ito@cloudshell:~$

さいごに

以上の内容と関係ないですが、入社して3ヶ月と半月経った感想ですが、創業時から継ぎ足され続けたHidden のタレのような技術から、数々の最先端な技術のごった煮が恵比寿🍺で味わえる楽しい会社だと思います。


採用情報
お問い合わせ