Ansible チートシート

ハンズオンラボで Ansible を学ぶ

ハンズオンラボと実世界のシナリオを通じて、Ansible インフラストラクチャ自動化を学びます。LabEx は、必須のプレイブック作成、インベントリ管理、モジュール使用、ロール編成を網羅した包括的な Ansible コースを提供します。DevOps ワークフローのための構成管理とインフラストラクチャ自動化を習得します。

インストールとセットアップ

Ubuntu/Debian: apt install ansible

Debian ベースの Linux システムに Ansible をインストールします。

# Ansible リポジトリを追加
sudo apt-add-repository ppa:ansible/ansible
# パッケージリストを更新
sudo apt-get update
# Ansible をインストール
sudo apt-get install ansible
# インストールを確認
ansible --version

CentOS/RHEL: yum install ansible

Red Hat ベースのシステムに Ansible をインストールします。

# EPEL リポジトリをインストール
sudo yum install epel-release -y
# Ansible をインストール
sudo yum install ansible -y
# インストールを確認
ansible --version

macOS: brew install ansible

Homebrew を使用して macOS に Ansible をインストールします。

# Homebrew を使用してインストール
brew install ansible
# インストールを確認
ansible --version

設定:/etc/ansible/ansible.cfg

Ansible の設定とデフォルト値を構成します。

# 現在の設定を表示
ansible-config list
# 有効な設定を表示
ansible-config view
# カスタム設定ファイル
export ANSIBLE_CONFIG=/path/to/ansible.cfg

SSH セットアップ:キーベース認証

Ansible は SSH を使用してノード間で通信します。

# SSH キーを生成
ssh-keygen -t rsa -b 4096
# 公開鍵をリモートホストにコピー
ssh-copy-id user@hostname
# SSH 接続をテスト
ssh user@hostname

環境セットアップ

Ansible 環境変数とパスを設定します。

# インベントリファイルの位置を設定
export ANSIBLE_INVENTORY=/path/to/inventory
# ホストキーチェックを設定
export ANSIBLE_HOST_KEY_CHECKING=False
# リモートユーザーを設定
export ANSIBLE_REMOTE_USER=ubuntu

インベントリ管理

基本インベントリ:/etc/ansible/hosts

ホストグループは、角括弧内にグループ名を与えることで作成できます。

# 基本ホストファイル (INI 形式)
[webservers]
web1.example.com
web2.example.com
[databases]
db1.example.com
db2.example.com
[all:vars]
ansible_user=ubuntu
ansible_ssh_private_key_file=~/.ssh/id_rsa

YAML インベントリ形式

インベントリファイルは INI 形式または YAML 形式にできます。

# inventory.yml
all:
  children:
    webservers:
      hosts:
        web1.example.com:
        web2.example.com:
    databases:
      hosts:
        db1.example.com:
      vars:
        mysql_port: 3306

ホスト変数とグループ

ホスト固有の変数とグループ構成を定義します。

# 変数を持つインベントリ
[webservers]
web1.example.com http_port=80
web2.example.com http_port=8080
[webservers:vars]
ansible_user=nginx
nginx_version=1.18

# インベントリをテスト
ansible-inventory --list
ansible-inventory --graph

アドホックコマンド

基本コマンド構造

Ansible コマンドの基本構造:ansible <hosts> -m <module> -a "<arguments>"

# 接続性をテスト
ansible all -m ping
# 特定のグループを確認
ansible webservers -m ping
# 全ホストでコマンドを実行
ansible all -m command -a "uptime"
# sudo 権限で実行
ansible all -m command -a "systemctl status nginx" --become
クイズ

ログインしてこのクイズに回答し、学習の進捗を追跡できます

ansible all -m ping は何を行いますか?
ICMP ping を使用してネットワーク接続性をテストする
全ホストに ping パッケージをインストールする
インベントリ内の全ホストへの Ansible 接続性をテストする
ホストがオンラインかどうかを確認する

