SaltStackインフラストラクチャ:Salt-Cloudを構成してDigitalOceanリソースを起動する

前書き

SaltStack(Salt)は、構造化された反復可能な方法でインフラストラクチャを簡単に管理するために使用できる強力なリモート実行および構成管理システムです。 このシリーズでは、Saltデプロイメントから開発、ステージング、および実稼働環境を管理する1つの方法を示します。 Salt状態システムを使用して、繰り返し可能なアクションを記述および適用します。 これにより、後で同じ状態で簡単にオンラインに戻すことができるという知識があるため、環境を破壊することができます。

https://www.digitalocean.com/community/tutorials/saltstack-infrastructure-installing-the-salt-master [最後のガイド]では、Salt masterサーバーの初期構成を完了することから始めました。 これで、このサーバーが実行され、Saltコマンドを自分自身に発行できるようになります。 このガイドでは、 `+ salt-cloud +`コンポーネントを設定することにより、ソルトマスターの範囲を拡大します。 これにより、必要に応じてDigitalOceanアカウントに接続してリソースを増やすことができます。 個々のコンポーネントと環境全体のプロパティを定義するプロファイルを作成します。

前提条件

このチュートリアルを完了するには、https://www.digitalocean.com/community/tutorials/saltstack-infrastructure-installing-the-salt-master [このガイド]で説明されているようにSalt masterサーバーを設定する必要があります。 そのサーバーの非ルートユーザーアカウントを使用して、このガイドの手順を完了します。

DigitalOceanアカウントにもアクセスする必要があります。 `+ salt-cloud +`コマンドを使用してDigitalOcean APIを活用し、さまざまな環境を構成するサーバーを作成および制御します。 この目的のためにAPIトークンを作成する必要があります。これについてはガイドで説明します。

Main Cloud Minion構成を作成する

`+ / etc / salt / cloud +`に設定ファイルを作成することから始めます。 これは、作成するすべてのサーバーの共通オプションとして使用されます。 今すぐファイルを作成して開きます。

sudo nano /etc/salt/cloud

この時点で適用する設定は、作成する各サーバーに設定される `+ / etc / salt / minion `オプションのみです。 この情報の構造を開始するには、 ` minion:+`キーを使用します。

/ etc / salt / cloud

minion:

このキーの下で、SaltマスターサーバーのIPアドレスを指定することから始めます。 これは、Salt minionがプロビジョニング後にマスターに接続できるようにするため、最も重要な設定です。

/ etc / salt / cloud

minion:
 master:

Note

次に、いくつかの鉱山機能を設定する必要があります。 Saltミニオンは、Salt実行モジュールの結果をSaltマスターの中央リポジトリに送り返すように設定できます。 このシステムは、ミニオンサーバーが他のミニオンと重要な情報を共有するための手段を提供します。

2つの鉱山機能をセットアップします。 これらは、ミニオンのパブリックIPアドレスとプライベートIPアドレスをソルトマスターに返すだけです。 他のミニオンは、ピアへの接続方法を学習するために、この情報をマスターに照会できます。

/ etc / salt / cloud

minion:
 master:
 mine_functions:
   external_ip:
     - mine_function: network.interface_ip
     - eth0
   internal_ip:
     - mine_function: network.interface_ip
     - eth1

完了したら、ファイルを保存して閉じます。

DigitalOceanクラウドプロバイダーをセットアップする

次に、DigitalOceanクラウドプロバイダーファイルを構成します。 これには、DigitalOceanアカウントに接続するために必要な情報と、作成するサーバーに使用する一般的な設定が含まれます。

プロバイダー情報のディレクトリを作成することから始めます。

sudo mkdir -p /etc/salt/cloud.providers.d

内部で、 `+ do.conf +`というファイルを作成して開きます:

sudo nano /etc/salt/cloud.providers.d/do.conf

内部では、別のYAML構造を作成します。 構造内の最上位キーは、プロバイダーの名前になります。 ここでは「do」を使用します。 `+ driver `は、使用するクラウドを指定します。 SaltのDigitalOceanのドライバーは「 digital_ocean +」と呼ばれます:

/etc/salt/cloud.providers.d/do.conf

do:
 driver: digital_ocean

次に、DigitalOceanアカウントに移動してAPIトークンを作成する必要があります。 https://cloud.digitalocean.com/settings/applications [このリンク]に従うことにより、コントロールパネルのAPIセクションにアクセスできます。 ページの右上隅にある[新しいトークンを生成]ボタンをクリックします。

