IBM Cloud Docs
VPC での仮想サーバー・インスタンスへのソフトウェアのインストール

VPC での仮想サーバー・インスタンスへのソフトウェアのインストール

このチュートリアルでは、費用が発生する場合があります。 コスト見積もりツールを使用して、予測使用量に基づいてコスト見積もりを生成します。

このチュートリアルでは、Terraform や Ansible などの Infrastructure as Code (IaC) ツールを使用して、IBM Cloud® Virtual Private Cloud (VPC) インフラストラクチャーをプロビジョニングし、仮想サーバー・インスタンス (VSI) にソフトウェアをインストールする方法について説明します。

このチュートリアルのアーキテクチャーの紹介の後に、このチュートリアル用の環境を準備してから、IBM Cloud でのソフトウェア・インストールの基礎を確認してください。 その時点で、すべてのテクノロジーを評価するか 、Terraformなどの 特定のスタンドアロンセクションにジャンプするかを決定できます Ansible

目標

  • IBM が提供するオペレーティング・システム・ソフトウェアについて理解します。
  • オペレーティング・システム・ソフトウェアの更新と新規ソフトウェアのインストールを手動で行う手順を使用します。
  • IBM Cloud CLI、Terraform、および Ansible を使用して、リソースのプロビジョニングとソフトウェア・インストールを自動化する方法について理解します。

このチュートリアルでは、別のチュートリアルの仮想プライベート・クラウド内のパブリック・フロントエンドとプライベート・バックエンドで紹介されている構成をデプロイします。 インターネット接続のないバックエンド・サーバーと通信する、パブリック・インターネットからアクセス可能なフロントエンド・サーバーをプロビジョンします。

仮想
におけるパブリックフロントエンドとプライベートバックエンドのアーキテクチャ*
のアーキテクチャ図*

この構成には、パブリック IP アドレスなしでプロビジョンされたインスタンスへのセキュア接続を可能にする踏み台サーバーとして機能する要塞ホストも組み込まれています。

Bastion ホストのアーキテクチャー
Bastion ホストのアーキテクチャー

リソースのプロビジョニング中に、仮想サーバー・インスタンスへのアプリケーションのデプロイも行います。 アプリケーションをクラウドにデプロイする際、次の異なるソースに由来するソフトウェアを使用することができます。

  1. ローカル・ワークステーションのファイル・システム - 必要なインフラストラクチャーを作成するための Terraform のようなツールを使用するか、またはソフトウェアを仮想サーバー・インスタンスにインストールして構成するための Ansible、ssh、および scp を使用します。
  2. IBM ミラー - オペレーティング・システムの更新用、またはサポートされるパッケージのインストール用。
  3. インターネットまたはイントラネットのソフトウェア・リポジトリー。

からソフトウェアをインストールするためのさまざまなソースを示すアーキテクチャー図。
からソフトウェアをインストールするためのさまざまなソースを示しています。

これらの各種ソースの使用方法を説明します。

開始前に

VPC SSH 鍵の作成

仮想サーバー・インスタンスをプロビジョニングする際、後でサーバーに接続できるように SSH 鍵がインスタンスに注入されます。

  1. ローカル・マシンに SSH 鍵がない場合は、こちらの手順を参照して VPC の鍵を作成します。 デフォルトでは、秘密鍵は $HOME/.ssh/id_rsa にあります。
  2. SSH 鍵を 「コンピュート / SSH 鍵 (Compute / SSH keys)」「VPC コンソール (VPC console)」 で追加します。 このチュートリアルで他のリソースを作成する予定のリソース・グループと同じリソース・グループにキーを必ず作成してください。

環境変数の設定

このチュートリアルには、VPC 環境でリソースをプロビジョンしてソフトウェアをインストールまたは更新するためのさまざまな選択肢を例示するために、サンプル・コードが用意されています。

