クラウドエンジニアブログ

Azure Pipelines で実現する IaC - 第 4 回 OS・MW コンフィグレーション

human02

齋藤 恭平

こんにちは!ねこ好きの齋藤です。
最終回となる今回は、Ansible を使用した OS およびミドルウェアのコンフィグレーションの自動化についてご紹介します。



1. はじめに

シナリオの詳細な説明に入る前に今回使用する技術要素および概要について簡単に説明します。

1-1. Ansible とは

本記事で使用する Ansible とは、OS およびミドルウェアの設定を自動化するためのツールです。
Ansible は設定ファイルにあるべき姿を記述することで、設定ファイルの内容に基づいて下記のような設定の変更を行います。(一例)

  • OS 内の操作 (パッケージ インストールやユーザーの作成など)
  • ファイル操作 (ファイルの新規作成やコピー、設定変更など)
  • データベース操作 (RDBMS のユーザーやテーブルの作成など)

レイヤー イメージ図の赤実線で囲まれたコンフィグレーションを主な対象とするツールです。
※第 2 回で取り上げた ARM Template に比べ適用範囲は狭いですが、Azure リソースの作成も可能です。

1-1-1



同様のツールとして、Ansible のほかに ChefPuppet があります。
Ansible は上記のツールと比べて後発のツールですが、管理対象のサーバーにエージェントをインストールする必要がない、エージェントレスという大きな特徴があります。
エージェントが必要な場合、エージェントをインストールする作業をどのように自動化するのか、という問題が出てくるため、エージェントレスという特徴は大きなメリットになります。

Ansible の構成は、下記の図のように管理サーバーと管理対象サーバーに分かれます。

1-1-2



管理サーバーは、SSH や WinRM を使用して管理対象サーバーを操作するため、エージェントレスを実現しています。

1-2. 今回のシナリオの構成

Azure Pipelines で Ansible を動かすためには、大きく下記の二つの考慮事項があります。

  1. Pipelines エージェントのセットアップ (Microsoft が用意した Microsoft Hosted Agent を使用するか、自身で用意する Self-hosted Agent を使用するか)
  2. Job の作成 (どのように Azure Pipelines の Job を作成するか)

今回のシナリオでは、下記の方法で実装します。

左右にスクロールしてご覧ください。

No. 考慮事項 実装方法 理由
1. Pipelines エージェントのセットアップ Self-hosted Agent OS・ミドルウェア レイヤーのテストを行う Serverspec や Infrataster を利用できるようにするため
2. Job の作成 Marketplace の Ansible を使用する ほかの手段である Bash スクリプトを使用する方法に比べ、導入の手間が少ないため

上記を踏まえて、今回の構成は下図のようになります。
※今回、Self-hosted Agent を使用するため、事前にエージェント サーバー用の仮想マシンを作成しておく必要があります。

1-2-1



1-3. 今回のシナリオ

今回のシナリオは下記の流れで進めていきます。

  1. エージェント サーバーに Ansible をインストール
  2. エージェント サーバーに Self-hosted Agent をインストール
  3. Ansible Playbook を Azure Repos に Push
  4. Pipeline を作成

前置きが長くなってしまいましたが、ここからは実際に実装する流れを追っていきます。


2. エージェント サーバーに Ansible をインストール

エージェント サーバーに Ansible をインストールします。

Ansible をインストール



Ansible のインストールは下記の流れで実施します。

  1. エージェント サーバーに Ansible をインストール
  2. 管理対象サーバーへの接続情報登録
  3. 管理対象サーバーへの動作確認

2-1. エージェント サーバーに 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"
}


2-2. 管理対象サーバーへの接続情報登録

エージェント サーバーから管理対象サーバーへの操作は、SSH を使用するため、SSH 接続の準備を行います。

管理対象サーバーの SSH 認証用の秘密鍵をエージェント サーバーの任意のパスに保存します。

秘密鍵の Permission を 600 に変更します。(ファイル名とパスは適宜変更してください)


$ chmod 600 ~/.ssh/ssh.key

設定ファイル (/etc/ansible/ansible.cfg) を下記のように編集して、管理対象サーバーへの初回接続時のフィンガー プリントの確認を無効化します。


# 変更前
#host_key_checking = False

# 変更後
host_key_checking = False


2-3. 管理対象サーバーへの動作確認

エージェント サーバーから管理対象サーバーへの動作確認を行います。

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"
}



3. エージェントに Self-hosted Agent をインストール

エージェント サーバーに Self-hosted Agent をインストールします。

Self-hosted Agent をインストール



Self-hosted Agent のインストールは下記の流れで実施します。

  1. [Azure DevOps] PAT の作成
  2. [Azure DevOps] Agent pool の作成
  3. [エージェント サーバー] Self-hosted Agent のインストール

3-1. PAT の作成

