こんにちは!ねこ好きの齋藤です。
最終回となる今回は、Ansible を使用した OS およびミドルウェアのコンフィグレーションの自動化についてご紹介します。
シナリオの詳細な説明に入る前に今回使用する技術要素および概要について簡単に説明します。
本記事で使用する Ansible とは、OS およびミドルウェアの設定を自動化するためのツールです。
Ansible は設定ファイルにあるべき姿を記述することで、設定ファイルの内容に基づいて下記のような設定の変更を行います。(一例)
レイヤー イメージ図の赤実線で囲まれたコンフィグレーションを主な対象とするツールです。
※第 2 回で取り上げた ARM Template に比べ適用範囲は狭いですが、Azure リソースの作成も可能です。
同様のツールとして、Ansible のほかに Chef や Puppet があります。
Ansible は上記のツールと比べて後発のツールですが、管理対象のサーバーにエージェントをインストールする必要がない、エージェントレスという大きな特徴があります。
エージェントが必要な場合、エージェントをインストールする作業をどのように自動化するのか、という問題が出てくるため、エージェントレスという特徴は大きなメリットになります。
Ansible の構成は、下記の図のように管理サーバーと管理対象サーバーに分かれます。
管理サーバーは、SSH や WinRM を使用して管理対象サーバーを操作するため、エージェントレスを実現しています。
Azure Pipelines で Ansible を動かすためには、大きく下記の二つの考慮事項があります。
今回のシナリオでは、下記の方法で実装します。
左右にスクロールしてご覧ください。
No. | 考慮事項 | 実装方法 | 理由 |
---|---|---|---|
1. | Pipelines エージェントのセットアップ | Self-hosted Agent | OS・ミドルウェア レイヤーのテストを行う Serverspec や Infrataster を利用できるようにするため |
2. | Job の作成 | Marketplace の Ansible を使用する | ほかの手段である Bash スクリプトを使用する方法に比べ、導入の手間が少ないため |
上記を踏まえて、今回の構成は下図のようになります。
※今回、Self-hosted Agent を使用するため、事前にエージェント サーバー用の仮想マシンを作成しておく必要があります。
今回のシナリオは下記の流れで進めていきます。
前置きが長くなってしまいましたが、ここからは実際に実装する流れを追っていきます。
エージェント サーバーに Ansible をインストールします。
Ansible のインストールは下記の流れで実施します。
まずは Ansible をインストールします。
Ansible のインストール方法は、公式サイトの Installation Guide に記載があります。
今回の環境は Ubuntu Server で構築したため、Ubuntu の場合のインストール手順に従い、下記のコマンドによってインストールしました。
$ sudo apt update
$ sudo apt install software-properties-common
$ sudo apt-add-repository --yes --update ppa:ansible/ansible
$ sudo apt install ansible
インストールが完了したら、動作確認を行います。
$ ansible localhost -m ping
下記のように SUCCESS と表示されたら成功です。
localhost | SUCCESS => {
"changed": false,
"ping": "pong"
}
エージェント サーバーから管理対象サーバーへの操作は、SSH を使用するため、SSH 接続の準備を行います。
管理対象サーバーの SSH 認証用の秘密鍵をエージェント サーバーの任意のパスに保存します。
秘密鍵の Permission を 600 に変更します。(ファイル名とパスは適宜変更してください)
$ chmod 600 ~/.ssh/ssh.key
設定ファイル (/etc/ansible/ansible.cfg) を下記のように編集して、管理対象サーバーへの初回接続時のフィンガー プリントの確認を無効化します。
# 変更前
#host_key_checking = False
# 変更後
host_key_checking = False
エージェント サーバーから管理対象サーバーへの動作確認を行います。
Ansible の管理対象サーバーの一覧を定義するファイルを作成します。 (今回はホーム ディレクトリ直下に ansible-hosts というファイル名で保存します。接続先等のパラメーターは適宜変更してください)
[server]
server1 ansible_host=server1.japaneast.cloudapp.azure.com
[server:vars]
ansible_port=22
ansible_user=svradmin
ansible_ssh_private_key_file=~/.ssh/ssh.key
ファイルの保存が完了したら動作確認を行います。
$ ansible all -i ansible-hosts -m ping
下記のように SUCCESS と表示されたら成功です。
ubuntu | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
エージェント サーバーに Self-hosted Agent をインストールします。
Self-hosted Agent のインストールは下記の流れで実施します。
ここでは、Self-hosted Agent のインストールの際に必要となるトークン (PAT) を作成します。
この作業は、Azure DevOps (https://dev.azure.com/{your-devops-organization}) で実施します。
Azure DevOps の画面で、[User Settings] をクリックし、[Personal access tokens] をクリックします。
[Personal access token] の管理画面で、[New Token] をクリックします。
[Name] に任意の名前を入力し、[Scopes] で [Agent Pools] への [Read & manage] 権限のみを付与し、[Create] をクリックします。
PAT の作成完了画面が表示されたら、トークンをメモし、[Close] をクリックします。
ここでは、Self-hosted Agent のグループである Agent pool を作成します。
この作業は、PAT の作成に引き続き、Azure DevOps から実施します。
Azure DevOps のトップ画面で [Organization settings] をクリックします。
[Pipelines] 配下の [Agent pools] をクリックします。
[Agent pools] 画面で [Add pool] をクリックします。
[Name] に任意の名前を入力し、その他をデフォルトのまま [Create] をクリックします。
[Agent pools] 画面で Agent pool が追加されたことを確認します。
ここでは、エージェント サーバーに Self-hosted Agent をインストールします。
この作業は最初に Azure DevOps で Self-hosted Agent のインストーラーの URL を入手後、エージェント サーバーで作業を実施します。
[Agent pools] 画面で 3-2 で追加した Agent pool をクリックします。
追加した Agent pool の画面で、[New agent] をクリックします。
[Get the agent] 画面で Linux の Agent のインストーラーの URL を入手します。
上記 URL からインストーラーをダウンロードし、エージェント サーバーにコピーします。
エージェント サーバーで、Self-hosted Agent 用のディレクトリの作成、所有者変更、インストーラーの解凍を行います。
※所有者は Ansible を動かすユーザーにします。適宜変更してください。
$ sudo mkdir /opt/vsagent && cd /opt/vsagent
$ sudo chown svradmin:svradmin /opt/vsagent
$ tar zxvf ~/vsts-agent-linux-x64-2.165.2.tar.gz
解凍後、config.sh を実行し、プロンプトに従って設定を行います。
$ ./config.sh
Enter (Y/N) Accept the Team Explorer Everywhere license agreement now? (press enter for N) > Y
Enter server URL > https://dev.azure.com/{your-devops-organization}
Enter authentication type (press enter for PAT) > PAT
Enter personal access token > ****************************************************
Enter agent pool (press enter for default) > ansible
Enter agent name (press enter for agent00) > ansible00
Enter work folder (press enter for _work) > /opt/vsagent
設定完了後、systemctl への登録とサービスの起動を行います。
$ sudo ./svc.sh install
$ sudo ./svc.sh start
Azure DevOps のエージェント一覧の画面で追加されていることおよび [Online] になっていることを確認します。
今回のシナリオでは Azure Repos に Push した Ansible Playbook (Ansible の設定ファイル) に基づいて OS およびミドルウェアの設定を行うため、Azure Repos に必要なファイルを Push します。
今回のシナリオで使用するサンプルの Ansible Playbook は、下記のリンクからダウンロードできます。
※スマートフォンからダウンロードした場合、機種によっては正常に閲覧できないことがあります。その場合は、PC のブラウザからダウンロードしてください。
この Ansible Playbook では、下記のような設定を行います。
この Ansible Playbook を使用する場合、ダウンロードした hosts ファイルに記述された接続先を変更して、Azure Repos に Push してください。
最後の手順である Pipeline 作成を行います。
Pipeline 作成は下記の流れで実施します。
ここでは、Ansible を使用したタスクを簡単に作成するための Extension を追加します。
Azure DevOps のトップ画面で [Organization settings] をクリックします。
[General] 配下の [Extensions] をクリックします。
[Extensions] 画面で [Browse marketplace] をクリックします。
[Marketplace] サイトの検索ウィンドウで [Ansible] を入力して表示された Extension をクリックします。
[Ansible] Extension の画面で [Get it free] をクリックします。
どの Azure DevOps 組織に追加するかを選択し、[Install] をクリックします。
Azure DevOps の [Extensions] 画面で [Ansible Extension] が追加されていることを確認します。
ここでは、Ansible を使用して OS 設定を行う Pipeline を追加します。
Azure DevOps のプロジェクト画面で [Pipelines] をクリックし、[Releases] をクリックします。
[New] をクリックし、[New release pipeline] をクリックします。
テンプレート選択画面で、[Empty job] をクリックします。
[Pipeline] 画面で [Add an artifact] をクリックします。
[source type] で [Azure Repos Git] をクリックして、[Project]、[Source repository] を選択し、[Add] をクリックします。
[Pipeline] 画面で [Stage] をクリックします。
[Stage] 画面で [Agent job] をクリックし、[Agent pool] で 2-2 で作成した Azure pool を選択します。
[Agent job] の [+] をクリックし、タスクを追加します。検索ウィンドウで [ansible] を検索し、[Add] をクリックします。
Ansible タスクの画面で、下記のように設定を行います。
[Save] をクリックします。
本記事の集大成として、Pipeline を実行します。
設定ができていれば、管理対象サーバーの OS 設定が変更されます。
前回、[Save] を行った画面で、[Create release] をクリックします。
[Create new release] 画面で初期設定のまま [Create] をクリックします。
しばらく待ったあと、[Releases] の画面で実行結果を確認します。
[Succeeded] と表示されていれば、無事成功です!
今回は Ansible による OS の設定のみのご紹介になりましたが、Ansible 自体はミドルウェアの設定にも対応しています。
また Self-hosted Agent を使用したので、Serverspec や Infrataster などを使用して、テストの実行をすることも可能です。
これにて今回のシリーズは以上で終了です!
Have a good Azure life !!!
関連ページ
Azure Pipelines で実現する IaC - 第 1 回 Introduction |