ここでは、端末でシェル、terraform、および ansible を使用する場合の手順例を説明します。 これらのツールは、後の手順でインストールします。 各スクリプトが機能するためには、一連の環境変数を定義する必要があります。

  1. チュートリアルの ソース・コード・リポジトリーを複製します。

    git clone https://github.com/IBM-Cloud/vpc-tutorials.git
    
  2. ソース・コードのディレクトリーを指す CHECKOUT_DIR という名前の変数を定義します。

    cd vpc-tutorials
    export CHECKOUT_DIR=$PWD
    
  3. チュートリアルのディレクトリーに移動します。

    cd $CHECKOUT_DIR/vpc-app-deploy
    
  4. 構成ファイルをコピーします。

    cp export.template export
    
  5. export ファイルを編集し、環境変数の各値を設定します。

    • TF_VAR_ibmcloud_api_key は IBM Cloud API キーです。 これはコンソールで作成できます。

    • TF_VAR_ssh_key_name は、前のセクションで指定された VPC SSH 公開鍵の名前です。 この鍵は、ワークステーション上の秘密鍵を介したセキュア SSH アクセスを提供するために仮想サービス・インスタンスにロードされる公開鍵です。 CLI を使用して、これが存在することを確認します。

      ibmcloud is keys
      
    • TF_VAR_resource_group_name は、リソースが作成されるリソース・グループです。 リソース・グループの作成と管理を参照してください。

    • TF_VAR_region は、リソースが作成される地域です。 このコマンドは、以下の地域を表示します。

      ibmcloud is regions
      
    • TF_VAR_zone は、リソースが作成されるゾーンです。 このコマンドは、ゾーンを表示します。

      ibmcloud is zones
      
    • TF_VAR_ssh_agent は、パスフレーズで保護された SSH 鍵が使用されることを示します。 変数を使用可能にするには、変数のコメントを外します。 次に、 ssh-add ~/.ssh/id_rsa を使用して、SSH 鍵を認証エージェントに追加します。

  6. 変数を環境にロードします。

    source export
    

    これ以降の各セクションでは常に同じ端末ウィンドウを使用するようにしてください。新しいウィンドウを使用する場合は、確実に環境変数を設定してくださいexport 内の環境変数は、便宜上 、Terraform形式TF_VAR_ の接頭辞に注目)になっています。 これらは後続のセクションで使用されます。

ソフトウェア・インストールの基本

基本イメージからの仮想サーバー・インスタンスのプロビジョン

仮想サーバー・インスタンスをプロビジョニングする際、IBM から提供される事前定義のオペレーティング・システム・イメージのセットから基本イメージを選択します。 ibmcloud is images を使用して、使用できるイメージのリストを検索します。

IBM には、IBM イメージをサポートするための 内部ミラー があります。 これらのミラーには、IBM 提供のイメージに含まれるソフトウェアの新バージョンと、ディストリビューションに関連付けられているオプション・パッケージが含まれています。 これらのミラーは、IBM Cloud VPC で使用可能なサービス・エンドポイントの一部です。 ミラーを読み取るための受信には費用はかかりません。

プロビジョンされたインスタンスで使用できるバージョン・リストを更新 することと、インストールされたソフトウェアをこれらのミラーからアップグレード することの両方を検討してください。

cloud-init を使用したクラウド・インスタンスの初期設定とカスタマイズ

仮想サーバーインスタンスをプロビジョニングする際には、サーバーの初期化中に実行する cloud-initスクリプトを指定することができます。 cloud-init は、クラウド・インスタンスの最初の初期設定を処理するマルチディストリビューション・パッケージです。 その中では、クラウド・インスタンスの初期設定をエンコードするためのファイル・フォーマットのコレクションが定義されています。

IBM Cloud では、サーバーがプロビジョンされるときに、cloud-init のファイル内容が user-data パラメーター内に提供されます。 許容されるユーザー データ コンテンツについては、「ユーザー データ形式」を参照してください。 スクリプトの実行をデバッグする必要がある場合、cloud-init は初期設定スクリプトの出力を仮想サーバー・インスタンスの /var/log/cloud-init-output.log 内に記録します。

このチュートリアルでは、初期化スクリプトとしてシェルスクリプトを使用します。 install.sh 初期化スクリプトとして使用します

#!/bin/bash
set -x
apt-get update
apt-get install -y nginx
indexhtml=/var/www/html/index.html