ここでは、Self-hosted Agent のインストールの際に必要となるトークン (PAT) を作成します。
この作業は、Azure DevOps (https://dev.azure.com/{your-devops-organization}) で実施します。

Azure DevOps の画面で、[User Settings] をクリックし、[Personal access tokens] をクリックします。

3-1-1



[Personal access token] の管理画面で、[New Token] をクリックします。

3-1-2



[Name] に任意の名前を入力し、[Scopes] で [Agent Pools] への [Read & manage] 権限のみを付与し、[Create] をクリックします。

3-1-3



PAT の作成完了画面が表示されたら、トークンをメモし、[Close] をクリックします。

3-1-4



3-2. Agent pool の作成

ここでは、Self-hosted Agent のグループである Agent pool を作成します。
この作業は、PAT の作成に引き続き、Azure DevOps から実施します。

Azure DevOps のトップ画面で [Organization settings] をクリックします。

3-2-1



[Pipelines] 配下の [Agent pools] をクリックします。

3-2-2



[Agent pools] 画面で [Add pool] をクリックします。

3-2-3



[Name] に任意の名前を入力し、その他をデフォルトのまま [Create] をクリックします。

3-2-4



[Agent pools] 画面で Agent pool が追加されたことを確認します。

3-2-5



3-3. Self-hosted Agent のインストール

ここでは、エージェント サーバーに Self-hosted Agent をインストールします。
この作業は最初に Azure DevOps で Self-hosted Agent のインストーラーの URL を入手後、エージェント サーバーで作業を実施します。

[Agent pools] 画面で 3-2 で追加した Agent pool をクリックします。

3-3-1



追加した Agent pool の画面で、[New agent] をクリックします。

3-3-2



[Get the agent] 画面で Linux の Agent のインストーラーの URL を入手します。

3-3-3



上記 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] になっていることを確認します。

3-3-4



4. Ansible Playbook を Azure Repos に Push

今回のシナリオでは Azure Repos に Push した Ansible Playbook (Ansible の設定ファイル) に基づいて OS およびミドルウェアの設定を行うため、Azure Repos に必要なファイルを Push します。

Azure Repos に Push



今回のシナリオで使用するサンプルの Ansible Playbook は、下記のリンクからダウンロードできます。

Sample Files
ダウンロード リンク

※スマートフォンからダウンロードした場合、機種によっては正常に閲覧できないことがあります。その場合は、PC のブラウザからダウンロードしてください。

この Ansible Playbook では、下記のような設定を行います。

  • auditd のインストールおよび設定
  • pam および sudoers の設定
  • bashrc の history 設定
  • syslog 設定
  • ufw の設定

この Ansible Playbook を使用する場合、ダウンロードした hosts ファイルに記述された接続先を変更して、Azure Repos に Push してください。

5. Pipeline 作成

最後の手順である Pipeline 作成を行います。

Pipeline 作成



Pipeline 作成は下記の流れで実施します。

  1. Ansible Extension の追加
  2. Pipeline の作成
  3. Pipeline の実行

5-1. Ansible Extension の追加

ここでは、Ansible を使用したタスクを簡単に作成するための Extension を追加します。

Azure DevOps のトップ画面で [Organization settings] をクリックします。

5-1-1



[General] 配下の [Extensions] をクリックします。

5-1-2



[Extensions] 画面で [Browse marketplace] をクリックします。

5-1-3



[Marketplace] サイトの検索ウィンドウで [Ansible] を入力して表示された Extension をクリックします。

5-1-4



[Ansible] Extension の画面で [Get it free] をクリックします。

5-1-5



どの Azure DevOps 組織に追加するかを選択し、[Install] をクリックします。

5-1-6



Azure DevOps の [Extensions] 画面で [Ansible Extension] が追加されていることを確認します。

5-1-7



5-2. Pipeline の作成

ここでは、Ansible を使用して OS 設定を行う Pipeline を追加します。

Azure DevOps のプロジェクト画面で [Pipelines] をクリックし、[Releases] をクリックします。

5-2-1



[New] をクリックし、[New release pipeline] をクリックします。

5-2-2



テンプレート選択画面で、[Empty job] をクリックします。

5-2-3



[Pipeline] 画面で [Add an artifact] をクリックします。

5-2-4



[source type] で [Azure Repos Git] をクリックして、[Project]、[Source repository] を選択し、[Add] をクリックします。

5-2-5



[Pipeline] 画面で [Stage] をクリックします。

5-2-6



[Stage] 画面で [Agent job] をクリックし、[Agent pool] で 2-2 で作成した Azure pool を選択します。

5-2-7



[Agent job] の [+] をクリックし、タスクを追加します。検索ウィンドウで [ansible] を検索し、[Add] をクリックします。

5-2-8



Ansible タスクの画面で、下記のように設定を行います。

5-2-9


  • [Playbook] 配下の File path : [...] をクリックし site.yml を選択
  • [Inventory] 配下の Inventory location : [File] を選択
  • [Inventory] 配下の File path : [...] をクリックし hosts を選択

[Save] をクリックします。

5-2-10



5-3. Pipeline の実行

本記事の集大成として、Pipeline を実行します。
設定ができていれば、管理対象サーバーの OS 設定が変更されます。

前回、[Save] を行った画面で、[Create release] をクリックします。

5-3-1



[Create new release] 画面で初期設定のまま [Create] をクリックします。

5-3-2



しばらく待ったあと、[Releases] の画面で実行結果を確認します。

5-3-3



[Succeeded] と表示されていれば、無事成功です!

5-3-4



6. まとめ

今回は Ansible による OS の設定のみのご紹介になりましたが、Ansible 自体はミドルウェアの設定にも対応しています。
また Self-hosted Agent を使用したので、ServerspecInfrataster などを使用して、テストの実行をすることも可能です。

これにて今回のシリーズは以上で終了です!
Have a good Azure life !!!



関連ページ

Azure Pipelines で実現する IaC - 第 1 回 Introduction
Azure Pipelines で実現する IaC - 第 2 回 Azure リソース プロビジョニング
Azure Pipelines で実現する IaC - 第 3 回 Azure リソース テスト

お問い合わせ

製品・サービスに関するお問い合わせはお気軽にご相談ください。

ピックアップ

セミナー情報
クラウドエンジニアブログ
clouXion
メールマガジン登録