キーワードで検索

今日を知り、明日を変えるシステム運用メディア

Ansibleをコントロールノードにインストールする手順と、自動構築の基本操作を徹底解説

Ansibleをコントロールノードにインストールする手順と、自動構築の基本操作を徹底解説

Red Hatが開発したオープンソースのIT自動化ツール「Ansible(アンシブル)」は、インフラ構築、構成管理、アプリケーションのデプロイ、オーケストレーションなど、様々なITプロセスを自動化するために使用されます。

本記事では、そんなAnsibleをコントロールノードにインストールし、AWS上に構築したインフラを自動管理する方法を解説します。

Terraformでリソースを作成し、Ansibleを活用して効率的に設定を適用する基本操作も実践例とともに丁寧に説明しますので、ぜひご覧ください。

TerraformとAnsibleを連携するメリット

TerraformとAnsibleは、インフラ構築と構成管理を効率化するために非常に相性の良いツールです。

まず、Terraformは、インフラストラクチャをコード化(Infrastructure as Code, IaC)するためのツールです。Terraformを使用すると、インフラのコード化によりリソースの作成・管理を自動化できます。また、terraform plan コマンドで変更内容を事前に確認できるため、安全性が高まります。

Ansibleは、サーバーやアプリケーションの構成管理、設定適用、デプロイを自動化するためのツールです。Terraformがリソースを作成した後、Ansibleを使用することで以下のような設定を適用できます。

  • パッケージのインストール(例:Apache、MySQLなど)
  • 構成ファイルの配布(例:/etc/httpd/httpd.conf)
  • サービスの管理(例:起動・停止・再起動)
  • セキュリティパッチの適用

Terraformはリソース作成に特化し、Ansibleはその上で実行される構成管理に特化しているため、2つのツールを組み合わせることで効率的なインフラ管理が可能になります。

1. 事前準備

Ansibleを使ってAWS上にリソースを自動構築するためには、いくつかの事前準備が必要です。

  • Terraformインストール
  • AWS CLIのセットアップ
  • SSHキーの作成

それぞれの設定方法を解説します。

Terraformがインストールされていること

Terraformを使ってAWSリソースを構築するために、Terraformがローカル環境にインストールされている必要があります。以下のコマンドでインストール済みか確認してください。

terraform -v

Terraformがインストールされていない場合はこちらの記事をご覧ください。

AWSアカウントとIAMユーザーの設定

AWSリソースを構築するためには、AWSアカウントと適切なIAMユーザーの設定が必要です。

  1. AWSマネジメントコンソールにログイン
  2. 「IAMサービス」を開き、新しいIAMユーザーを作成
  3. 必要なポリシーを付与します:AmazonEC2FullAccess、AmazonVPCFullAccess
  4. アクセスキーとシークレットキーを発行し、これをAWS CLIで使用

AWS CLIのセットアップ

TerraformやAnsibleからAWSリソースを管理するために、AWS CLIをインストールし、設定を行います。以下のコマンドでAWS CLIをインストールします(Linux/Macの場合)

curl “https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip” -o “awscliv2.zip”
unzip awscliv2.zip
sudo ./aws/install

インストール後は以下のコマンドで設定を行います

aws configure

入力が求められる情報

  • アクセスキーID
  • シークレットアクセスキー
  • デフォルトリージョン(例:ap-japaneast-1)

SSHキーが作成済みであること

AWS EC2インスタンスに接続するためのSSHキーを作成します。以下のコマンドを実行し、新しいSSHキーを作成してください。

ssh-keygen -t rsa -b 2048 -f ~/.ssh/id_rsa

作成した公開鍵(~/.ssh/id_rsa.pub)は、Terraformを使用してEC2インスタンスに登録します。

今回Terraformで構築するAWSリソース

今回、Terraformで構築するAWSリソースは以下のとおりです。これらのリソースを作成するためのコードをterraformで記述します。

VPCとサブネット

  • VPC(Virtual Private Cloud): AWSリソースを配置するためのネットワーク基盤。
  • サブネット: VPC内に構築されるネットワークセグメント。

インターネットゲートウェイ

  • EC2インスタンスがインターネットに接続できるようにするためのリソース。

セキュリティグループ

  • ポート22(SSH): EC2インスタンスにSSH接続を許可。
  • ポート80(HTTP): WebサーバーへのHTTPアクセスを許可。

EC2インスタンス

  • 1台目(コントロールノード): Ansibleをインストールし、管理操作を行うノード。
  • 2台目(対象ノード): Ansible Playbookを適用する対象のノード。

SSHキーペアの登録

  • ローカルで作成済みのSSH公開鍵をAWSに登録し、EC2インスタンスに使用します。

TerraformでAWSリソースを作成する方法

フォルダにmain.tfファイルを作成し、VScodeでファイルを開きます。そして、ファイルに以下のコードを記述(コピペでも可)してください。

main.tf

# プロバイダーの設定
provider “aws” {
  region = “ap-northeast-1” # 東京リージョン
}

