SaltStackインフラストラクチャ:MySQLデータベースサーバーのソルトステートの作成

前書き

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

このシリーズのhttps://www.digitalocean.com/community/tutorials/saltstack-infrastructure-creating-salt-states-for-haproxy-load-balancers [最終ガイド]では、HAProxyをロードバランサーとして設定します。 Webサーバーの前面。 このガイドでは、各環境にMySQLデータベースサーバーをインストールおよび管理する状態を作成するようにフォーカスを変更します。 この記事では、MySQLの基本的なインストールとセットアップについて説明します。 将来のガイドでは、レプリケーションをセットアップするより複雑なタスクに取り組みます。

debconf-utilsを使用してMySQLプロンプト情報を取得する

MySQLの状態を作成するプロセスは、NginxとMySQLを使用した以前の例よりも少し複雑になります。 他の2つのインストール手順とは異なり、MySQLのインストールでは通常、プロンプトに応答してMySQLルートパスワードを設定する必要があります。

状態ファイルを使用する前に、ミニオンの1つにMySQLのテストインストールを行う必要があります。 次に、 `+ debconf-utils +`パッケージを使用して、入力する必要があるプロンプトに関する情報を取得できます。

ステージング環境をまだ使用できない場合は、以前に作成したステージング環境マップファイルを使用して、環境を起動できます。

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

データベースサーバーが起動して利用可能になったら、データベースサーバーの1つを選択してMySQLをインストールし、インストールから関連情報を取得できるようにします。

sudo salt stage-db1 pkg.install mysql-server

必要なプロンプト情報を `+ debconf `データベースに簡単に照会するには、データベースミニオンに ` debconf-utils +`パッケージもインストールする必要があります。

sudo salt stage-db1 pkg.install debconf-utils

このパッケージがインストールされると、Salt内の `+ debconf `機能が利用可能になります。 ` debconf.get_selections `実行モジュール関数を使用して、データベースミニオンからすべてのプロンプト情報を取得できます。 これを「 less +」にパイプする必要があります。これにより、そのホストにインストールされているパッケージからの情報がすべて返されるからです。

sudo salt stage-db1 debconf.get_selections | less

出力で、MySQLに関連するセクションを探します。 これは次のようになります。

Output. . .

mysql-server-5.5:
   |_


   |_


   |_
     - mysql-server-5.5/really_downgrade
     - boolean
     - false
   |_
     - mysql-server-5.5/start_on_boot
     - boolean
     - true

. . .

上部の2つのエントリには、必要なフィールド名が含まれています( + mysql-server / root_password +`および `+ mysql-server / root_password_again +)。 これらのエントリの2行目は、状態ファイルで指定する必要があるフィールドタイプを指定します。

`+ debconf `の出力からこの情報をコピーしたら、 ` / etc / mysql / my.cnf +`ファイルも取得する必要があります。 これは後でMySQLの状態を構成するときに必要になります。

sudo salt stage-db1 cp.push /etc/mysql/my.cnf

`+ / etc / mysql / my.cnf`ファイルをソルトマスターにプッシュした後、リソースを削除して、ガイドの後半でテストするためのクリーンな状態にすることができます。

sudo salt-cloud -d stage-db1

サーバーを削除したら、次を入力してバックグラウンドでサーバーを再作成できます。 このインスタンスの「+ sm +」は、適切なクラウド認証情報を持つソルトマスターサーバーの名前です。

sudo salt --async  cloud.profile stage-db stage-db1

データベースサーバーの再構築中に、MySQL状態ファイルの構築を開始できます。

メインMySQL状態ファイルを作成する

`+ / srv / salt +`ディレクトリ内にMySQL状態のディレクトリを作成することから始めます。

sudo mkdir -p /srv/salt/mysql

このディレクトリ内で、 `+ init.sls +`ファイルを作成して開き、プライマリMySQL状態ファイルを保存できます。

sudo nano /srv/salt/mysql/init.sls