image:https://assets.digitalocean.com/articles/salt_series_cloud/generate_new_token.png [DigitalOcean create APIトークン]

次のページで、わかりやすい名前を入力し、「トークンを生成」をクリックします。

image:https://assets.digitalocean.com/articles/salt_series_cloud/name_token.png [DigitalOcean name token]

次のページの下部に向かって、新しいトークンが表示されます。

image:https://assets.digitalocean.com/articles/salt_series_cloud/new_token.png [DigitalOcean new token]

この値は再度表示されないため、ページを離れる前にこの値をコピーします。 これを忘れた場合は、トークンを破棄して新しいトークンを生成してください。

プロバイダー設定ファイルに戻り、 `+ personal_access_token +`オプションをコピーした生成されたトークンの値に設定します。

/etc/salt/cloud.providers.d/do.conf

do:
 driver: digital_ocean
 personal_access_token:

次に、SSHキー情報を指定します。 `+ salt-cloud `コマンドは、Salt minionをセットアップするために、最初にSSHを使用してサーバーにログインする必要があります。 SSH秘密鍵をまもなくコピーするファイルシステム上の場所を指すように、 ` ssh_key_file `キーを設定します。 ` ssh_key_names +`をDigitalOceanに追加したSSHキーの名前に設定する必要があります。

/etc/salt/cloud.providers.d/do.conf

do:
 driver: digital_ocean
 personal_access_token:
 ssh_key_file: /etc/salt/pki/cloud/do.pem
 ssh_key_names: ,

また、スクリプトとスクリプト引数を指定して、新しいミニオンにデプロイされるSaltの正確なバージョンを制御できるようにする必要があります。

/etc/salt/cloud.providers.d/do.conf

do:
 driver: digital_ocean
 personal_access_token:
 ssh_key_file: /etc/salt/pki/cloud/do.pem
 ssh_key_names: ,
 script: bootstrap-salt
 script_args: -P git

完了したら、ファイルを保存して閉じます。 次のように入力すると、Salt materによってプロバイダー構成が選択されていることがわかります。

sudo salt-cloud --list-providers
Outputdo:
   ----------
   digital_ocean:
       ----------

次のように入力して、APIキーをテストできます。

sudo salt-cloud --list-locations do

展開可能な地域のリストが表示されます。

SSHキーファイルを作成する

先に進む前に、プロバイダーファイルで参照したSSH秘密キーファイルを作成する必要があります。 必要なディレクトリ構造を作成することから始めます。

sudo mkdir -p /etc/salt/pki/cloud

次に、新しく作成したディレクトリ内に `+ do.pem +`というファイルを作成します。

sudo nano /etc/salt/pki/cloud/do.pem

プロバイダーファイルの `+ ssh_key_names +`ディレクティブで指定したDigitalOceanキーの1つに関連付けられているプラ​​イベートキーの内容を貼り付けます。 通常、* local computer *に次のように入力して、秘密鍵の内容を取得できます。

cat ~/.ssh/id_rsa

これは次のようになります。

ローカルコンピューターの〜/ .ssh / id_rsa

-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA39KuD8htHaIgUGFezpTsW0Y5XtNuoSTwVg/nih1rlVyKQIkJ
UhJRAakJ9ktQjSWdyAQr0i563WU1KYeHMzQuPPOQAK0vTbMjO5StuzqPEVfPPI1n
PIbMeAg9rjX5Lhy/jSOcTwf0E91jTMYuxkZCMCIDTzeVEFLV744APotQktCruJXf
L53cVUedOI1fQTEKGa1xEk92Ja4jm/Fn+4WKqYVTKRd2/vHX/ej8bI9Pomamskvc

. . .

hd4tdQKBgQCD8s2IbXVfGQ8x0D12a5K7sfysdnESF5I5ladEAoWP4wYctuGdlDso
lBl+jlm1di+1gPqBDMdJhic48ExRBVjKfB1adDeiwhzD4zNxFakhBXHjXHj6MBps
Oo/13JyvRs6QRpBolJfVaG1b5CAR+EhAJkxxCxWch8dlwE1gb9jxXw==
-----END RSA PRIVATE KEY-----

それを「+ / etc / salt / pki / cloud / do.pem +」のファイルに貼り付け、ファイルを保存して閉じます。

Saltがキーを使用するには、それを含むファイルとディレクトリに正しい権限が必要です。 次を入力して許可を設定します。

