Ansible初期設定からPlaybook作成・実行まで!自動化の第一歩

AWSLinux自動化

サーバー管理やアプリケーションのデプロイを自動化したいと思ったことはありませんか?Ansibleは、そんなあなたの強い味方となるツールです。この記事では、「ansible」の初期設定から、自動化のシナリオを記述する「playbook」の作成、そして実際にコマンドを実行するまでの基本的な流れを、初心者の方にも分かりやすく解説します。さあ、Ansibleの世界へ足を踏み入れ、日々の作業を効率化しましょう!

Ansibleとは?その魅力とできること

Ansibleは、エージェントレスでシンプルに扱える自動化ツールです。YAML形式で記述されたPlaybookを使って、構成管理、アプリケーションデプロイ、タスク実行など、様々な作業を自動化できます。「ansible」を導入することで、手作業によるミスを減らし、作業時間を大幅に短縮することが可能です。

Ansibleの初期設定

Ansibleを利用するためには、コントロールノードと呼ばれる管理を行うサーバーにAnsibleをインストールする必要があります。

1. 前提条件

  • Python: AnsibleはPythonで記述されているため、コントロールノードと管理対象ノードの両方にPythonがインストールされている必要があります。通常、多くのLinuxディストリビューションには標準でインストールされています。
  • SSH接続: コントロールノードから管理対象ノードへSSHで接続できる必要があります。公開鍵認証を設定しておくと、よりスムーズに操作できます。

2. Ansibleのインストール

Ansibleは、pip(Pythonのパッケージ管理システム)や各OSのパッケージマネージャーを使ってインストールできます。

  • pip を使用する場合:
pip install ansible

または最新バージョンにしたい場合
pip install ansible --upgrade
  • CentOS/RHEL の場合: 事前にEPELリポジトリを有効にする必要がある場合があります。
sudo yum install epel-release
sudo yum install ansible

インストールが完了したら、以下のコマンドでバージョンを確認してみましょう。

ansible --version

3. インベントリファイルの作成

インベントリファイルは、Ansibleが管理する対象のサーバー(ノード)を定義するファイルです。通常、YAML形式で記述します。デフォルトでは /etc/ansible/hosts が使用されますが、-i オプションで別のファイルを指定することも可能です。

YAML形式の例:

all:
  hosts:
    webserver1.example.com:
    webserver2.example.com:
  vars:
    ansible_user: your_ssh_username
    ansible_ssh_private_key_file: /path/to/your/private_key
  children:
    webservers:
      hosts:
        webserver1.example.com:
        webserver2.example.com:
    databases:
      hosts:
        dbserver1.example.com:
        dbserver2.example.com:
  • all: は全てのホストをまとめるグループです。
  • hosts: の下に管理対象ノードのホスト名またはIPアドレスを記述します。
  • vars: セクションでは、グループまたは個々のホストに適用する変数を定義できます。ここでは、SSH接続に使用するユーザー名と秘密鍵ファイルのパスを指定しています。
  • children: を使用して、ホストをさらに細かくグループ化できます。

Playbookの作成

Playbookは、Ansibleが実行するタスクを定義するYAML形式のファイルです。複数のタスクをまとめて実行したり、条件分岐やループ処理などを記述することができます。

簡単なPlaybookの例 (ping)

---
- hosts: all
  tasks:
    - name: Ping all servers
      ping:
  • ---: YAMLファイルの開始を示します。
  • - hosts: all: このPlaybookを全てのインベントリホストに対して実行することを指定します。特定のグループを指定することも可能です(例: hosts: webservers)。
  • tasks:: 実行するタスクを定義するセクションです。
  • - name: Ping all servers: タスクの名前(任意)です。
  • ping:: 使用するAnsibleモジュールを指定します。ここでは、疎通確認を行う ping モジュールを使用しています。

簡単なPlaybookの例 (コマンド実行)

---
- hosts: webservers
  tasks:
    - name: Check server uptime
      command: uptime
      register: uptime_output

    - name: Print uptime output
      debug:
        var: uptime_output.stdout_lines
  • hosts: webservers: このPlaybookを webservers グループのホストに対して実行します。
  • command: uptime コマンドを実行します。
  • register: uptime_output: コマンドの実行結果を uptime_output という変数に格納します。
  • debug: var: uptime_output.stdout_lines: 変数 uptime_output の標準出力の内容を表示します。

AWS EC2 (CentOS/RHEL) へのOS設定 (hostnamectl/timedatectl..etc)

Ansibleを使うと、複数のEC2インスタンスに対してまとめてOSの設定を行うことができます。ここでは、hostnamectl を使ったホスト名の設定と、timedatectl を使ったタイムゾーンの設定を自動化するPlaybookの例をご紹介します。