# Demonstrate the availability of internet repositories.  If www.python.org is availble then other software internet software like
# npm, pip, docker, ...  if isolated only the software from the ibm mirrors can be accessed
if curl -o /tmp/x -m 3 https://www.python.org/downloads/release/python-373/; then
    echo INTERNET > $indexhtml
else
    echo ISOLATED > $indexhtml
fi

このスクリプトで、インストールされたソフトウェアのアップグレードと、オペレーティング・システムで提供されるソフトウェア・インストール・ツールを使用した nginx と他のパッケージのインストールを行うと、分離されたインスタンスでさえ IBM 提供のミラーにアクセスできることが分かります。 Ubuntu の場合、apt-get コマンドでミラーにアクセスします。

www.python.org にアクセスする curl コマンドは、インターネットからソフトウェアへのアクセスを試行してインストールが可能であるかどうかを確認する試行を例示しています。

このスクリプトは、ホストにインターネット接続があるかどうかに基づいて、index.html によって提供される nginx ページを変更します。

ファイル・システムからアップロードしてインスタンスで実行する

オンプレミス・システムのファイル・システムまたは CI/CD パイプラインで利用できるデータとソフトウェアが存在する場合がありますが、それらは仮想サーバー・インスタンスにアップロードしてから実行する必要があります。

そのような場合、サーバーへの SSH 接続を使用して scp によってファイルをアップロードしてから、ssh によってサーバー上でスクリプトを実行できます。 これらのスクリプトは、インターネット、またはオンプレミス・システム (オンプレミス・システムとクラウドの間の VPN などの接続を確立している場合) からソフトウェア・インストーラーを取得することもできます。

チュートリアルのコードには、 という名前のスクリプトが含まれています。 uploaded.sh これは、ワークステーションから仮想サーバーインスタンスにアップロードされます(手動または Terraform や Ansible のような自動化ツールを使用して)。

後のセクションでは、スクリプトを使用して test_provision.bash サーバーが正常にプロビジョニングされたか、インターネットにアクセスできるか(できないか)、 uploaded.sh スクリプトが正しく実行されたかを確認します。

IBM Cloud CLI およびシェル・スクリプトの使用

IBM Cloud CLI には、IBM Cloud で作成できるすべてのリソースと対話するためのコマンドが用意されています。 このセクションでは、これらのコマンドの使用方法について説明しますが、リソースは作成しません。 完全なソリューションをデプロイするには、Terraform を使用することをお勧めします。

開始前に

これらのステップに従って、コマンド・ライン (CLI) ツールをインストールします。

仮想サーバー・インスタンスのプロビジョンとソフトウェアのインストール

CLI には、コンピュート・リソースやネットワーク・リソースなど、すべての VPC 関連機能用の プラグイン があります。

  1. VPC リソースを操作する前に、現在のリソース・グループとリージョンを設定します。

    ibmcloud target -g $TF_VAR_resource_group_name -r $TF_VAR_region
    
  2. 仮想サーバー・インスタンスをプロビジョンするには、 ibmcloud is instance-create CLI コマンドを実行します。 In shared/install.sh cloud-initファイルは、フロントエンドおよびバックエンドサーバーを初期化するために使用されます。 以下のように、 --user-data パラメーターを使用してスクリプトを渡すことができます。

    ibmcloud is instance-create ... --user-data @shared/install.sh
    
  3. フロントエンド VSI とバックエンド VSI をデプロイして保守モードにすると、フロントエンド・サーバーなどにスクリプトを送信し、そのスクリプトを実行してインターネットからソフトウェアをインストールすることができます。 スクリプトをフロントエンド・サーバーに送信します。

    scp -F ../scripts/ssh.notstrict.config -o ProxyJump=root@$BASTION_IP_ADDRESS shared/uploaded.sh root@$FRONT_NIC_IP:/uploaded.sh
    

    次いで次のスクリプトを実行します。

    ssh -F ../scripts/ssh.notstrict.config -o ProxyJump=root@$BASTION_IP_ADDRESS root@$FRONT_NIC_IP sh /uploaded.sh
    

    サーバー上の ssh サービスが初期化されるまでに数分かかることがあり、 cloud-init スクリプトが完了するまでにさらに数分かかることがあります。 uploaded.sh スクリプトは、初期化が完了するのを待ってから終了します。