sudo chmod 700 /etc/salt/pki/cloud
sudo chmod 600 /etc/salt/pki/cloud/do.pem

これで、Saltは秘密キーを読み取り、それを使用して新しいサーバーにログインできます。

クラウドプロファイルのセットアップ

DigitalOceanプロバイダーが構成されたので、プロファイルを作成できます。 これらのプロファイルは、新しいサーバーインスタンスを構築するときに使用するプロパティを定義します。 いくつでも設定できます。

これらのファイルを `+ cloud.profiles.d +`ディレクトリに保存します。 今すぐそのディレクトリを作成します。

sudo mkdir -p /etc/salt/cloud.profiles.d

このガイドでは、構成する環境ごとに個別のファイルを使用します。 開発環境から始めましょう:

sudo nano /etc/salt/cloud.profiles.d/dev-profiles.conf

各プロファイルは、トップレベルのプロファイル名で指定されます。 名前は、提供された詳細を使用してドロップレットを作成するときに使用するものです。

最初に、 `+ base-dev +`プロファイルを指定します。 これには、すべての開発マシンで共有される基本的なプロパティが含まれます。 このガイドでは、NYC3リージョンの1ギガバイトドロップレットでUbuntu 14.04 64ビットを使用することを指定しています。 NYC3は、ソルトマスターが展開されている地域であり、必要に応じてプライベートネットワークを使用して通信できます。 これを念頭に置いて、プライベートネットワーク(これは構成で使用されます!)およびIPv6も有効にします。

これらのコマンドから返される情報を使用して、必要に応じてサイズと領域を変更できます。

sudo salt-cloud --list-locations do
sudo salt-cloud --list-sizes do

返される出力では、使用するサイズと場所に関連付けられている「スラッグ」は、構成内で使用する必要がある名前です。

上記のDroplet情報を使用すると、 `+ base-dev +`は次のようになります。

/etc/salt/cloud.profiles.d/dev-profiles.conf

base-dev:
 provider: do
 image: ubuntu-14-04-x64
 size: 1gb
 location: nyc3
 private_networking: True
 ipv6: True

このプロファイルは、必要な詳細のほとんどを提供しますが、ミニオンにいくつかのカスタムソルトグレインを含めることも必要です。 これらは、インフラストラクチャおよびそれらが属する環境で果たす役割に基づいて、特定のマシンをターゲットにするために使用されます。

これを行うには、基本プロファイルを「拡張」します。 拡張により、既存のプロファイルの特性を継承する新しいプロファイルを指定し、新しい値を追加できます。 ただし、継承はかなり難しいため、1つの拡張機能のみを許可します(拡張機能を拡張しません)。 また、リスト項目(グレインなど)は、以前のデータを追加するのではなく置換します(そのため、環境内のすべてのサーバーで共有されていても、ベースで環境を指定できませんでした)。

Webサーバー固有のプロファイルは非常に単純です。 元の属性をすべて使用し、指定した2つの粒子を追加します。 ロール「webserver」を使用しています。 これについては、チュートリアル全体で照合します。 開発環境は、「dev」値によって示されます。

/etc/salt/cloud.profiles.d/dev-profiles.conf

base-dev:
 provider: do
 image: ubuntu-14-04-x64
 size: 1gb
 location: nyc3
 private_networking: True
 ipv6: True

dev-web:
 extends: base-dev
 minion:
   grains:
     role: webserver
     env: dev

私たちのデータベースプロファイルは、ほぼ同じように機能します。 「webserver」ではなく「dbserver」ロールを使用し、「+ dev-db +」プロファイルIDを使用します。

/etc/salt/cloud.profiles.d/dev-profiles.conf

base-dev:
 provider: do
 image: ubuntu-14-04-x64
 size: 1gb
 location: nyc3
 private_networking: True
 ipv6: True

dev-web:
 extends: base-dev
 minion:
   grains:
     role: webserver
     env: dev

dev-db:
 extends: base-dev
 minion:
   grains:
     role: dbserver
     env: dev

完了したら、ファイルを保存して閉じます。

ステージング環境用に同様のファイルを作成します。 次を入力してファイルを作成します。

sudo nano /etc/salt/cloud.profiles.d/stage-profiles.conf