Playbookの作成 (os_config.yml)

以下の内容で os_config.yml というファイルを作成します。

---
- hosts: ec2_instances  # インベントリファイルで定義したEC2インスタンスのグループ名
  become: yes          # root権限でコマンドを実行するために必要
  tasks:
    - name: Set hostname to "my-ec2-instance"
      hostname:
        name: my-ec2-instance

    - name: Set timezone to "Asia/Tokyo"
      timezone:
        name: Asia/Tokyo
  • hosts: ec2_instances: このPlaybookを、インベントリファイルで ec2_instances というグループに属するホストに対して実行します。事前にインベントリファイルにEC2インスタンスの情報を登録しておいてください。
  • become: yes: hostnamectltimedatectl は通常、root権限が必要なため、become: yes を指定してsudoでコマンドを実行します。
  • tasks:: 実行するタスクを定義します。
    • name: Set hostname to "my-ec2-instance": ホスト名を設定するタスクです。
    • hostname: name: my-ec2-instance: hostname モジュールを使用して、ホスト名を my-ec2-instance に設定します。
    • name: Set timezone to "Asia/Tokyo": タイムゾーンを設定するタスクです。
    • timezone: name: Asia/Tokyo: timezone モジュールを使用して、タイムゾーンを Asia/Tokyo に設定します。

補足:

  • ホスト名は name パラメータで指定します。必要に応じて変数を使用することも可能です。
  • タイムゾーンは name パラメータで指定します。利用可能なタイムゾーンは、管理対象ノードで timedatectl list-timezones コマンドを実行することで確認できます。

Playbookの実行

作成したPlaybookを実行するには、以下のコマンドを実行します。

ansible-playbook os_config.yml -i inventory.yml
  • os_config.yml: 作成したPlaybookのファイル名です。
  • -i inventory.yml: 使用するインベントリファイルを指定します。

実行すると、Ansibleはインベントリファイルに定義された ec2_instances グループのEC2インスタンスに対して、Playbookに記述されたタスクを順番に実行し、ホスト名とタイムゾーンを設定します。

実行結果は、各タスクの実行結果(成功または失敗)が表示されます。

例:実行結果

PLAY [ec2_instances] *************************************************************

TASK [Gathering Facts] *************************************************************
ok: [your_ec2_instance_ip_or_hostname]

TASK [Set hostname to "my-ec2-instance"] *****************************************
changed: [your_ec2_instance_ip_or_hostname]

TASK [Set timezone to "Asia/Tokyo"] *********************************************
changed: [your_ec2_instance_ip_or_hostname]

PLAY RECAP *********************************************************************
your_ec2_instance_ip_or_hostname : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

この例では、ホスト名の設定とタイムゾーンの設定が変更されたことが changed で示されています。

このPlaybookを活用することで、複数のEC2インスタンスに対して、一貫したホスト名とタイムゾーンの設定を簡単に行うことができます。

Playbookの実行

作成したPlaybookを実行するには、ansible-playbook コマンドを使用します。

ansible-playbook playbook.yml -i inventory.yml
  • playbook.yml: 作成したPlaybookのファイル名です。
  • -i inventory.yml: 使用するインベントリファイルを指定します。デフォルトの /etc/ansible/hosts を使用する場合は省略可能です。

Ad-hocコマンドの実行

Ad-hocコマンドとは、Ansibleを使ってちょっとした単発のタスクを、Playbookを作成せずに実行するための機能です。Playbookを作成するまでもない簡単なタスクを実行したい場合は、ansible コマンドを使用できます。

例: 全てのホストにpingを実行する

ansible all -m ping -i inventory.yml
  • all: 対象のホスト(ここでは全てのホスト)を指定します。
  • -m ping: 使用するモジュールを指定します。
  • -i inventory.yml: 使用するインベントリファイルを指定します。

例: 特定のホストでコマンドを実行する

ansible webserver1.example.com -m command -a "df -h" -i inventory.yml
  • webserver1.example.com: 対象のホストを指定します。
  • -m command: command モジュール(任意のコマンドを実行)を使用することを指定します。
  • -a "df -h": command モジュールに渡す引数(実行するコマンド)を指定します。

まとめ

この記事では、「ansible」の初期設定から、自動化のシナリオを記述する「playbook」の作成、そして実際にコマンドを実行するまでの基本的な流れを解説しました。Ansibleは非常に強力なツールであり、ここで紹介したのはほんの入り口に過ぎません。ぜひ、公式ドキュメントなどを参考に、さらに深くAnsibleの世界を探求してみてください。

最後に: 最後まで読んでいただきありがとうございました。この記事が、あなたのAnsible導入の第一歩となることを願っています。

コメント

タイトルとURLをコピーしました