ファイル操作

ホスト上でディレクトリ、ファイル、シンボリックリンクを作成します。

# ディレクトリを作成
ansible all -m file -a "path=/tmp/test state=directory mode=0755"
# ファイルを作成
ansible all -m file -a "path=/tmp/test.txt state=touch"
# ファイル/ディレクトリを削除
ansible all -m file -a "path=/tmp/test state=absent"
# シンボリックリンクを作成
ansible all -m file -a "src=/etc/nginx dest=/tmp/nginx state=link"

パッケージ管理

異なるシステム間でパッケージのインストール、更新、削除を行います。

# パッケージをインストール (apt)
ansible webservers -m apt -a "name=nginx state=present" --become
# パッケージをインストール (yum)
ansible webservers -m yum -a "name=httpd state=present" --become
# 全パッケージを更新
ansible all -m apt -a "upgrade=dist" --become
# パッケージを削除
ansible all -m apt -a "name=apache2 state=absent" --become

サービス管理

システムサービスを開始、停止、管理します。

# サービスを開始
ansible webservers -m service -a "name=nginx state=started" --become
# サービスを停止
ansible webservers -m service -a "name=apache2 state=stopped" --become
# サービスを再起動
ansible webservers -m service -a "name=ssh state=restarted" --become
# ブート時にサービスを有効化
ansible all -m service -a "name=nginx enabled=yes" --become

プレイブックとタスク

基本的なプレイブック構造

どのタスクを実行し、どのホストで実行するかを定義する YAML ファイル。

---
- name: Web サーバー設定
  hosts: webservers
  become: yes
  vars:
    nginx_port: 80

  tasks:
    - name: nginx をインストール
      apt:
        name: nginx
        state: present

    - name: nginx サービスを開始
      service:
        name: nginx
        state: started
        enabled: yes

プレイブックの実行

様々なオプションと設定でプレイブックを実行します。

# プレイブックを実行
ansible-playbook site.yml
# 特定のインベントリで実行
ansible-playbook -i inventory.yml site.yml
# ドライラン (チェックモード)
ansible-playbook site.yml --check
# 特定のホストで実行
ansible-playbook site.yml --limit webservers
# 追加変数を指定して実行
ansible-playbook site.yml --extra-vars "nginx_port=8080"
クイズ

ログインしてこのクイズに回答し、学習の進捗を追跡できます

ansible-playbook site.yml --check は何を行いますか?
プレイブックを 2 回実行する
変更を加えることなくチェックモード (ドライラン) でプレイブックを実行する
プレイブックの構文をチェックする
最初のタスクのみを実行する

タスクオプションと条件分岐

条件、ループ、エラー処理をタスクに追加します。

tasks:
  - name: パッケージをインストール
    apt:
      name: '{{ item }}'
      state: present
    loop:
      - nginx
      - mysql-server
      - php
    when: ansible_os_family == "Debian"

  - name: ユーザーを作成
    user:
      name: webuser
      state: present
    register: user_result

  - name: ユーザー作成結果を表示
    debug:
      msg: 'ユーザー作成済み:{{ user_result.changed }}'

ハンドラと通知

タスクによって通知されたときに実行されるハンドラを定義します。

tasks:
  - name: nginx 設定を更新
    template:
      src: nginx.conf.j2
      dest: /etc/nginx/nginx.conf
    notify: nginx を再起動

handlers:
  - name: nginx を再起動
    service:
      name: nginx
      state: restarted
クイズ

ログインしてこのクイズに回答し、学習の進捗を追跡できます

Ansible のハンドラはいつ実行されますか?
定義直後に実行される
プレイブックの開始時に実行される
プレイブックの最後に、タスクによって通知された場合にのみ実行される
タスクが実行されるたびに実行される

変数とテンプレート

変数の定義

異なるレベルとスコープで変数を定義します。