`+ base-stage `プロファイルは ` base-dev +`プロファイルとまったく同じです。 拡張プロファイルは、環境と名前のみを変更して、以前の定義とも厳密に一致します。 ロードバランサーの拡張プロファイルも追加します。これは、開発環境には存在しないサーバータイプであるためです。

/etc/salt/cloud.profiles.d/stage-profiles.conf

base-stage:
 provider: do
 image: ubuntu-14-04-x64
 size: 1gb
 location: nyc3
 private_networking: True
 ipv6: True

stage-web:
 extends: base-stage
 minion:
   grains:
     role: webserver
     env: stage

stage-db:
 extends: base-stage
 minion:
   grains:
     role: dbserver
     env: stage

stage-lb:
 extends: base-stage
 minion:
   grains:
     role: lbserver
     env: stage

完了したら、ファイルを保存して閉じます。

最後に、生産プロファイルを作成しましょう。

sudo nano /etc/salt/cloud.profiles.d/prod-profiles.conf

実稼働プロファイルは、ステージングプロファイルとほぼ完全に同一です。 文字列「stage」のすべてのインスタンスを「prod」に変更するだけです。

/etc/salt/cloud.profiles.d/prod-profiles.conf

base-prod:
 provider: do
 image: ubuntu-14-04-x64
 size: 1gb
 location: nyc3
 private_networking: True
 ipv6: True

prod-web:
 extends: base-prod
 minion:
   grains:
     role: webserver
     env: prod

prod-db:
 extends: base-prod
 minion:
   grains:
     role: dbserver
     env: prod

prod-lb:
 extends: base-prod
 minion:
   grains:
     role: lbserver
     env: prod

完了したら、ファイルを保存して閉じます。

次のように入力して、プロファイルがピックアップされていることをテストします。

sudo salt-cloud --list-profiles do

設定したすべてのプロファイルのリストが表示されます。

環境マップを作成する

これで、必要な個々のサーバーの作成方法を正確に定義するプロファイルが作成されました。 これらを使用して、必要なサーバーを一度に1つずつ簡単に作成できます。

ただし、 `+ salt-cloud +`は、「マップ」と呼ばれる追加の設定ファイルも活用できます。 マップを使用すると、作成する完全なインフラストラクチャの概要を説明するために、作成したプロファイルを参照できます。 プロファイルタイプごとに作成するサーバーの名前を指定します。

`+ cloud.maps.d +`というマップファイルを保持するディレクトリを作成します。

sudo mkdir -p /etc/salt/cloud.maps.d

開発環境を定義することから始めましょう。 このディレクトリ内で `+ dev-environment.map +`というファイルを作成して開きます:

sudo nano /etc/salt/cloud.maps.d/dev-environment.map

https://www.digitalocean.com/community/tutorials/saltstack-infrastructure-installing-the-salt-master [前の記事]で、設定する環境の概要を思い出した場合、開発環境は2つのサーバー:Webサーバーとデータベースサーバー。 これを知っていると、開発マップファイルは次のようになります。

/etc/salt/cloud.maps.d/dev-environment.map

dev-web:
 - dev-web

dev-db:
 - dev-db

最上位の項目は、リソースのプロビジョニングに使用されているプロファイルを示します。 プロファイル名の下にあるリスト(ダッシュで示されている)は、スピンアップするサーバーの名前を示しています。

この例では、「dev-web」というWebサーバーと「dev-db」というデータベースサーバーを定義します。 これらのサーバーは両方とも、「+ salt-cloud +」をこのファイルにポイントすることで同時に作成できます。 完了したら、ファイルを保存して閉じます。

次に、ステージング環境マップを作成しましょう。

sudo nano /etc/salt/cloud.maps.d/stage-environment.map

ステージング環境には、2つのWebサーバー、2つのデータベースサーバー、およびロードバランサーがあります。 冗長サーバーに番号を付けて、それらを区別します。 マップは次のようになります。

/etc/salt/cloud.maps.d/stage-environment.map

stage-web:
 - stage-www1
 - stage-www2

stage-db:
 - stage-db1
 - stage-db2

stage-lb:
 - stage-lb

これにより、合計5台のサーバーをプロビジョニングできます。 完了したら、ファイルを保存して閉じます。

最後に、次のように入力して、運用環境のマップファイルを作成できます。

sudo nano /etc/salt/cloud.maps.d/prod-environment.map

これは、ステージング環境マップにかなり似ています(使用されるサーバー名とプロファイルの明らかな例外を除きます)。 本番環境には追加のロードバランサーがあり、フェイルオーバーを構成できます。

