コンテンツにスキップ

Ansible

はじめに

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


01. Ansible の仕組み

アーキテクチャ

Ansible は、コントロールノード (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 サーバー

...

ポリリポジトリの場合、以下とする。

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