必要な値を簡単に設定するには、 `+ debconf-utils `パッケージがミニオンにインストールされていることを確認する必要があります。 ` package.installed`状態モジュールでこれを行うことができます:

/srv/salt/mysql/init.sls

debconf-utils:
 pkg.installed

`+ debconf-utils `パッケージをインストールした後、 ` debconf.set `状態モジュールを使用してプロンプトへの回答を事前にシードできます。 ` name `属性を使用して、プロンプトを設定したいパッケージ名を指定します。 次に、プロンプトの入力に使用できる情報の辞書を含む「 data」構造を作成します。

`+ data `構造は、基本的に、テストMySQLインストールから問い合わせたプロンプトに関する情報を使用します。 これらのフィールドに使用されるフィールド名とデータ型はわかっています。 実際のパスワードを指定するには、 ` pillar.get +`実行モジュール関数を使用してSaltの柱システムから取得します。

柱システムにパスワードを少し設定します。 これにより、パスワードデータを設定とは別に保持できます。

Note

/srv/salt/mysql/init.sls

debconf-utils:
 pkg.installed

mysql_setup:
 debconf.set:
   - name: mysql-server
   - data:
       'mysql-server/root_password': {'type': 'password', 'value': '{{ salt['pillar.get']('mysql:root_pw', '') }}' }
       'mysql-server/root_password_again': {'type': 'password', 'value': '{{ salt['pillar.get']('mysql:root_pw', '') }}' }
   - require:
     - pkg: debconf-utils

MySQLと実際に対話するには、適切なPythonライブラリがデータベースサーバーで利用可能である必要があります。 `+ python-mysqldb`パッケージをインストールして、SaltのMySQL機能に確実にアクセスできるようにすることができます。 その後、実際のMySQLサーバーソフトウェアを安全にインストールできます。 `+ require `を使用して、 ` debconf +`とPythonライブラリが利用可能であることを確認します。

インストール後、サービスの状態を追加して、サービスが実行されていることを確認できます。 これは、MySQLサーバーパッケージの変更を監視します。 また、基本的なMySQL構成ファイルを監視し、変更が検出された場合にサービスをリロードします。

/srv/salt/mysql/init.sls

debconf-utils:
 pkg.installed

mysql_setup:
 debconf.set:
   - name: mysql-server
   - data:
       'mysql-server/root_password': {'type': 'password', 'value': '{{ salt['pillar.get']('mysql:root_pw', '') }}' }
       'mysql-server/root_password_again': {'type': 'password', 'value': '{{ salt['pillar.get']('mysql:root_pw', '') }}' }
   - require:
     - pkg: debconf-utils

MySQLで管理する必要があるファイルがいくつかあります。 管理する必要がある最も明白なファイルは、上で述べた `+ / etc / mysql / my.cnf`ファイルです。 変数情報に基づいていくつかの変更を行う必要があるため、このファイルはJinjaテンプレートである必要があります。

管理する必要がある他のファイルは、SaltのMySQLシステムの管理に関係しています。 データベースを管理するには、Salt minionにRDBMSへの接続方法に関する情報が必要です。 最初に、 `+ / etc / salt / minion.d +`ディレクトリに簡単なファイルを作成できます。 これにより、接続の詳細を確認できるファイルがリストされます。 データベース接続の詳細を含むファイルは、管理する必要があるもう1つのファイルです。 データベース接続ファイルはテンプレートである必要があります。

/srv/salt/mysql/init.sls

. . .

mysql:
 service.running:
   - watch:
     - pkg: mysql-server
     - file: /etc/mysql/my.cnf

最後に、 `+ salt-minion `プロセス自体をリロードする ` service.restart `状態を含める必要があります。 これは、ミニオンが ` / etc / salt / minion.d / mysql.conf `ファイルを取得するために必要です。 ` / etc / salt / minion.d / mysql.conf `ファイル自体に変更がある場合にのみ、 ` salt-minion `を再起動する必要があります。 それを達成するために必要な ` watch +`を使用できます:

/srv/salt/mysql/init.sls

. . .

/etc/mysql/salt.cnf:
 file.managed:
   - source: salt://mysql/files/etc/mysql/salt.cnf.jinja
   - template: jinja
   - user: root
   - group: root
   - mode: 640
   - require:
     - service: mysql

上記の詳細の追加が終了したら、ファイルを保存して閉じます。

MySQLの柱を作成する

MySQLの状態では、 `+ pillar.get +`実行モジュール関数を使用して、MySQLルートパスワードにピラーシステムの値を入力しました。 データベースの資格情報を構築するために州が必要なデータを取得できるように、この柱を設定する必要があります。

柱システムは、特定のホストにデータを割り当てることができるため、このタイプのユースケースに最適です。 一致しないホストは、機密データにアクセスできません。 これまでのところ、状態に必要なのはrootパスワードのみです。 柱システム内の場所を `+ mysql:root_pw +`に指定しました。 次に、そのキーをセットアップします。

Pillar Systemのトップファイルの作成

必要なMySQL柱ファイルを作成する前に、柱「トップ」ファイルを作成する必要があります。 一番上のファイルは、ソルトミニオンを柱データと照合するために使用されます。 ソルトミニオンは、トップファイルで一致しないピラーデータにアクセスできません。

`+ / srv / pillar `ディレクトリはインストールガイドの間に作成されているはずです。 このディレクトリ内に ` top.sls +`ファイルを作成して開始できます:

cd /srv/pillar
sudo nano top.sls

内部では、 `+ base`環境を指定する必要があります(複雑さや文書化されていない動作のため、このシリーズでは環境のSalt概念を使用していません。 すべてのサーバーは「+ base +」環境で動作し、環境の指定に穀物を使用しています)。 ノードのマッチングには複合マッチングを使用します。 サーバーの役割とサーバー環境を一致させて、各ホストに割り当てる柱を決定します。

柱はドット表記を使用して、ディレクトリ内のファイルを示します。 たとえば、柱システムのルートは「+ / srv / pillar 」です。 ` dev `ディレクトリ内にある ` mysql.sls`ピラーを割り当てるには、` + dev.mysql`を使用します。

このガイドに必要な割り当ては次のようになります。

/srv/pillar/top.sls

base:
 'G@env:dev and G@role:dbserver':
   - match: compound
   - dev.mysql

 'G@env:stage and G@role:dbserver':
   - match: compound
   - stage.mysql

 'G@env:prod and G@role:dbserver':
   - match: compound
   - prod.mysql

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

環境固有の柱の作成

上記では、役割と環境に基づいてサーバーに柱を割り当てました。 これにより、さまざまな環境に対してさまざまな接続と資格情報を指定できます。

柱トップファイルで参照されるディレクトリを作成することから始めます。

sudo mkdir /srv/pillar/{prod,stage,dev}

次に、これらの各ディレクトリ内に `+ mysql.sql`ファイルを作成する必要があります。 現在、テストにステージング環境を使用しているため、 `+ / srv / salt / stage / mysql.sls +`ファイルから開始できます。

sudo nano /srv/pillar/stage/mysql.sls

作成した状態ファイルは、 `+ mysql:root_pw `キーを使用して、柱システムからMySQLルートパスワードを取得します。 これは実際にはネストされたキーです。つまり、 ` root_pw `は ` mysql +`キーの子です。 これを念頭に置いて、MySQLルートユーザーのパスワードを選択し、次のようにファイルに設定できます。

/srv/pillar/stage/mysql.sls

mysql:
 root_pw:

使用するパスワードを選択します。 完了したら、ファイルを保存して閉じます。 今のところこれで十分です。

開発の柱に同様のファイルを作成します。

sudo nano /srv/pillar/dev/mysql.sls

/srv/pillar/dev/mysql.sls

mysql:
 root_pw:

実稼働環境の柱でも同じことを行います。

sudo nano /srv/pillar/prod/mysql.sls

