システム構築を自動化してみる[前編]

システム構築を自動化してみる[前編]

こんにちは、田島と申します。『Ansibleによるシステム構成管理:基礎からCloud Modulesを使ったAWS構築まで』という講座を受講中です。触って3日目の感想は、Vagrant ・Ansible凄い!です。

ローカル作業環境構築 

Windows10Home(BIOSでバーチャライゼーション(VT)を有効に)
※Windows7以上で64ビットマシンが好ましいそうです。

イラストのようにVirtualBox上に仮想マシンをふたつ作成し
プロビジョニングサーバとサンドボックスサーバと呼びます。
プロビジョニングサーバでansible-playbookを実行し、サンドボックスサーバに対して変更を行っていきます。

以下のソフトウェアの最新版をダウンロードし、インストールします。(2021/01/22時点)
Vagrant(vagrant_2.2.14_x86_64.msi)
Git For Windows(Git-2.30.0.2-64-bit.exe)
Visial Studio Code (VSCodeUserSetup-x64-1.52.1.exe)
VirtualBox(VirtualBox-6.1.18-142142-Win.exe)

※プロビジョニングサーバのvagrantfileです※
Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"
  config.vm.synced_folder "../../", "/vagrant", type: "virtualbox", owner: "vagrant", group: "vagrant"
  config.vm.hostname = "l4a-provisioning.localdomain"
  config.vbguest.auto_update = true
  config.vm.provider "virtualbox" do |v|
    v.name = "l4a-provisioning"
    v.customize ["modifyvm", :id, "--memory", "1024"]
  end
  config.vm.network "private_network", ip: "192.168.149.10"
  # Server Provisioning
  config.vm.provision "shell", inline: <<-SHELL
#! /bin/bash
# Copy Private Key ( this is only for provisioning server )
echo "- Copy Private Key"
tee /home/vagrant/.ssh/id_rsa <<EOS > /dev/null
-----BEGIN RSA PRIVATE KEY-----
(※鍵ファイル中身)
-----END RSA PRIVATE KEY-----
EOS
chown vagrant /home/vagrant/.ssh/id_rsa
chmod 600 /home/vagrant/.ssh/id_rsa
# Copy Public Key
echo "- Copy Public Key"
echo "ssh-rsa 
(※鍵ファイル)  >> /home/vagrant/.ssh/authorized_keys
sort -u /home/vagrant/.ssh/authorized_keys -o /home/vagrant/.ssh/authorized_keys
echo "####################"
echo "install middleware"
echo "####################"
echo "- pip"
type pip > /dev/null 2>&1
if [ $? != 0 ]; then
  curl -kL https://bootstrap.pypa.io/get-pip.py | python
  echo "OK"
else
  echo "already exist"
fi
# Install ansible
echo "- ansible"
type ansible > /dev/null 2>&1
if [ $? != 0 ]; then
  pip install ansible
  pip install boto3
  pip install openpyxl
  echo "OK"
else
  echo "already exist"
fi
# add hosts to /etc/hosts
if [ ! `cat /etc/hosts | grep -q sandbox` ]; then
  echo "192.168.149.11 l4a-sandbox.localdomain" >> /etc/hosts
  echo "add sandbox to /etc/hosts"
fi
  SHELL
end
※サンドボックスサーバのvagrantfileです※
Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"
  config.vbguest.auto_update = true
  config.vm.hostname = "l4a-sandbox.localdomain"
  config.vm.provider "virtualbox" do |v|
    v.name = "l4a-sandbox"
    v.customize ["modifyvm", :id, "--memory", "1024"]
  end
  config.vm.network "private_network", ip: "192.168.149.11"
  config.vm.network :forwarded_port, host: 10080, guest: 80
  config.vm.network :forwarded_port, host: 10443, guest: 443
  config.vm.network :forwarded_port, host: 13306, guest: 3306
  config.vm.synced_folder "../../", "/vagrant", type: "virtualbox", owner: "vagrant", group: "vagrant"
  # Server Provisioning
  config.vm.provision "shell", inline: <<-SHELL
