Ansibleでnginxをインストール・起動してみよう

Linux

ansible-nginx-installアイキャッチ
ブログ運営者
さいとう

閲覧いただきありがとうございます!"さいとう"と申します。わたしは異業種・未経験からIT業界に転職し、現在インフラエンジニアとしてクラウド環境の設計や構築・運用の支援を行っています。


インフラ自動化ツールが一般的になり、新規プロジェクトを立ち上げる際には、AnsibleやTerraformなどの自動化ツールの利用が検討されることが多いでしょう。今回の記事では、Ansibleを使ってみたい初心者向けに、基本的な使い方をハンズオン形式で紹介します。


具体的には、複数台のサーバに対して命令を出すコントロールノードから、nginxのインストール・起動を行うハンズオンを実施します。コマンドを実行していくだけなので、初めての方でもスムーズに進められるでしょう。


Ansibleを使ってみよう

■構築イメージ

ansible-nginx-install仕組み


Anzsibleを利用して、複数台に一撃でnginxのインストールと起動を実施します。ですので、今回のハンズオンではAWSクラウド上に、命令を出すコントロールノード1台と、管理される管理ノードを2台のサーバを作成します。

■前提条件

前提条件は以下の通りです。

①サーバ要件

  • EC2
項目設定値
osAmazon Linux2023
パブリックIP有効
  • SG インバウンドルール
タイプソース
すべて許可VPC CIDR
すべて許可MyIP


EC2インスタンスに関しては、OSとパブリックIPの有効化以外は特に要件はありません。また、コントロールノードから管理ノードに対して命令を実行するため、サーバ間の疎通確認と、ハンズオンの最後にnginxが起動しているかの動作確認をブラウザからアクセスして確認するために自身のローカル環境から接続できるようにMyIPを許可しておきましょう。

②キーファイルの格納

Ansibleを利用する場合、コントロールノードは管理ノードに対しSSH接続を行います。そのため、コントロールノードに接続するためのキーをどこかに保管しなければいけません。ハンズオン実施前に、管理ノード起動時に設定したキーペアのキーファイル(.pem)をコントロールノードの/home/ec2-user/.ssh/に保管しておいてください。わたしはscpでローカルから格納しました。

■ansibleインストール

まずはコントロールノードに接続し、ansibleをインストールします。


↓コントロールノードで以下のコマンドを実行します。AmazonLinux2023を利用しているので、dnfを使ってインストールしていきます。

sudo dnf update -ysudo dnf install ansible -y


【実行結果】

Run "/usr/bin/dnf check-release-update" for full release and version update info
   ,     #_
   ~\_  ####_        Amazon Linux 2023
  ~~  \_#####\
  ~~     \###|
  ~~       \#/ ___   https://aws.amazon.com/linux/amazon-linux-2023
   ~~       V~' '->
    ~~~         /
      ~~._.   _/
         _/ _/
       _/m/'
[ec2-user@ip-10-0-1-71 ~]$ sudo dnf update -y
Last metadata expiration check: 0:08:28 ago on Sat Feb  3 01:12:18 2024.

<省略>

====================================================================================================================================================
Dependencies resolved.
Nothing to do.
Complete!

[ec2-user@ip-10-0-1-71 ~]$ sudo dnf install ansible -y
Last metadata expiration check: 0:08:53 ago on Sat Feb  3 01:12:18 2024.
Dependencies resolved.

<省略>

Installed:
  ansible-8.3.0-1.amzn2023.0.1.noarch           ansible-core-2.15.3-1.amzn2023.0.1.x86_64           git-core-2.40.1-1.amzn2023.0.1.x86_64
  sshpass-1.09-6.amzn2023.0.1.x86_64

Complete!


↓インストールが完了しましたので、バージョンを確認しときます。

ansible --version


【実行結果】