/srv/pillar/prod/mysql.sls

mysql:
 root_pw:

これらの環境ごとに異なるパスワードを選択してください。

構成自体に属さないデータがさらに必要になるため、これらの柱に後で戻ります。 今のところ、開いているファイルを保存して閉じます。

/etc/mysql/my.cnf.jinjaテンプレートを作成します

以前に基本的なMySQL状態ファイルを作成しましたが、インストール用の管理ファイルは作成しませんでした。

先に `+ stage-db1 `サーバーに ` mysql-server `のテストインストールを行ったとき、 ` / etc / mysql / my.cnf `ファイルをマスターにプッシュしました。 これは、Saltマスターキャッシュで引き続き利用できるはずです。 次のように入力することで、そのキャッシュファイルに至るディレクトリ構造全体を ` / srv / salt / mysql +`ディレクトリにコピーできます。

sudo cp -r /var/cache/salt/master/minions/stage-db1/files /srv/salt/mysql

MySQL状態ディレクトリ内のコピーされた `+ mycnf +`ファイルを含むディレクトリに移動します。

cd /srv/salt/mysql/files/etc/mysql

現在存在するファイルを `+ .orig +`サフィックスにコピーして、必要に応じて変更を元に戻すことができます。

sudo cp my.cnf my.cnf.orig

次に、 `+ my.cnf `ファイルの名前を ` .jinja +`に変更します。 これにより、このファイルはレンダリングせずにホストにドロップできるファイルではなく、テンプレートであることが一目でわかります。

sudo mv my.cnf my.cnf.jinja

Jinjaテンプレートファイルを開いて、必要な編集を開始します。

sudo nano my.cnf.jinja

作成したい変更はすべて、リモートMySQL接続の許可に関係しています。 現状では、MySQLはローカルループバックインターフェイスにバインドしています。 ノードのプライベートネットワークアドレスでリッスンするように設定する必要があります。

これを行うには、 `+ [mysqld] `セクションで ` bind-address `行を見つけます。 ` network.interface_ip `実行モジュール関数を使用して、ミニオンの ` eth1 +`インターフェースに割り当てられたアドレスを取得します。

/srv/salt/mysql/files/etc/mysql/my.cnf.jinja

. . .

[mysqld]

. . .

bind-address            =

他に追加する必要があるのは、サーバーのDNS名前解決をオフにすることです。 `+ skip-name-resolve +`オプションを追加することにより、MySQLは名前を完成させたり名前解決を逆にすることができなくても失敗しません。

/srv/salt/mysql/files/etc/mysql/my.cnf.jinja

. . .

[mysqld]

. . .

bind-address            = {{ salt['network.interface_ip']('eth1') }}

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

/etc/salt/minion.d/mysql.confファイルを作成します

次に、MySQLデータベースへの接続方法に関する知識を使用して、ミニオンの構成を変更するために使用される管理ファイルを作成する必要があります。 設定を `+ / etc / salt / minion `ファイル内に保持する代わりに、新しいファイルを ` / etc / salt / minion.d +`ディレクトリに配置して、ミニオンに接続情報の場所を伝えます。

`+ / srv / salt / mysql / files`ディレクトリ内に必要なディレクトリ構造を作成することから始めます。

sudo mkdir -p /srv/salt/mysql/files/etc/salt/minion.d

このディレクトリ内に `+ mysql.conf +`というファイルを作成できます:

sudo nano /srv/salt/mysql/files/etc/salt/minion.d/mysql.conf

内部では、接続情報ファイルの場所という1つのオプションを設定するだけです。 私たちの場合、これを `+ / etc / mysql / salt.cnf +`のファイルに設定します:

/srv/salt/mysql/files/etc/salt/minion.d/mysql.conf

mysql.default_file: '/etc/mysql/salt.cnf'

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

/etc/mysql/salt.cnfテンプレートファイルを作成します