#! /bin/bash
# Copy Public Key
echo "- Copy Public Key"
echo "ssh-rsa 
(※鍵ファイ中身) >> /home/vagrant/.ssh/authorized_keys
sort -u /home/vagrant/.ssh/authorized_keys -o /home/vagrant/.ssh/authorized_keys
  SHELL
end

作業用のディレクトリを作成しvagrantfileを置きます

Visial Studio Codeの環境を整えます。(利用するターミナルや日本語化)

いよいよvagrant up を実行します。が、
The following SSH command responded with a non-zero exit status.
のエラーがでます。
のでこちら
https://qiita.com/hide4649/items/d009db2579621cffd9c1
を参考にしました。

プロビジョニングサーバ自体は作成出来ているので、vagrant ssh で接続します。
接続出来たら、sudo yum update します。
さらに、
yum install kernel-devel
yum -y update kernel
yum -y install kernel-devel kernel-headers dkms gcc gcc-c++

(カーネルとカーネルヘッダファイルのアップデートです。
これらの作業は環境によって時間がかかります)

exitでいったん抜けてvagrant reload します。
(環境によってはreloadするだけでいいのかもしれない)
同じ作業をサンドボックスサーバでも実施します。しかし、
yum -y install kernel-devel kernel-headers dkms gcc gcc-c++
exitして vagrant reloadしたところでまたエラーが出てしまいました。

今度はまれなエラーということなので、ググってみまして
https://qiita.com/sola-msr/items/604614353e678f7d2d08
を参考に、
vagrant plugin update

vagrant plugin repair
を実施し再度
vagrant reload
して無事に作成完了しました。

プロビジョニングサーバからサンドボックスサーバにsshしてみます。
(赤枠がプロビジョニングサーバのhosts。サンドボックスサーバIPが書き込まれています。青枠がssh)