# プレイブック内
vars:
  app_name: myapp
  app_port: 8080

# group_vars/all.yml 内
database_host: db.example.com
database_port: 5432

# host_vars/web1.yml 内
server_role: frontend
max_connections: 100

# コマンドライン変数
ansible-playbook site.yml -e "env=production"

Jinja2 テンプレート

テンプレートを使用して動的な設定ファイルを作成します。

# テンプレートファイル: nginx.conf.j2
server {
    listen {{ nginx_port }};
    server_name {{ server_name }};

    location / {
        proxy_pass http://{{ backend_host }}:{{ backend_port }};
    }
}
# template モジュールを使用
- name: nginx 設定をデプロイ
  template:
    src: nginx.conf.j2
    dest: /etc/nginx/sites-available/default
  notify: nginx をリロード

Fact とシステム情報

プレイブックでシステム Fact を収集し、使用します。

# Fact を手動で収集
ansible all -m setup
# 特定の Fact を収集
ansible all -m setup -a "filter=ansible_eth*"
# プレイブックで Fact を使用
- name: システム情報を表示
  debug:
    msg: '{{ ansible_hostname }} は {{ ansible_distribution }} を実行中'

- name: OS に基づいてパッケージをインストール
  apt:
    name: apache2
  when: ansible_os_family == "Debian"

Vault とシークレット管理

Ansible Vault を使用して機密データを暗号化します。

# 暗号化されたファイルを作成
ansible-vault create secrets.yml
# 暗号化されたファイルを編集
ansible-vault edit secrets.yml
# 既存のファイルを暗号化
ansible-vault encrypt passwords.yml
# Vault でプレイブックを実行
ansible-playbook site.yml --ask-vault-pass
# Vault パスワードファイルを使用
ansible-playbook site.yml --vault-password-file .vault_pass

ロールと編成

ロールの構造

プレイブックを再利用可能なロールに編成します。

# ロール構造を作成
ansible-galaxy init webserver
# ロールディレクトリ構造
webserver/
├── tasks/
│   └── main.yml
├── handlers/
│   └── main.yml
├── templates/
├── files/
├── vars/
│   └── main.yml
├── defaults/
│   └── main.yml
└── meta/
    └── main.yml

プレイブックでのロールの使用

プレイブック内でロールをホストに適用します。

---
- hosts: webservers
  roles:
    - common
    - webserver
    - { role: database, database_type: mysql }

# または include_role を使用
- hosts: webservers
  tasks:
    - include_role:
        name: webserver
      vars:
        nginx_port: 8080

Ansible Galaxy

Ansible Galaxy からコミュニティロールをダウンロードして管理します。

# Galaxy からロールをインストール
ansible-galaxy install geerlingguy.nginx
# 特定のバージョンをインストール
ansible-galaxy install geerlingguy.nginx,2.8.0
# 要件ファイルからインストール
ansible-galaxy install -r requirements.yml
# インストールされているロールを一覧表示
ansible-galaxy list
# ロールを削除
ansible-galaxy remove geerlingguy.nginx

コレクション

Ansible コレクションを使用して拡張機能に対応します。

# コレクションをインストール
ansible-galaxy collection install community.general
# プレイブックでコレクションを使用
collections:
  - community.general
tasks:
  - name: パッケージをインストール
    community.general.snap:
      name: code
      state: present

デバッグとトラブルシューティング

タスクのデバッグ

プレイブックの実行をデバッグおよびトラブルシューティングします。

# デバッグタスクを追加
- name: 変数の値を表示
  debug:
    var: my_variable
- name: カスタムメッセージを表示
  debug:
    msg: 'ホスト {{ inventory_hostname }} は IP {{ ansible_default_ipv4.address }} を持つ'
# 詳細な実行
ansible-playbook site.yml -v
ansible-playbook site.yml -vvv  # 最大の詳細度

エラー処理

