コンテンツにスキップ

Ansible

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


01. Ansibleの仕組み

アーキテクチャ

Ansibleは、コントロールノード (デプロイサーバー) と管理対象ノード (デプロイ先サーバー) から構成される。

コントロールノードと管理対象ノードに当たるサーバー (物理サーバー、仮想サーバー) をセットアップしておき、コントロールノードにAnsibleをインストールする。

もし、ローカルマシンでansibleコマンドを実行する場合は、ローカルマシンがコントロールノードに相当する。

また、管理対象ノードとしてサーバーには実際のアプリケーションもデプロイされる。

コントロールノード上のAnsibleは、管理対象ノードのサーバーにSSH公開鍵認証を実行し、設定ファイルに基づいたプロビジョニングを実行する。

設定ファイルの実装の変更によって、プロセスの再起動を伴うプロビジョニングが実行される場合、ダウンタイムを考慮する必要がある。

ansible


ユースケース

プロビジョニングによりサーバー (物理サーバー、仮想サーバー) とコンテナを作成できる。

ただし、Ansibleは仮想サーバーのプロビジョニングのために使用することが多い。


02. セットアップ

インストール

▼ aptリポジトリから

$ sudo apt -y install sshpass
$ sudo apt -y install python3-pip
$ pip3 install ansible


03. 設計規約

ディレクトリ構成規約

group_varsディレクトリの構成

repository/
├── playbook.yml
├── group_vars/
│   ├── tes/ # テスト環境
│   │   └── foo.yml
│   │
│   ├── stg/ # ステージング環境
│   └── prd/ # 本番環境

...

host_varsディレクトリの構成

repository/
├── playbook.yml
├── host_vars/
│   ├── bar_host.yml
│   └── baz_host.yml

inventoriesディレクトリの構成

repository/
├── playbook.yml
├── inventories/
│   ├── tes/ # テスト環境
│   │   ├── hosts_a.yml # 冗長化されたサーバーa
│   │   ├── hosts_c.yml # 冗長化されたサーバーc
│   │   └── host_vars.yml
│   │
│   ├── stg/ # ステージング環境
│   └── prd/ # 本番環境

...

rolesディレクトリの構成

repository/
├── playbook.yml
├── roles/
│   ├── app/ # appサーバー
│   │   ├── defaults/ # rolesディレクトリ内で使用するデフォルト変数を配置する。
│   │   │   └── foo.yml
│   │   │
│   │   ├── files/ # 管理対象ノードにコピーするファイルを配置する。
│   │   │   └── foo.conf
│   │   │
│   │   ├── handlers/
│   │   │   └── main.yml
│   │   │
│   │   ├── meta/
│   │   │   └── main.yml
│   │   │
│   │   ├── tasks/ # プロビジョニング時に実行するコマンドを配置する。
│   │   │   └── main.yml
│   │   │
│   │   ├── templates/ # テンプレートを配置する。
│   │   │   └── foo.conf.j2
│   │   │
│   │   └── vars/ # rolesディレクトリ内で使用する上書き変数を配置する。
│   │       └── main.yml
│   │
│   ├── shared/ # 共通
│   ├── db/ # dbサーバー
│   └── web/ # webサーバー

...


命名規則


04. 連携

Vault

Ansibleの設定値を暗号化し、キーバリュー型ストアとして管理する。

Ansibleの実行時にパスワードを要求し、これが正しければ復号化し、設定値として出力する。

パスワード自体をファイル上でバージョン管理したい場合、暗号化ツール (例:SOPS、kubesec) で暗号化することもできる。

ansible_ansible-vault