# VPCの作成
resource “aws_vpc” “main” {
  cidr_block = “10.0.0.0/16”
  tags = {
    Name = “main-vpc”
  }
}

# サブネットの作成
resource “aws_subnet” “main” {
  vpc_id     = aws_vpc.main.id
  cidr_block = “10.0.1.0/24”
}

# インターネットゲートウェイの作成
resource “aws_internet_gateway” “main” {
  vpc_id = aws_vpc.main.id
}

# ルートテーブルの作成
resource “aws_route_table” “main” {
  vpc_id = aws_vpc.main.id

  route {
    cidr_block = “0.0.0.0/0” # 全ての宛先を
    gateway_id = aws_internet_gateway.main.id # インターネットゲートウェイにルーティング
  }
}

# サブネットにルートテーブルを関連付け
resource “aws_route_table_association” “main” {
  subnet_id      = aws_subnet.main.id
  route_table_id = aws_route_table.main.id
}

# セキュリティグループの作成
resource “aws_security_group” “main” {
  vpc_id = aws_vpc.main.id

  ingress {
    from_port   = 22
    to_port     = 22
    protocol    = “tcp”
    cidr_blocks = [“0.0.0.0/0”] # SSH許可
  }

  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = “tcp”
    cidr_blocks = [“0.0.0.0/0”] # HTTP許可
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = “-1”
    cidr_blocks = [“0.0.0.0/0”] # 全てのアウトバウンドを許可
  }
}

# SSHキーペアの登録
resource “aws_key_pair” “default” {
  key_name   = “my-key” # キーペア名
  public_key = file(“~/.ssh/id_rsa.pub”) # ローカルの公開鍵を指定
}

# EC2インスタンス(コントロールノード)の作成
resource “aws_instance” “controller” {
  ami           = “ami-075cc63e37ba74823” # Amazon Linux 2 AMIのIDを指定
  instance_type = “t2.micro”
  key_name      = aws_key_pair.default.key_name # 登録したキーペアを使用
  subnet_id     = aws_subnet.main.id # サブネットを指定
  vpc_security_group_ids = [aws_security_group.main.id] # VPCセキュリティグループを指定
  associate_public_ip_address = true # パブリックIPを割り当てる
  tags = {
    Name = “controller-node”
  }
}

# EC2インスタンス(対象ノード)の作成
resource “aws_instance” “target” {
  ami           = “ami-075cc63e37ba74823”
  instance_type = “t2.micro”
  key_name      = aws_key_pair.default.key_name
  subnet_id     = aws_subnet.main.id
  vpc_security_group_ids = [aws_security_group.main.id]
  associate_public_ip_address = true
  tags = {
    Name = “target-node”
  }
}

Terraformコードを作成したら、以下のコマンドを順に実行してAWSリソースを構築します。

初期化

Terraformを初期化して、必要なプラグインをダウンロードします。

terraform init

プランで確認

Terraformで作成するリソースを確認します。

terraform plan

リソースの作成

以下のコマンドを実行してリソースを作成します。

terraform apply

作成したリソースの確認

必要なポリシーが付与されたIAMユーザーでAWSマネジメントコンソールへサインインをします。サインイン後、作成したリソースが存在するかを確認します。

例:EC2インスタンス確認

Ansibleをコントロールノードにインストール

Terraformで構築したコントロールノード(EC2インスタンス)にSSHで接続し、Ansibleのインストールと初期設定を行います。

まずはTerraformで作成したコントロールノードにSSHで接続します。

ssh -i ~/.ssh/id_rsa ec2-user@<コントロールノードのパブリックIP>

<コントロールノードのパブリックIP> Terraformで作成したインスタンスのパブリックIPに書き換えて実行してください。

Ansibleのインストール

Terraformで作成したコントロールノードにSSHで接続したら、Ansibleをインストールするための準備を行います。

システムパッケージを最新化

最初にシステムパッケージを最新状態に更新します。これにより、必要な依存関係が正しくインストールされるようになります。

sudo yum update -y

Pythonとpipのインストール

AnsibleはPythonで動作するため、まずPythonとpipをインストールします。

sudo yum install -y python3 python3-pip

Ansibleのインストール

pipを使用してAnsibleをインストールします。

sudo pip3 install ansible

インストール確認

以下のコマンドでAnsibleが正しくインストールされていることを確認します。

ansible –version

Terraformで作成した秘密鍵の配置

AnsibleのコントロールノードがターゲットノードにSSH接続するには、Terraformで使用した秘密鍵が必要です。以下の手順で秘密鍵を配置します。

秘密鍵を転送

ローカルマシンからコントロールノードにTerraformで使用した秘密鍵(~/.ssh/id_rsa)を転送します。

※ローカルマシンで操作

scp -i ~/.ssh/id_rsa ~/.ssh/id_rsa ec2-user@<コントロールノードのパブリックIP>:~/.ssh/id_rsa

権限の設定

コントロールノードに転送した秘密鍵の権限を変更します。権限が適切でない場合、SSH接続に失敗します。