Terraform を使用したインフラストラクチャーのプロビジョン

Terraform を使用すると、インフラストラクチャを安全かつ予測可能な方法で作成、変更、改善することができます。 これは、API を宣言構成ファイルに体系化するオープン・ソース・ツールであり、体系化されたファイルは、チーム・メンバー間で共有してコードとして処理し、編集、レビュー、およびバージョン管理できます。

開始前に

指示に従って、Terraform および Terraform 用 IBM Cloud Provider プラグインをワークステーションにインストールします。

単一仮想サーバー・インスタンスのプロビジョン

より複雑なアーキテクチャーをデプロイする前に、Terraform プロバイダーのインストールを検証するために、浮動 IP を持つ単一の仮想サーバー・インスタンスをデプロイしてから、このサーバーに SSH を使用してアクセスします。

main.tf Terraformスクリプトのファイルを確認します。 このファイルでは、先ほど定義した環境変数が使用されます。

  1. この例で使用する Terraform スクリプトのフォルダーに移動します。

    cd $CHECKOUT_DIR/vpc-app-deploy/tfinstance
    
  2. Terraform を初期設定します。

    terraform init
    
  3. Terraform プランを適用します。

    terraform apply
    

    このスクリプトでは、VPC と VSI が作成され、SSH アクセスが有効になります。

  4. プランによって生成された出力を表示します。

    terraform output
    
  5. 上のコマンドの出力をコピー・アンド・ペーストすることも、次のように terraform output を使用して VSI に SSH 接続することもできます

    $(terraform output -raw sshcommand)
    

    Terraform プランの適用後に他のスクリプトでリソース・プロパティーを再利用する場合には、Terraform の出力を使用すると手軽に作業ができる可能性があります。

  6. Terraform によって作成されたリソースを削除します。

    terraform destroy
    

サブネットおよび仮想サーバー・インスタンスのプロビジョン

vpc-tutorials リポジトリーの vpc-app-deploy/tf フォルダーの下にある一連の Terraform ファイルによって、仮想プライベート・クラウド内のパブリック・フロントエンドとプライベート・バックエンド・チュートリアルのアーキテクチャーが実装されます。

スクリプトには vpc-app-deploy/tf/main.tf リソースの定義が含まれています。 これを使って、ここでの他のチュートリアルで共有される Terraform モジュールがインポートされます。

   module vpc_pub_priv {
     source = "../../vpc-public-app-private-backend/tfmodule"
     basename = "${local.BASENAME}"
     ssh_key_name = "${var.ssh_key_name}"
     zone = "${var.zone}"
     backend_pgw = false
     profile = "${var.profile}"
     image_name = "${var.image_name}"
     resource_group_name = "${var.resource_group_name}"
     maintenance = "${var.maintenance}"
     frontend_user_data = "${file("../shared/install.sh")}"
     backend_user_data = "${file("../shared/install.sh")}"
   }

この定義には、以下のものが含まれています。

  • backend_pgw は、バックエンド・サーバーがパブリック・インターネットにアクセスできるかどうかを制御します。 パブリック・ゲートウェイは、バックエンド・サブネットに接続できます。 フロントエンドには、パブリック IP とインターネットへのゲートウェイの両方を提供する浮動 IP が割り当てられます。 これにより、ソフトウェア・インストールのためのオープンなインターネット・アクセスが可能になります。 バックエンドは、インターネットにアクセスできません。
  • frontend_user_databackend_user_data は、cloud-init 初期設定スクリプトを指し示します。