[ec2-user@ip-10-0-1-71 ~]$ ansible --version
ansible [core 2.15.3]
  config file = None
  configured module search path = ['/home/ec2-user/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3.9/site-packages/ansible
  ansible collection location = /home/ec2-user/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/bin/ansible
  python version = 3.9.16 (main, Sep  8 2023, 00:00:00) [GCC 11.4.1 20230605 (Red Hat 11.4.1-2)] (/usr/bin/python3.9)
  jinja version = 3.1.2
  libyaml = True



ansibleのインストールは以上です。

■ssh接続確認

つづいて、管理ノードにssh接続できるか確認します。ssh-agentを利用して、設定したキーファイルを自動で利用する設定も行っていきましょう。

↓まずは指定したディレクトリにキーファイルが格納されているか確認します。

ls -l .ssh/


【実行結果】

[ec2-user@ip-10-0-1-71 ~]$ ls -l .ssh/
total 8
-rw-------. 1 ec2-user ec2-user  407 Feb  3 01:12 authorized_keys
-rw-rw-r--. 1 ec2-user ec2-user 1674 Feb  3 01:19 saitou-keypairs-northeast.pem



↓権限を狭めておきます。キーファイル名の部分はご自身が利用するキーファイルの名前に変更してください。

chmod 400 ~/.ssh/キーファイル名


【実行結果】

[ec2-user@ip-10-0-1-71 ~]$ ls -l .ssh/saitou-keypairs-northeast.pem 
-r--------. 1 ec2-user ec2-user 1674 Feb  3 01:19 .ssh/saitou-keypairs-northeast.pem



↓SSHエージェントを起動し、そのプロセスに関連する環境変数を現在のシェルセッションに設定します。

eval $(ssh-agent)


【実行結果】

[ec2-user@ip-10-0-1-71 ~]$ eval $(ssh-agent)
Agent pid 25208



↓SSHエージェントにキーを追加し、自動で使用するように設定します。

ssh-add ~/.ssh/キーファイル名


【実行結果】

[ec2-user@ip-10-0-1-71 ~]$ ssh-add ~/.ssh/saitou-keypairs-northeast.pem
Identity added: /home/ec2-user/.ssh/saitou-keypairs-northeast.pem (/home/ec2-user/.ssh/saitou-keypairs-northeast.pem)


つづいて、コントロールノードが管理するサーバのリストである"inventory"ファイルを作成します。このファイルによって、Ansibleはどのサーバーに対して操作を実行するかを知ることができます。


↓/home/ec2-userのディレクトリに作成していきます。次のコマンドを実行し、[targetservers]と書かれた記述を自身の環境に合わせてコピペしてください。

vim inventory.txt


inventory.txt】プライベートIP部分を変更してください。

[targetservers]
ansible-test-target1 ansible_host=<管理ノード1台目のプライベートIP> ansible_connection=ssh ansible_user=ec2-user
ansible-test-target2 ansible_host=<管理ノード1台目のプライベートIP> ansible_connection=ssh ansible_user=ec2-user


※↓自分の場合はこんな感じです。

[targetservers]
ansible-test-target1 ansible_host=10.0.1.66 ansible_connection=ssh ansible_user=ec2-user
ansible-test-target2 ansible_host=10.0.1.223 ansible_connection=ssh ansible_user=ec2-user


[:wq]で保存し、エディタを終了してください。

保存が終わりましたら、ansibleのコマンドでssh接続確認しましょう。

ansible ansible-test-target1 -m ping -i inventory.txtansible ansible-test-target2 -m ping -i inventory.txt


【実行結果】

[ec2-user@ip-10-0-1-71 ~]$ ansible ansible-test-target2 -m ping -i inventory.txt

<省略>

Are you sure you want to continue connecting (yes/no/[fingerprint])? yes



ansible-test-target2 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3.9"
    },
    "changed": false,
    "ping": "pong"
}


