俺式チートシート（Ansible 編）

## 概要
自分のための備忘録。
色んな技術を幅広く触りすぎて「あれ？なんだっけ？どう書くっけ？」現象が尽きないので、概要レベルから残しておくチートシートの **Ansible** 編

|項目|説明|
|---|---|
|技術名|Ansible（アンシブル）|
|概要|環境構築を自動化できるオーケストレーションツール<br>一連の処理を YAML 定義して使う<br>Chef や Puppet と違い「エージェント」が不要<br>Python が入ってれば OK

### 関連用語
Ansible 利用にあたって知るべき言葉たち

|言葉|意味|
|---|---|
|Playbook|一連処理を定義した YAML ファイル<br>手順ごとにファイル分けてもOK|
|Task|Playbook 内で実行される個別の操作・処理|
|Module|ファイル操作とかユーザ管理とかしてくれる公式関数|
|Role|再利用可能なパッケージされたタスク集|
|Host|Ansible が入ってる側。操作する側|
|Target|管理対象。操作される側。「Client」とも|
|Control node|Ansible 的に「Host」の本来の正しい言い方|
|Managed node|Ansible 的に「Target」の本来の正しい言い方|
|Inventory|ホスト情報とか書くやつ|
|Variable|タスクやプレイブックで使える変数|
|Template|動的に生成される設定ファイル。Jinja2 エンジンを使用|
|Handler|特定の条件でのみ実行されるタスク（再起動とか）|
|Idempotency|「冪等性（べきとうせい）」という意味<br>何回やっても同じ結果になること。コレを守れ！|
|Fact|ターゲットのホスト情報（IPとか、OSとか）<br>Facts変数というところに格納される|

## コマンド集

### Ansible のインストール

```bash
# Homebrew (macOS, Linux)
brew install ansible

# Red Hat系 (CentOS, RHEL)
sudo yum install ansible

# Debian系 (Ubuntu)
sudo apt-get install ansible

# Pythonのpipを使用する場合
pip install ansible
```

### 基本コマンド
```bash
# Ansibleのバージョン確認
ansible --version

# インベントリファイルの内容を表示
ansible-inventory --list -i inventory

# 指定のホストにPingを送信
ansible all -m ping -i inventory

# モジュールを使用してコマンドを実行
ansible all -m shell -a 'uptime' -i inventory
```

## ディレクトリ構成
ベーシックなフォルダ・ファイル構成（再利用性とメンテナンス性を考慮）

```bash
ansible_project/
├── ansible.cfg
├── inventory
├── playbooks/
│   ├── site.yml
│   ├── webservers.yml
│   └── dbservers.yml
├── roles/
│   ├── common/
│   │   ├── tasks/
│   │   │   └── main.yml
│   │   ├── handlers/
│   │   │   └── main.yml
│   │   ├── templates/
│   │   ├── files/
│   │   ├── vars/
│   │   │   └── main.yml
│   │   ├── defaults/
│   │   │   └── main.yml
│   │   ├── meta/
│   │   │   └── main.yml
│   │   └── README.md
│   └── webserver/
│       ├── tasks/
│       │   └── main.yml
│       ├── handlers/
│       │   └── main.yml
│       ├── templates/
│       │   └── nginx.conf.j2
│       ├── files/
│       ├── vars/
│       │   └── main.yml
│       ├── defaults/
│       │   └── main.yml
│       ├── meta/
│       │   └── main.yml
│       └── README.md
└── group_vars/
    ├── all.yml
    └── webservers.yml
```

#### 各ディレクトリ・ファイルの説明

- ansible.cfg: Ansibleの設定ファイル。インベントリファイルの場所やSSH設定などを指定
- inventory: インベントリファイル。管理対象のホストを定義
- playbooks/: プレイブックを格納するフォルダ。複数のプレイブックを用途別に整理
  - site.yml: メインプレイブック。全体のタスクを定義
  - webservers.yml: ウェブサーバに関連するタスクを定義するプレイブック
  - dbservers.yml: データベースサーバに関連するタスクを定義するプレイブック
- roles/: 役割（ロール）を格納するフォルダ。共通タスクや特定の機能に関連するタスクを役割ごとに整理
  - common/: すべてのホストに共通するタスクを定義するロール
    - tasks/: タスクを定義するYAMLファイルを格納
    - main.yml: メインタスクファイル
    - handlers/: ハンドラーを定義するYAMLファイルを格納
    - main.yml: メインハンドラーファイル
    - templates/: テンプレートファイル（Jinja2形式）を格納
    - files/: コピーするファイルを格納
    - vars/: 変数を定義するYAMLファイルを格納
    - main.yml: メイン変数ファイル
    - defaults/: デフォルト変数を定義するYAMLファイルを格納
    - main.yml: メインデフォルト変数ファイル
    - meta/: メタデータを定義するYAMLファイルを格納
    - main.yml: メインメタデータファイル
    - README.md: ロールの説明書
  - webserver/: ウェブサーバに関連するタスクを定義するロール
上記のcommon/と同様の構成
- group_vars/: グループごとの変数を定義するフォルダ
  - all.yml: すべてのホストに適用される変数
  - webservers.yml: webserversグループに適用される変数

## ファイル構成
各ファイル内の構成サンプル

### インベントリファイル (inventory)

```ini
# Simple Inventory
[webservers]
web1.example.com
web2.example.com

[dbservers]
db1.example.com
db2.example.com

# Advanced Inventory with Variables
[webservers]
web1.example.com ansible_user=ubuntu ansible_ssh_private_key_file=~/.ssh/id_rsa
web2.example.com ansible_user=ubuntu ansible_ssh_private_key_file=~/.ssh/id_rsa

[dbservers]
db1.example.com ansible_user=root ansible_password=password
db2.example.com ansible_user=root ansible_password=password
```

### Ansible コンフィギュレーション (ansible.cfg)

```ini
[defaults]
inventory = ./inventory
remote_user = ansible
host_key_checking = False
timeout = 30
```

### プレイブックの基本
```yaml
---
- name: Example Playbook
  hosts: webservers
  become: true
  tasks:
    - name: Install Nginx
      apt:
        name: nginx
        state: present
```

## まとめ
とりあえずポン出し。後で加筆修正する可能性、大いにあり。