インフラ自動化ツールが一般的になってきていて、新規でプロジェクトを立ち上げる際には、まずはAnzibleやTerraformなどの自動化ツールの利用が検討されるのではないでしょうか。
今回の記事では、Anasibleを使ってみたい方向けにAnsibleの基本的な使い方をハンズオン形式で紹介していきます。
具体的には複数台のサーバに対し、命令を出すコントロールノードからnginxのインストール・起動を実行するハンズオンです。コマンドを実行していくだけなので、初めての方でもスムーズにできるかと思います。
☆☆☆☆☆☆☆☆☆↓Ansibleの用語をまずはチェック↓☆☆☆☆☆☆☆☆☆☆
https://cloud5.jp/saitou-ansible-summary/
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
Ansibleを使ってみよう
■構築イメージ
Anzsibleを利用して、複数台に一撃でnginxのインストールと起動を実施します。ですので、今回のハンズオンではAWSクラウド上に、命令を出すコントロールノード1台と、管理される管理ノードを2台のサーバを作成します。
■前提条件
前提条件は以下の通りです。
①サーバ要件
- EC2
項目 | 設定値 |
---|---|
os | Amazon Linux2023 |
パブリックIP | 有効 |
- SG インバウンドルール
タイプ | ソース |
---|---|
すべて許可 | VPC CIDR |
すべて許可 | MyIP |
EC2インスタンスに関しては、OSとパブリックIPの有効化以外は特に要件はありません。
また、コントロールノードから管理ノードに対して命令を実行するため、サーバ間の疎通確認と、ハンズオンの最後にnginxが起動しているかの動作確認をブラウザからアクセスして確認するために自身のローカル環境から接続できるようにMyIPを許可しておきましょう。
②キーファイルの格納
Ansibleを利用する場合、コントロールノードは管理ノードに対しSSH接続を行います。そのため、コントロールノードに接続するためのキーをどこかに保管しなければいけません。
ハンズオン実施前に、管理ノード起動時に設定したキーペアのキーファイル(.pem)をコントロールノードの/home/ec2-user/.ssh/に保管しておいてください。わたしはscpでローカルから格納しました。
■ansibleインストール
まずはコントロールノードにansibleをインストールします。
↓コントロールノードで以下のコマンドを実行します。
sudo dnf update -y
sudo 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
[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.txt
ansible 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
[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://43.206.218.125
http://43.207.118.203
↓1台目
↓2台目
管理ノードとして指定した2台とも格納したhtmlが読み込まれていますね。
今回のハンズオンは以上です。
まとめ:
Ansibleはインフラの自動化ツールの中でも知名度の高いツールです。今後はさらに普及し、Ansibleはインフラエンジニアの必須スキルになるかもしれません。ぜひ使ってみてください。
今回のハンズオンでは、htmlが表示されてヨシとしました。次回はTestinfraを利用して、nginxのrunningやenableをサーバから確認してみます。
参考サイトリンク:Deconstructing an Ansible playbook
↓ほかの協栄情報メンバーのIaCについての記事を公開しています。ぜひ参考にしてみてください。
■【初心者向け】Ansibleについてざっくりまとめてみた更(齊藤弘樹)
https://cloud5.jp/saitou-ansible-summary/
■Ansible Automation Controllerでのパッチ適用自動化は上手く行かない?(Kuroda)
https://cloud5.jp/ansible-automation-controlle/
■【AWS】Terraformを使うための環境準備(齊藤弘樹)
https://cloud5.jp/saitou-terraform-start/