SaltStackインフラストラクチャ:MySQLデータベースサーバーのSalt状態の作成
序章
SaltStack(Salt)は、構造化された反復可能な方法でインフラストラクチャを簡単に管理するために使用できる強力なリモート実行および構成管理システムです。 このシリーズでは、Saltデプロイメントから開発、ステージング、および実稼働環境を管理する1つの方法を示します。 ソルト状態システムを使用して、繰り返し可能なアクションを記述して適用します。 これにより、環境を破壊することができます。後で同じ状態で簡単にオンラインに戻すことができるため、安全です。
このシリーズの最後のガイドでは、Webサーバーの前にロードバランサーとしてHAProxyを設定しました。 このガイドでは、焦点を変更して、各環境に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/root_password
- password
|_
- mysql-server/root_password_again
- password
|_
- 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ファイルをSaltマスターにプッシュバックした後、リソースを削除して、ガイドの後半でテストするためのクリーンな状態にすることができます。
sudo salt-cloud -d stage-db1
サーバーが削除されたら、次のように入力して、バックグラウンドでサーバーを再作成できます。 この場合のsmは、適切なクラウドクレデンシャルを持つSaltマスターサーバーの名前です。
sudo salt --async sm 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パッケージがミニオンにインストールされていることを確認する必要があります。 これは、pkg.installed状態モジュールを使用して実行できます。
/srv/salt/mysql/init.sls
debconf-utils: pkg.installed
debconf-utilsパッケージがインストールされたら、debconf.set状態モジュールを使用して、プロンプトへの回答を事前にシードできます。 name属性を使用して、プロンプトを設定するパッケージ名を指定します。 次に、プロンプトの入力に使用できる情報の辞書を含むdata構造を作成します。
data構造は、基本的に、テスト用のMySQLインストールから照会したプロンプトに関する情報を使用します。 これらのフィールドに使用する必要があるフィールド名とデータ型はわかっています。 実際のパスワードを指定するには、pillar.get実行モジュール機能を使用してSaltpillarシステムからプルします。
ピラーシステムでパスワードを設定するのは少し後でします。 これにより、パスワードデータを構成から分離しておくことができます。
ノート
data内に格納されている辞書のインデントに細心の注意を払ってください。 ブロック全体は、通常の2つのスペースのインデントではなく、追加の4つのスペースでインデントされます。 これは、辞書がYAMLリストに埋め込まれている場合に発生します。 詳細については、このリンクをご覧ください。
/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ライブラリが利用可能である必要があります。 ptyhon-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
python-mysqldb:
pkg.installed
mysql-server:
pkg.installed:
- require:
- debconf: mysql-server
- pkg: python-mysqldb
mysql:
service.running:
- watch:
- pkg: mysql-server
- file: /etc/mysql/my.cnf
MySQLで管理する必要のあるファイルがいくつかあります。 管理する必要がある最も明白なファイルは、前述の/etc/mysql/my.cnfファイルです。 変数情報に基づいていくつかの変更を加える必要があるため、このファイルはJinjaテンプレートである必要があります。
管理する必要のある他のファイルは、SaltによるMySQLシステムの管理と関係があります。 データベースを管理するには、SaltミニオンにRDBMSへの接続方法に関する情報が必要です。 まず、/etc/salt/minion.dディレクトリに簡単なファイルを作成できます。 これにより、接続の詳細が記載されているファイルが一覧表示されます。 データベース接続の詳細を含むファイルは、管理する必要のあるもう1つのファイルです。 データベース接続ファイルはテンプレートである必要があります。
/srv/salt/mysql/init.sls
. . .
mysql:
service.running:
- watch:
- pkg: mysql-server
- file: /etc/mysql/my.cnf
/etc/mysql/my.cnf:
file.managed:
- source: salt://mysql/files/etc/mysql/my.cnf.jinja
- template: jinja
- user: root
- group: root
- mode: 640
- require:
- pkg: mysql-server
/etc/salt/minion.d/mysql.conf:
file.managed:
- source: salt://mysql/files/etc/salt/minion.d/mysql.conf
- user: root
- group: root
- mode: 640
- require:
- service: mysql
/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
最後に、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
restart_minion_for_mysql:
service.running:
- name: salt-minion
- watch:
- file: /etc/salt/minion.d/mysql.conf
上記の詳細の追加が完了したら、ファイルを保存して閉じます。
MySQLの柱を作成する
MySQLの状態では、pillar.get実行モジュール関数を使用して、MySQLルートパスワードにピラーシステムからの値を入力しました。 データベースのクレデンシャルを構築するために州が必要なデータを取得できるように、この柱を設定する必要があります。
ピラーシステムは、特定のホストにデータを割り当てることができるため、このタイプのユースケースに最適です。 一致しないホストは、機密データにアクセスできません。 これまでのところ、私たちの州はルートパスワードのみを必要としています。 ピラーシステム内の場所をmysql:root_pwに指定しました。 次に、そのキーの設定について説明します。
ピラーシステムのトップファイルの作成
必要な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}
次に、これらの各ディレクトリ内にmyslq.slsファイルを作成する必要があります。 現在、ステージング環境を使用してテストしているため、/srv/salt/stage/mysql.slsファイルから始めることができます。
sudo nano /srv/pillar/stage/mysql.sls
作成した状態ファイルは、mysql:root_pwキーを使用してピラーシステムからMySQLルートパスワードを取得したいと考えています。 これは実際にはネストされたキーです。つまり、root_pwはmysqlキーの子です。 これを念頭に置いて、MySQL rootユーザーのパスワードを選択し、次のようにファイルに設定できます。
/srv/pillar/stage/mysql.sls
mysql: root_pw: staging_mysql_root_pass
使用するパスワードを選択してください。 完了したら、ファイルを保存して閉じます。 今のところ必要なのはこれだけです。
開発の柱の中に同様のファイルを作成します。
sudo nano /srv/pillar/dev/mysql.sls
/srv/pillar/dev/mysql.sls
mysql: root_pw: development_mysql_root_pass
本番環境の柱についても同じようにします。
sudo nano /srv/pillar/prod/mysql.sls
/srv/pillar/prod/mysql.sls
mysql: root_pw: production_mysql_root_pass
これらの環境ごとに異なるパスワードを選択してください。
構成自体に属さないデータがさらに必要になるため、後でこれらの柱に戻ります。 今のところ、開いているファイルを保存して閉じます。
/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 = {{ salt['network.interface_ip']('eth1') }}
もう1つ追加する必要があるのは、サーバーのDNS名前解決をオフにすることです。 skip-name-resolveオプションを追加することにより、名前を完了できず、名前解決を逆にできない場合でも、MySQLは失敗しません。
/srv/salt/mysql/files/etc/mysql/my.cnf.jinja
. . .
[mysqld]
. . .
bind-address = {{ salt['network.interface_ip']('eth1') }}
skip-name-resolve
終了したら、ファイルを保存して閉じます。
/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ソケットでMySQLrootユーザーを使用してローカルマシンに接続するように指定できます。 これらはすべてデフォルトの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
password = {{ salt['pillar.get']('mysql:root_pw', '') }}
終了したら、ファイルを保存して閉じます。
インストールのテストと健全性チェック
基本的なインストール状態とサポートファイルが構成されたので、セットアップをすばやくテストして、正しく動作していることを確認する必要があります。
まず、一般的なテストプロセスを実行します。 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はこのインスタンスのSaltマスターサーバーの名前です。
sudo salt --async sm cloud.profile stage-db stage-db1
これで、MySQLの基本的なセットアップが完了しました。
結論
これで、MySQLをミニオンにインストールする状態ができたはずです。 これらはまた、これらの各サーバーでsalt-minionプロセスを開始し、Saltが関連するデータベースに接続して管理できるようにします。
現在の状態ではMySQLをインストールし、データベースシステムを制御するようにミニオンを構成していますが、現在、データベースは完全に分離されています。 将来のガイドでは、各環境内の各データベース間でデータの一貫性を保つために、MySQLデータベースのレプリケーションに取り組みます。