Terraform では、すべてのリソースをプロビジョナーに関連付けることができます。 null_resource プロビジョナーはクラウド・リソースをプロビジョンしませんが、ファイルをサーバー・インスタンスにコピーするために使用できます。 この構造は、スクリプトでファイルをコピーし、 uploaded.sh ファイルをコピーし、次に実行します。 サーバーに接続するために、Terraformはチュートリアルで用意された通り、 バスタードホストを使用することをサポートしています

   resource "null_resource" "copy_from_on_prem" {
     connection {
       type        = "ssh"
       user        = "root"
       host        = "${module.vpc_pub_priv.frontend_network_interface_address}"
       private_key = "${file("~/.ssh/id_rsa")}"
       bastion_user        = "root"
       bastion_host        = "${local.bastion_ip}"
       bastion_private_key = "${file("~/.ssh/id_rsa")}"
     }
     provisioner "file" {
       source      = "../shared/${local.uploaded}"
       destination = "/${local.uploaded}"
      }
     provisioner "remote-exec" {
       inline      = [
         "bash -x /${local.uploaded}",
        ]
     }
   }

リソースをプロビジョンするには、以下のようにします。

  1. Terraform スクリプトのフォルダーに移動します。
    cd $CHECKOUT_DIR/vpc-app-deploy/tf
    
  2. Terraform を初期設定します。
    terraform init
    
  3. Terraform プランを適用します。
    terraform apply
    
  4. プランによって生成された出力を表示します。
    terraform output
    

仮想サーバーの構成のテスト

Terraform でリソースがデプロイされたので、それらが正しくプロビジョンされたことを検証できます。

  1. フロントエンド仮想サーバー・インスタンスにアクセスできることと、このインスタンスがインターネットにアウトバウンド・アクセスできることを検証します。
    ../test_provision.bash $(terraform output -raw FRONT_IP_ADDRESS) INTERNET hi
    
    コマンド出力は次のようになるはずです。
    success: httpd default file was correctly replaced with the following contents:
    INTERNET
    success: provision of file from on premises worked and was replaced with the following contents:
    hi
    
  2. バックエンドに要塞ホストを介してアクセスできることと、バックエンドがインターネットにアクセスできないことを検証します。
    ../test_provision.bash $(terraform output -raw BACK_NIC_IP) ISOLATED hi "ssh -F ../../scripts/ssh.notstrict.config root@$(terraform output -raw FRONT_NIC_IP) -o ProxyJump=root@$(terraform output -raw BASTION_IP_ADDRESS)"
    
    コマンド出力は次のようになるはずです。
    success: httpd default file was correctly replaced with the following contents:
    ISOLATED
    success: provision of file from on premises worked and was replaced with the following contents:
    hi
    

リソースを削除する

  1. Terraform によって作成されたリソースを削除します。
    terraform destroy
    

Ansible を使用したソフトウェアのインストール

AnsibleChefPuppet と同様の構成管理およびプロビジョニングツールであり、クラウドにおける多層アプリケーションのデプロイとプロビジョニングを自動化するように設計されています。 Python で作成されている Ansible は、YAML 構文を使用して自動化タスクを記述するので、容易に Ansible を学習して使用することができます。

Ansible は VPC リソースのプロビジョンとソフトウェアのインストールに使用することもできますが、このセクションでは、Terraform を使用して VPC リソースをプロビジョンし、Ansible を使用してソフトウェアをデプロイします。

開始前に

このセクションでは、Terraform と Ansible の両方を使用します。

  1. 指示に従って、Terraform および Terraform 用 IBM Cloud Provider プラグインをワークステーションにインストールします。
  2. この手順 に従って、 Ansibleをインストールします。

Ansible playbook

Ansible playbook には、実行するタスクが用意されています。 以下の例には、nginx のインストールとスクリプトのアップロードに必要な一連のタスクが含まれています。 前述の cloud-init スクリプトとの類似性に気付くことでしょう。 uploaded.sh スクリプトは同一です。

- hosts: FRONT_NIC_IP BACK_NIC_IP
  remote_user: root
  tasks:
  - name: update apt cache manual
    # this should not be required but without it the error: Failed to lock apt for exclusive operation is generated
    shell: apt update
    args:
      executable: /bin/bash
  - name: update apt cache
    apt:
      update_cache: yes
  - name: ensure nginx is at the latest version
    apt:
      name: nginx
      state: latest
    notify:
    - restart nginx
  - name: execute init.bash
    script: ./init.bash
  - name: upload execute uploaded.sh
    script: ../shared/uploaded.sh
  handlers:
    - name: restart nginx
      service:
        name: nginx
        state: restarted