次に、ミニオン構成が参照するファイルを作成する必要があります。 柱システムから接続の詳細の一部を取得する必要があるため、これはテンプレートファイルになります。 このファイルを `+ / srv / salt / mysql / files / etc / mysql`ディレクトリ内に配置します。

sudo nano /srv/salt/mysql/files/etc/mysql/salt.cnf.jinja

内部では、定義する情報のタイプを指定するために、 `+ [client] `セクションを開く必要があります。 このヘッダーの下で、クライアントが ` / var / run / mysqld / mysqld.sock +`にあるUnixソケットでMySQLルートユーザーを使用してローカルマシンに接続するように指定できます。 これらはすべてデフォルトのMySQL値です。

/srv/salt/mysql/files/etc/mysql/salt.cnf.jinja

[client]
host                = localhost
user                = root
socket              = /var/run/mysqld/mysqld.sock

ここで追加する必要があるのはパスワードだけです。 繰り返しますが、MySQL状態ファイルの `+ debconf +`セクションで行ったのと同じ方法で、これを柱システムから直接引き出します。 これは次のようになります。

/srv/salt/mysql/files/etc/mysql/salt.cnf.jinja

[client]
host                = localhost
user                = root
socket              = /var/run/mysqld/mysqld.sock

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

テストインストールと健全性チェック

基本的なインストール状態とサポートファイルが構成されたので、セットアップをすばやくテストして、正しく動作していることを確認する必要があります。

まず、一般的なテストプロセスを実行します。 `+ state.show_sls +`実行モジュール関数を使用して、状態ファイルをレンダリングできることを確認します。

sudo salt stage-db1 state.show_sls mysql

出力を調べて、Saltで `+ / srv / salt / mysql / init.sls +`ファイルの解析に問題がないことを確認します。

次に、 `+ state.apply `実行モジュール関数の最後に ` test = True +`を追加して、状態アプリケーションのドライランを実行します。

sudo salt stage-db1 state.apply mysql test=True

このコマンドは失敗することが予想されます。 ファイル内の一部の状態関数は、特定のパッケージがインストールされるまで使用できないため、ドライラン中にエラーが発生することが予想されます。 実際の実行中に、状態の順序付けにより、それらを利用する状態が呼び出される前に、前提条件パッケージがインストールされることが保証されます。

失敗した状態のコメントはすべて、「+ mysql_setup +」状態を除く「1つ以上の必要条件が失敗した」ことを示す必要があります。 )。 ここの出力を使用して、他の無関係なエラーが表示されないようにします。

テストの実行後、次のように入力して状態を適用できます。

sudo salt stage-db1 state.apply mysql

これにより、状態が正常に実行されます。

SaltがMySQLデータベースに接続してクエリできることをテストする必要があります。 次のように入力して、デフォルトのデータベースをリストできることを確認します。

sudo salt stage-db1 mysql.db_list

次のようなリストを取得する必要があります。

Outputstage-db1:
   - information_schema
   - mysql
   - performance_schema

これは、Saltが `+ / etc / mysql / salt.cnf +`ファイルで指定された情報を使用してMySQLインスタンスに接続できたことを示します。

MySQLの基本状態が正しく機能することを確認したので、 `+ stage-db1 +`サーバーを削除できます。

sudo salt-cloud -d stage-db1

サーバーをバックグラウンドで再作成して、後でさらにテストできるようにします。 繰り返しますが、 `+ sm +`はこのインスタンスのソルトマスターサーバーの名前です。

sudo salt --async  cloud.profile stage-db stage-db1

これで、基本的なMySQLセットアップが完了しました。

結論

これで、自分の手先にMySQLをインストールする状態になります。 これらは、これらのサーバーのそれぞれで「+ salt-minion +」プロセスを開始し、Saltが関連するデータベースに接続して管理できるようにします。

現在の状態ではMySQLをインストールし、手先を構成してデータベースシステムを制御しますが、現在のデータベースは完全に分離されています。 将来のガイドでは、MySQLデータベースのレプリケーションに取り組み、各環境内の各データベース間でデータの一貫性を確保します。

Related