途中で接続するか聞かれますので、[yes]と打ちましょう。[SUCCESS]と出ればOKです。ssh接続確認は以上です。

■nginxインストールPlaybook作成

コントロールノードから管理ノードに対してnginxをインストール・起動するためのymlファイルを作成します


↓こちらのyamlファイルも/home/ec2-userのディレクトリに作成します。エディタを開いたら、[install_nginx.yaml]をコピペしてください。

vim install_nginx.yaml


【install_nginx.yaml】

# Install Nginx using Ansible
# Start and Enable Nginx
# Check the status of Nginx
# Collect host information
- name: Setup nginx server on myserver list (host group)
  hosts:
    - targetservers
  become: True
  tasks:
    - name: Install the latest version of nginx
      command: dnf install -y nginx

    - name: Start nginx service
      service:
        name: nginx
        state: started

    - name: Enable nginx service
      service:
        name: nginx
        enabled: yes

    - name: Get nginx Installed version
      command: nginx -v

    - name: Get status of nginx service
      command: systemctl status nginx

    - name: Ansible copy file to remote server
      copy:
        src: "/home/ec2-user/index.html"
        dest: "/usr/share/nginx/html/"


[Esc]キーを押し、[:wq]で保存し終了しましょう。


↓nginxを起動しhttp接続すると、デフォルトのWelcome画面が出ますが、せっかくなので、独自のhtmlページを表示させましょう。[index.html]を貼り付けてください。

vim index.html


【index.html】

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<h1>このページはハンズオンデモページです!</h1>
</body>
</html>


[Esc]キーを押し、[:wq]で保存し終了しましょう。


いくつかファイルを作成しましたので、作成したファイルを確認しておきますね。

ls


【実行結果】

[ec2-user@ip-10-0-1-71 ~]$ ls
index.html  install_nginx.yaml  inventory.txt


nginxインストールするためのPlaybook作成は以上です。

■動作確認

準備が整いましたので、動作確認をしていきます。管理ノードにhtmlファイルを格納しますので、ブラウザからhttpでアクセスするとデモページが表示されるかと思います。


↓ansibleでplatbookを実行するコマンドを実施しましょう。inventoryに記述してあるサーバに対し、コントロールノードがyamlファイルに書かれたtaskを実行します。

ansible-playbook -i inventory.txt install_nginx.yaml -v


【実行結果】

ansible-nginx-install結果3


[ec2-user@ip-10-0-1-71 ~]$ ansible-playbook -i inventory.txt install_nginx.yaml -v
No config file found; using defaults

PLAY [Setup nginx server on myserver list (host group)] ********************************************************************************************

TASK [Gathering Facts] 

<省略>

PLAY RECAP *****************************************************************************************************************************************
ansible-test-target1       : ok=7    changed=6    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
ansible-test-target2       : ok=7    changed=6    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0



install_nginx.yamlの"tasks"部分で記述した工程がすべて処理されました。途中省略しましたが、詳しく知りたかたはぜひ実施してみください。


それでは、管理ノード2台にブラウザからhttpでアクセスしてみます。

http://パブリックIP1
http://パブリックIP2


ansible-nginx-installテスト
パブリックIPはマネージメントコンソールから確認できます


↓1台目

ansible-nginx-install結果1


↓2台目

ansible-nginx-install結果2


管理ノードとして指定した2台とも格納したhtmlが読み込まれていますね。今回のハンズオンは以上です。


まとめ

Ansibleはインフラ自動化ツールの中でも非常に知名度が高く、今後ますます普及していくでしょう。Ansibleはインフラエンジニアにとって必須のスキルになるかもしれません。ぜひ使ってみてください。


今回のハンズオンでは、nginxをインストール・起動し、HTMLが正常に表示されることを確認しました。次回はTestinfraを利用して、nginxが正しく動作しているか(runningやenableの状態)をサーバから確認する方法を紹介します。

参考リンク:Deconstructing an Ansible playbook