Ansible Inventory

Ansible は、インフラストラクチャー内にある複数のシステムに対する処理を同時に行います。 Ansible inventory には、これらのシステムのリストが含まれています。 チュートリアルでは、 inventory.bash Terraformの出力から Ansible のインベントリを生成するスクリプトを提供しています。

#!/bin/bash
TF=tf
printf 'all:
  children:
    FRONT_NIC_IP:
      hosts:
        %s
    BACK_NIC_IP:
      hosts:
        %s
' $(cd $TF; terraform output -raw FRONT_NIC_IP) $(cd $TF; terraform output -raw BACK_NIC_IP)

サブネットおよび仮想サーバー・インスタンスのプロビジョン

vpc-app-deploy/ansible/tf ディレクトリには、ソフトウェアのインストールを除いて、前節で説明したものと同様の Terraform 構成が含まれています。 Ansible スクリプトは、ミラーにあるソフトウェアをインストールしてから、ワークステーションからソフトウェアをアップロードします。

  1. この例で使用する Ansible スクリプトのフォルダーに移動します。
    cd $CHECKOUT_DIR/vpc-app-deploy/ansible/tf
    
  2. Terraform を初期設定します。
    terraform init
    
  3. Terraform プランを適用します。
    terraform apply
    
  4. プランによって生成された出力を表示します。
    terraform output
    
  5. Ansible inventory を生成します。
    cd .. && ./inventory.bash > inventory
    
  6. フロントエンド・サーバーにソフトウェアをプロビジョンします。
    ansible-playbook -T 40 -l FRONT_NIC_IP -u root \
      --ssh-common-args "-F ../../scripts/ssh.notstrict.config -o ProxyJump=root@$(cd tf; terraform output -raw BASTION_IP_ADDRESS)" \
      -i inventory lamp.yaml
    
  7. バックエンド・サーバーにソフトウェアをプロビジョンします。
    ansible-playbook -T 40 -l BACK_NIC_IP -u root \
      --ssh-common-args "-F ../../scripts/ssh.notstrict.config -o ProxyJump=root@$(cd tf; terraform output -raw BASTION_IP_ADDRESS)" \
      -i inventory lamp.yaml
    

仮想サーバーの構成のテスト

Terraform でリソースがデプロイされ、Ansible でソフトウェアがインストールされたので、それらが正しくプロビジョンされたことを検証できます。

  1. フロントエンド仮想サーバー・インスタンスにアクセスできることと、このインスタンスがインターネットにアウトバウンド・アクセスできることを検証します。
    ../test_provision.bash $(cd tf && terraform output -raw FRONT_IP_ADDRESS) INTERNET hi
    
    コマンド出力は次のようになるはずです。
    success: httpd default file was correctly replaced with the following contents:
    INTERNET
    success: provision of file from on premises worked and was replaced with the following contents:
    hi
    
  2. バックエンドに要塞ホストを介してアクセスできることと、バックエンドがインターネットにアクセスできないことを検証します。
    ../test_provision.bash $(cd tf && terraform output -raw BACK_NIC_IP) ISOLATED hi "ssh -F ../../scripts/ssh.notstrict.config root@$(cd tf && terraform output -raw FRONT_NIC_IP) -o ProxyJump=root@$(cd tf && terraform output -raw BASTION_IP_ADDRESS)"
    
    コマンド出力は次のようになるはずです。
    success: httpd default file was correctly replaced with the following contents:
    ISOLATED
    success: provision of file from on premises worked and was replaced with the following contents:
    hi
    

リソースを削除する

  1. Terraform によって作成されたリソースを削除します。

    cd $CHECKOUT_DIR/vpc-app-deploy/ansible/tf
    

    および

    terraform destroy
    

リソースによっては、即時に削除されずに保持される場合があります (デフォルトでは 7 日間)。 リソースを完全に削除して再利用することも、保存期間内に復元することもできます。 リソースの再利用を使用する方法については、この資料を参照してください。