エラーを適切に処理し、正常に実行できるようにします。

- name: 失敗する可能性のあるタスク
  command: /bin/false
  ignore_errors: yes

- name: rescue を持つタスク
  block:
    - command: /bin/false
  rescue:
    - debug:
        msg: 'タスクが失敗したため、rescue を実行'
  always:
    - debug:
        msg: 'これは常に実行されます'

テストと検証

プレイブックをテストし、構成を検証します。

# 構文チェック
ansible-playbook site.yml --syntax-check
# タスクを一覧表示
ansible-playbook site.yml --list-tasks
# ホストを一覧表示
ansible-playbook site.yml --list-hosts
# ステップ実行
ansible-playbook site.yml --step
# チェックモードでテスト
ansible-playbook site.yml --check --diff

パフォーマンスと最適化

プレイブックのパフォーマンスと実行を最適化します。

# タスクを並列で実行
- name: パッケージをインストール
  apt:
    name: '{{ packages }}'
  vars:
    packages:
      - nginx
      - mysql-server

# 長時間実行されるタスクに async を使用
- name: 長時間実行されるタスク
  command: /usr/bin/long-task
  async: 300
  poll: 5

ベストプラクティスとヒント

セキュリティのベストプラクティス

Ansible インフラストラクチャと操作を保護します。

# Ansible Vault でシークレットを使用
ansible-vault create group_vars/all/vault.yml
# ホストキーチェックを慎重に無効化
host_key_checking = False
# 必要な場合にのみ become を使用
become: yes
become_user: root
# プレイブックのスコープを制限
ansible-playbook site.yml --limit production

コードの編成

Ansible プロジェクトを効果的に構成します。

# 推奨されるディレクトリ構造
ansible-project/
├── inventories/
│   ├── production/
│   └── staging/
├── group_vars/
├── host_vars/
├── roles/
├── playbooks/
└── ansible.cfg
# 意味のある名前とドキュメントを使用
- name: 説明的なタスク名
  # 複雑なロジックにはコメントを追加

バージョン管理とテスト

適切なバージョン管理で Ansible コードを管理します。

# バージョン管理に Git を使用
git init
git add .
git commit -m "初期 Ansible 設定"
# 本番環境の前にステージングでテスト
ansible-playbook -i staging site.yml
# 選択的実行のためにタグを使用
ansible-playbook site.yml --tags "nginx,ssl"

設定と高度な機能

Ansible 設定

設定オプションを使用して Ansible の動作をカスタマイズします。

# ansible.cfg
[defaults]
inventory = ./inventory
remote_user = ansible
host_key_checking = False
timeout = 30
forks = 5

[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=60s
pipelining = True

コールバックプラグイン

コールバックプラグインを使用して出力とロギングを強化します。

# ansible.cfg でコールバックプラグインを有効化
[defaults]
stdout_callback = yaml
callbacks_enabled = profile_tasks, timer

# カスタムコールバック設定
[callback_profile_tasks]
task_output_limit = 20

フィルターとルックアップ

Jinja2 フィルターとルックアッププラグインを使用してデータを操作します。

# テンプレート内の一般的なフィルター
{{ variable | default('default_value') }}
{{ list_var | length }}
{{ string_var | upper }}
{{ dict_var | to_nice_yaml }}
# ルックアッププラグイン
- name: ファイル内容を読み込む
  debug:
    msg: "{{ lookup('file', '/etc/hostname') }}"

- name: 環境変数
  debug:
    msg: "{{ lookup('env', 'HOME') }}"

動的インベントリ

クラウド環境やコンテナ環境のために動的インベントリを使用します。

# AWS EC2 動的インベントリ
ansible-playbook -i ec2.py site.yml
# Docker 動的インベントリ
ansible-playbook -i docker.yml site.yml
# カスタムインベントリスクリプト
ansible-playbook -i ./dynamic_inventory.py site.yml

関連リンク