ほとんどのユーザーにとって、インストール プロセスを開始する前に Salt の概念と仕組みについて理解することは有用です。Salt は、Salt マスターがクライアントに対してコマンドを発行し、クライアントがそのコマンドを実行するというマスター/クライアント モデルを使用します。
Salt とは
SaltStack Config は、Salt を利用して実行されます。Salt は Python ベースのオープンソースのリモート実行フレームワークで、次の目的に使用されます。
- 構成管理
- 自動化
- プロビジョニング
- オーケストレーション
Salt は、SaltStack Config の中核機能の基盤となるテクノロジーです。SaltStack Config は Salt を強化および拡張して、使いやすさを高める追加の機能を提供します。SaltStack Config インフラストラクチャの概要については、SaltStack Config のシステム アーキテクチャを参照してください。
次の図に、基本的な Salt アーキテクチャの主要コンポーネントを示します。
以降のセクションでは、SaltStack Config のインストールに関連する Salt アーキテクチャの主要コンポーネントの一部について説明します。
Salt マスターと Salt ミニオン
Salt は、Salt マスターがクライアントに対してコマンドを発行し、クライアントがそのコマンドを実行するというマスター/クライアント モデルを使用します。Salt エコシステムの中で、Salt マスターは Salt マスター サービスを実行するサーバです。Salt マスターは 1 つ以上の Salt ミニオンに対してコマンドを発行します。Salt ミニオンは、ミニオン サービスを実行していて、その特定の Salt マスターに登録されているノードです。
Salt は、パブリッシャとサブスクライバのモデルとして説明することもできます。Salt マスターは実行する必要があるジョブをパブリッシュし、ミニオンはそれらのジョブをサブスクライブします。特定のジョブがそのミニオンに適用されると、ジョブが実行されます。
ミニオンは、ジョブの実行を完了すると、ジョブの返却データを Salt マスターに返します。Salt では、ミニオンが Salt マスターと通信するためにデフォルトで 2 つのポートが使用されます。これらのポートは、メッセージ バスとの間でデータを送受信するために協調して動作します。Salt のメッセージ バスは ZeroMQ です。これは、可能な限り高速な通信を提供するための非同期ネットワーク トポロジを作成します。
ターゲットとグレイン
Salt マスターは、ターゲットを定義することにより、ジョブを実行するミニオンを示します。ターゲットは 1 つ以上の Salt マスター上に構成されるミニオンのグループで、これに対してジョブの Salt コマンドが適用されます。
Salt マスターもミニオンのように管理でき、ミニオン サービスを実行している場合はターゲットにすることができます。
Salt マスターがミニオンに発行する可能性がある各コマンドのうち、1 つの例を次に示します。このコマンドは、すべてのミニオンに Vim アプリケーションをインストールする必要があることを示しています。
salt -v '*' pkg.install vim
この場合は glob '*' がターゲットであるため、すべてのミニオンがこのコマンドを実行する必要があります。ID によって特定のミニオンをターゲットにしたり、共通の性質や特性(Salt のグレイン)を持つミニオンをターゲットにしたりするなど、その他に多くのターゲット オプションを使用できます。
Salt には、基盤となるシステムに関する情報を導出するインターフェイスが含まれています。これは、Salt に情報のグレインを示すことからグレイン インターフェイスと呼ばれます。グレインは、オペレーティング システム、ドメイン名、IP アドレス、カーネル、OS タイプ、メモリ、その他多くのシステム プロパティについて収集されます。独自にカスタムのグレイン データを作成することもできます。
グレイン データはあまり変化しません。ただし、システム情報が変更されたとき(ネットワーク設定など)、または新しい値がカスタム グレインに割り当てられたときには、グレイン データは更新されます。
イベント システムを開く(イベント バス)
イベント システムは、Salt マスターとミニオンの間のプロセス間通信に使用されます。イベント システムでは、次の処理を行います。
- イベントは、Salt マスターとミニオンの両方で把握されます。
- イベントは、この両方で監視および評価できます。
イベント バスは、オーケストレーションとリアルタイム監視の基礎を提供します。
すべてのミニオンは、イベント システムで公開されたイベントにサブスクライブすることで、ジョブと結果を把握できます。Salt は、次の 2 つのレイヤーを持つプラグ可能なイベント システムを使用します。
- [ZeroMQ (0MQ)] - 柔軟なトランスポート レイヤーを提供する、現在のデフォルトのソケットレベル ライブラリです。
- [Tornado] - 全面的に TCP ベースのトランスポート レイヤー イベント システムです。
Salt の最大の強みの 1 つは、実行速度です。イベント システムの通信バスは、上位の Web サービス (http) を実行するよりも効率的です。リモート実行システムは、すべてのコンポーネントの基盤となるコンポーネントで、分散型のリモート実行によってリソース全体に負荷を分散できます。
Salt 状態
Salt はリモート実行以外に、ミニオンがどの状態であるべきかを宣言するという、ミニオンを構成する別の方法を備えています。この状態は Salt 状態と呼ばれます。Salt 状態により、構成管理が可能になります。Salt 状態を使用すると、シンプルな YAML ファイルによってインフラストラクチャを展開および管理できます。この状態を使用すると、ジョブをキューに入れることで、Salt がユーザー入力なしでジョブを実装できるようになり、再帰的なタスクや予測可能なタスクを自動化できます。さらに Jinja を使用して、状態ファイルに複雑な条件ロジックを追加することもできます。
リモート実行と構成管理の小さな違いを示すために、ターゲットとグレインに関して前のセクションで使用した、Salt で Vim アプリケーションをすべてのミニオンにインストールするコマンドを取り上げます。
| 方法 |
実装 |
結果 |
|---|---|---|
| リモート実行 |
|
|
| 構成管理 |
|
|
Vim がインストールされていることを確認する状態ファイルは、次の例のようになります。
# File:/srv/salt/vim_install.sls
install_vim_now:
pkg.installed:
-pkgs:
-vim
この状態をミニオンに適用するには、次の例のように state.apply モジュールを使用します。
salt '*' state.apply vim_install
このコマンドは、vim_install 状態をすべてのミニオンに適用します。
数式は状態の集合であり、各状態が連携してミニオンまたはアプリケーションを構成します。たとえば、ある状態が別の状態をトリガすることができます。
top ファイル
各状態を個別に実行して、それぞれのミニオンをターゲットとすることは現実的ではありません。一部の環境では、数百の状態ファイルが数千のミニオンをターゲットにしていることがあります。
Salt には、この種のスケーリング問題に役立つ 2 つの機能があります。
- [top.sls ファイル] - Salt 状態を該当するミニオンにマップします。
- [highstate 実行] -
top.slsで指定されているすべての Salt 状態を 1 回の処理で実行します。
top ファイルは、各環境のさまざまなミニオンにどの状態を適用する必要があるかをマップします。簡単な top ファイルの例は、次のとおりです。
# File: /srv/salt/top.sls
base:
'*':
- all_server_setup
'01webserver':
- web_server_setup
この例で、base はデフォルトである Salt 環境を参照しています。必要に応じて、prod、dev、QA など複数の環境を指定できます。
ミニオンのグループが環境の中で指定され、各ミニオン セットについて状態が表示されます。この top ファイルは、all_server_setup という名前の状態をすべてのミニオン '*' に適用し、web_server_setup という状態を 01webserver ミニオンに適用すると指示しています。
Salt コマンドを実行するには、state.highstate 関数を使用します。
salt \* state.highstate
このコマンドは、top ファイルをターゲットのミニオンに適用します。
Salt ピラー
Salt のピラー機能は、Salt マスターで定義されたデータを取得して、必要に応じてミニオンに配布します。ピラーは主にシークレットや、アカウント認証情報、暗号化キー、パスワードなどその他の秘密データを格納するために使用されます。また、構成データなど、状態ファイルに直接配置することが望ましくない非シークレット データを格納する場合にも役立ちます。
Salt ピラーはグレインとは逆方向から、データをクラスタに取り込みます。グレインはミニオンから生成されるデータですが、ピラーは Salt マスターから生成されるデータです。
ピラーは状態と同様な形でピラー状態ツリーに編成され、ピラー データは top.sls によって、そのデータを秘密とする環境およびミニオンに対応付けられます。ピラーを使用して転送される情報には、ターゲットのミニオン用に生成され、安全なデータ転送のためにそのミニオンのキーで暗号化された辞書が含まれています。ピラー データはミニオン単位で暗号化されるため、特定のミニオンに固有の秘密データを保存するのに役立ちます。
ビーコンとリアクタ
ビーコン システムは、ミニオン上のさまざまなシステム プロセスをリッスンできる監視ツールです。ビーコンはリアクタをトリガし、リアクタは変更の実装や問題のトラブルシューティングに役立ちます。たとえば、サービスの応答がタイム アウトになったときにリアクタ システムがサービスを再起動することができます。
ビーコンは、次のようなさまざまな目的で使用されます。
- 自動レポート作成
- エラー ログの配信
- マイクロサービスの監視
- ユーザー シェル アクティビティ
- リソース監視
ビーコンをリアクタと組み合わせることで、インフラストラクチャやアプリケーションの問題に対して、事前に記述された自動応答を作成できます。リアクタを使用すると、事前に記述された修正状態を使用した自動応答によって Salt を拡張できます。
リアクタは、次のようなさまざまなシナリオに応用できます。
- インフラストラクチャのスケーリング
- 管理者への通知
- 失敗したアプリケーションの再起動
- 自動ロールバック
ビーコンとリアクタの両方を組み合わせて使用すると、固有のニーズに合わせてカスタマイズした独自の状態を作成できます。
Salt ランナーとオーケストレーション
Salt ランナーは、salt-run コマンドを使用して実行される便利なアプリケーションです。Salt ランナーは、Salt 実行モジュールと同じように動作します。ただし、ミニオンではなく Salt マスター上で実行されます。Salt ランナーは、シンプルなクライアント呼び出しにすることも、複雑なアプリケーションにすることもできます。
Salt は、システム管理タスクを企業全体でオーケストレーションする機能を備えています。オーケストレーションにより、複数のマシンのアクティビティを 1 か所から調整できます。特定の構成イベントが発生した場合の一連の処理を制御できるという追加的なメリットがあります。オーケストレーション状態は、状態ランナー モジュールを使用して Salt マスター上で実行されます。
マルチノード インストールを実行すると、実際にはオーケストレーションの実行によって SaltStack Config のインストールが行われます。マルチノード インストールのシナリオでは、VMware によって設計されたオーケストレーション highstate が実行されます。highstate は Salt マスターで実行され、マルチノード環境を設定します。これにより、PostgreSQL、Redis、および RaaS をホストする他の 3 台のノードに、中核となる SaltStack Config アーキテクチャがインストールされます。