/etc/salt/cloud.maps.d/prod-environment.map

prod-web:
 - prod-www1
 - prod-www2

prod-db:
 - prod-db1
 - prod-db2

prod-lb:
 - prod-lb1
 - prod-lb2

実稼働環境に必要なベアサーバーは、このファイルで試運転できます。 完了したら保存して閉じます。

テスト環境のプロビジョニング

マップファイルが作成されたので、環境の一部またはすべてを簡単に起動できます。

これを行う前に、Saltブートストラップスクリプトをマスターサーバーにダウンロードする必要があります。 マスターはミニオンに接続し、スクリプトをアップロードして実行し、作成したサーバーでソルトミニオンを起動します。

次のように入力して、ブートストラップスクリプトをダウンロードします。

sudo salt-cloud -u

このコマンドは、ブートストラップスクリプトの最新バージョンを使用していることを確認するために、時々実行する必要があります。

ブートストラップスクリプトがダウンロードされると、 `+ salt-cloud +`コマンドを使用して任意の環境を起動できます。 最小限のリソースでプロセスを実証するため、これを開発環境でテストします。

サーバーを並行して作成するように「+ salt-cloud 」に指示するために、「-P 」フラグを渡します。 これがないと、Saltは1つのサーバーがブートストラップを完了するのを待ってから、次のサーバーで作業を開始します。 ` -m +`フラグを使用して、使用したい環境マップをポイントする必要があります。

完全なコマンドは次のようになります。

sudo salt-cloud -P -m /etc/salt/cloud.maps.d/dev-environment.map

そのファイルで定義されている2つのサーバーの作成を確認するように求められます。

Output[INFO    ] salt-cloud starting
[INFO    ] Applying map from '/etc/salt/cloud.maps.d/dev-environment.map'.
[INFO    ] Starting new HTTPS connection (1): api.digitalocean.com
The following virtual machines are set to be created:
 dev-db
 dev-web

Proceed? [N/y]

「Y」と入力してサーバーを作成します。

サーバーが作成されたら、次のように入力してSalt接続を確認できます。

sudo salt '*' test.ping

Saltマスターミニオンと新しい開発マシンの両方から応答を受け取る必要があります。 プロビジョニングプロセス中に、Saltマスターは新しいサーバーのキーを生成して受け入れてから、それらをミニオンマシンに配置しました。 このため、新しいキーをそれぞれ受け入れるために `+ salt-key +`を使用する必要はありません。 新しいサーバーはすぐに応答するはずです。

Outputdev-db:
   True
sm:
   True
dev-web:
   True

マップファイルを使用して、定義されたサーバーにグループとして `+ salt-cloud +`コマンドを発行できます。 この時点で開発マシンを使用する予定がない場合は、次のように入力して、開発マシンを再度破棄してください。

sudo salt-cloud -d -m /etc/salt/cloud.maps.d/dev-environment.map

これにより、APIを介してサーバーが破壊され、ストアからミニオンキーが削除されます。

別の方法として、名前で個々のマシンを破棄することもできます。

sudo salt-cloud -d dev-db

そうすると、次回マップファイルで作成するときに、 `+ salt-cloud +`はまだ存在しないサーバーのみを作成します:

sudo salt-cloud -P -m /etc/salt/cloud.maps.d/dev-environment.map
Output[INFO    ] salt-cloud starting
[INFO    ] Applying map from '/etc/salt/cloud.maps.d/dev-environment.map'.
[INFO    ] Starting new HTTPS connection (1): api.digitalocean.com
[WARNING ] u'dev-web' already exists, removing from the create map.
The following virtual machines already exist:
 dev-web
The following virtual machines are set to be created:
 dev-db

Proceed? [N/y]

この時点で他のマップファイルを自由にテストして、構成する環境に必要なサーバーを正しくプロビジョニングできることを確認してください。

結論

この時点で、SaltマスターサーバーはDigitalOceanクラウドプロバイダーを使用してリソースを完全にスピンアップできる必要があります。 個々のマシンの特性のプロファイルを作成し、セットアップごとに必要な個々のサーバーを簡単に説明するマップを確立しました。

このシリーズのhttps://www.digitalocean.com/community/tutorials/saltstack-infrastructure-creating-salt-states-for-nginx-web-servers [次のガイド]では、Saltの構成管理について詳しく説明します。再現可能なNginx構成をセットアップすることにより、機能が向上します。

Related