※コントロールノード(Ansibleサーバ)で操作

chmod 600 ~/.ssh/id_rsa

これでコントロールノードからターゲットノードへのSSH接続準備が整いました。

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

Ansibleでは、インベントリファイルを使用して管理対象ノードを指定します。このファイルに対象ノード(EC2インスタンス)の情報を記載します。

ディレクトリ構造の準備

まず、コントロールノード上に作業ディレクトリを作成します。

mkdir -p ~/ansible_project
cd ~/ansible_project

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

インベントリファイル(inventory.ini)を作成します。

touch inventory.ini

inventory.ini ファイルに以下の内容を記載します。

[target]
<対象ノードのプライベートIP> ansible_user=ec2-user ansible_ssh_private_key_file=~/.ssh/id_rsa

記載例

  • [target]: 対象ノードのグループ名。任意の名前に変更可能です。
  • <対象ノードのプライベートIP>: Terraformで作成した対象ノードのプライベートIPを記載します(AWSコンソールで確認可能)。

インベントリファイルの確認

以下のコマンドを実行し、インベントリファイルが正しく読み込めるか確認します。

ansible-inventory -i inventory.ini –list

出力例

{
    “_meta”: {
        “hostvars”: {
            “10.0.1.100”: {
                “ansible_user”: “ec2-user”,
                “ansible_ssh_private_key_file”: “~/.ssh/id_rsa”
            }
        }
    },
    “target”: {
        “hosts”: [
            “10.0.1.100”
        ]
    }
}

接続確認

AnsibleのPingモジュールを使用して、コントロールノードからターゲットノードへの接続を確認します。

以下のコマンドを実行

ansible -i inventory.ini target -m ping

SUCCESS が表示されれば、ターゲットノードへの接続が正常に行われていることを示します。

Ansibleで対象ノードに設定を適用

作業ディレクトリに移動し、Playbookファイルを作成します。

cd ~/ansible_project
touch site.yml

site.yml に以下の内容を記述します。


– name: Configure target node
  hosts: target
  become: yes
  tasks:
    – name: Install Apache
      yum:
        name: httpd
        state: present

    – name: Start and enable Apache
      service:
        name: httpd
        state: started
        enabled: yes

    – name: Deploy index.html
      copy:
        content: |
          <html>
            <head>
              <title>Welcome to Ansible Managed Server</title>
            </head>
            <body>
              <h1>Apache is successfully configured by Ansible!</h1>
            </body>
          </html>
        dest: /var/www/html/index.html
        mode: ‘0644’

Playbookを実行する

以下のコマンドを使用して、Playbookを実行します。

ansible-playbook -i inventory.ini site.yml

実行結果の確認

Playbook実行後、以下のような出力が表示されます。

PLAY [Configure target node] **************************************************

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

TASK [Install Apache] *********************************************************
changed: [10.0.1.100]

TASK [Start and enable Apache] ************************************************
changed: [10.0.1.100]

TASK [Deploy index.html] ******************************************************
changed: [10.0.1.100]

PLAY RECAP ********************************************************************
10.0.1.100                 : ok=4    changed=3    unreachable=0    failed=0

changed=3:

3つのタスク(Apacheのインストール、起動、有効化、HTMLファイルの配置)が変更されたことを示します。

ok=4:

全タスクが正常に実行されたことを示します。

動作確認・リソースの削除

Playbookが正常に適用されたか、ターゲットノードのApacheが動作しているかを確認します。ブラウザを開き、以下のURLにアクセスします。

http://<ターゲットノードのパブリックIP>

以下のようなHTMLページが表示されれば成功です。

※今回使用したパブリックIPは有料コンポーネントとなります。学習後はリソースの削除を忘れずに行いましょう。

terraform destroy

まとめ

本記事では、Terraformを使ったAWSインフラの構築と、Ansibleを使用して対象ノードに設定を適用するまでの手順を詳しく解説しました。

  • TerraformでAWSリソースを構築
    VPCやEC2インスタンスをコード化して自動プロビジョニングを実現。
  • Ansibleで構成管理を実施
    コントロールノードにAnsibleをインストールし、PlaybookでApacheの設定を適用。
  • 動作確認
    ブラウザで対象ノードへの設定適用を確認。

今回は基本的なAnsibleの使い方を学びましたが、下記記事ではAnsibleのRolesを使ったPlaybookの再利用と構造化について詳しく解説します。興味がある方はぜひご覧ください。

現在クラウドエンジニアとして勤務。AWS(SAP、DOP)とAzure(AZ-305)の資格を保有しており、ネットワークやセキュリティに関する業務を主に行っています。

最新情報をお届けします!

最新のITトレンドやセキュリティ対策の情報を、メルマガでいち早く受け取りませんか?ぜひご登録ください

メルマガ登録

最新情報をお届けします!

最新のITトレンドやセキュリティ対策の情報を、メルマガでいち早く受け取りませんか?ぜひご登録ください

メルマガ登録