無事ssh成功。一安心。ここまで2日半経過(汗

★playbookって?
例えばApacheをインストールできるらしい。

※今回のansible-playbook.yml
- hosts: sandbox
  become: yes
  become_user: root
  tasks:
    - name: Install http server
      yum: 
        name: httpd
    - name: Start http server
      service: 
        name: httpd
        state: started
        enabled: yes

サンドボックスサーバで
rpm -qa grep httpd
を実行し、インストールされているパッケージの一覧にhttpdがあるか探します。さらに
ps -aux | grep httpd
を実行しプロセスも確認します。
a->自分以外のユーザーのプロセスについても表示
x->デーモンプロセスを表示
u->ユーザー名と開始時刻を表示

httpdがないことを確認し、ansible-playbookしApacheをインストールします。(図のみどり枠)

プロビジョニングサーバで
ansible-playbook -i inventory/hosts playbook.yml

実行OK。サンドボックスサーバで確認すると、Apacheインストールされていてデーモンも動いています。(図のピンク枠)

ブラウザでlocalhost:10080を表示
※http80番はポート10080とサンドボックスサーバのvagrantfileに書いてある。

ローカルにAmazon Linux2 を構築

まずはローカル環境に追加でAmazon Linux2を作成します。
使用するboxイメージ(winky/amazonlinux-2)を確認し
hostname、IPアドレス、待ち受けポート番号部分について
vagrantfileを書き換えます。

Vagrant.configure("2") do |config|
  config.vm.box = "winky/amazonlinux-2" ←ここ
  config.vbguest.auto_update = true
  config.vm.hostname = "l4a-ec2-sandbox.localdomain"  ←ここ
  config.vm.provider "virtualbox" do |v|
    v.name = "l4a-ec2-sandbox" ←ここ
    v.customize ["modifyvm", :id, "--memory", "1024"]
  end
  config.vm.network "private_network", ip: "192.168.149.12" ←ここ
  config.vm.network :forwarded_port, host: 20080, guest: 80 ←ここ
  config.vm.network :forwarded_port, host: 20443, guest: 443 ←ここ
  config.vm.network :forwarded_port, host: 23306, guest: 3306 ←ここ
  config.vm.synced_folder "../../", "/vagrant", type: "virtualbox", owner: "vagrant", group: "vagrant"
  # Server Provisioning
  config.vm.provision "shell", inline: <<-SHELL
#! /bin/bash
# Copy Public Key
echo "- Copy Public Key"
echo "ssh-rsa 
(※鍵ファイル中身) >> /home/vagrant/.ssh/authorized_keys
sort -u /home/vagrant/.ssh/authorized_keys -o /home/vagrant/.ssh/authorized_keys
  SHELL
end

これでローカル環境の仮想サーバが
プロビジョニングサーバ(CentOS7)
サンドボックスサーバ(CentOS7)
EC2サンドボックスサーバ(AmazonLinux2)
の3台になりました。※以降サンドボックスサーバはEC2を使います。

ローカルのEC2へsshし、先ほど実施したansible-playbookを同じように実行していきます。(きちんとvagrantfileを書き替えることで難なく実行出来ました)

AWSにEC2を準備する


いよいよローカルではなく、AWSのEC2に対してansible-playbookを実施します。AWSにEC2を準備します。

※EC2(アマゾン・エラスティック・コンピュータークラウド)は仮想サーバを作るためのAWSのサービスです。ウェブサーバやDBサーバが、さくっと作成できます。

マネージメントコンソールでEC2→インスタンスの作成へ進み、

1.マシンイメージはAmazon Linux 2を選択します。

2.インスタンスタイプは、t2micro(無料枠)を選択します。

3.インスタンスの詳細の設定では、自動割り当てパブリックIPを必ず有効にし、他はデフォルトまたは任意のネットワークやサブネットを設定します。

4.ストレージの追加では、ストレージは8ギガのままにします。

5.タグの追加で
Name に「l4a-web01」

6.セキュリティグループで
セキュリティグループ名「l4-web」
説明 Lesson for ansible web server
HTTPと HTTPSを追加します。

既存のキーペアか、新規のキーペアかを選択します。
lesson.pemファイル(秘密鍵)を任意の名前で作成し、保存しておきます。
※この鍵は今回の学習用です。

作成中。

ローカルのプロビジョニングサーバからAmazon EC2にログインできるか確認します。プロビジョニングサーバの.sshにlesson.pemファイルを置きます。

Amazon EC2 の パブリックDNSネーム(一部伏字)でログインできるか試します。プロビジョニングサーバで
ssh -l ec2-user -i .ssh/lesson.pem ec2-なんとかなんとか.ap-northeast1.compute.amazonaws.com
鍵のパスフレーズを入力するように作成していたら、入力する。
しかし、ログインできない。
パーミッションがだめだということなので(図の青枠)
600に変更する

無事ログイン出来ました。しかし、sshをもっと短く実行したいので、sshのコンフィグファイルを修正します。

いったんローカルのプロビジョニングサーバに戻り
vi ~/.ssh/config

Host l4a-web01
hostName ec2-なんとかなんとか.ap-northeast-1.compute.amazonaws.com
user ec2-user
Port 22
Identityfile ~/.ssh/lesson.pem
ServerAliveInterval 60

と編集、保存して、パーミッションを変更します。
chmod 600 ~/ssh/config
※600 自分しか読めない。
こうすることで、
ssh l4web01
(パスフレーズ入力)
でAWSのEC2サーバにログインできるようになります。



中編 に続きます。


※学習が終わったら作成したEC2のインスタンスは削除しておきます。
マネジメントコンソールから

当該インスタンスチェックして選択→当該インスタンス停止→
インスタンスの詳細でstoppedマークがついていることを確認→
当該インスタンスの終了→
インスタンス詳細でterminatedマークになり、
しばらくたつと当該インスタンスが一覧から消えている事を確認します。

お問い合わせ

キャレット合同会社へのお問い合わせやご相談などがありましたら、以下のメールフォームよりお気軽にご連絡ください。

Uncategorizedカテゴリの最新記事