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
The debconf
このパッケージがインストールされると、Salt内の機能が利用できるようになります。 使用できます debconf.get_selections
データベースミニオンからすべてのプロンプト情報を取得する実行モジュール関数。 これをパイプで接続する必要があります less
これは、そのホストにインストールされているパッケージからの情報のallを返すためです。
- 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
サーバーが削除されたら、次のように入力して、バックグラウンドでサーバーを再作成できます。 The sm
この例では、適切なクラウドクレデンシャルを持つSaltマスターサーバーの名前です。
- sudo salt --async sm cloud.profile stage-db stage-db1
データベースサーバーの再構築中に、MySQL状態ファイルの構築を開始できます。
メインのMySQL状態ファイルを作成する
まず、MySQL状態のディレクトリを作成します。 /srv/salt
ディレクトリ:
- sudo mkdir -p /srv/salt/mysql
このディレクトリ内で、を作成して開くことができます init.sls
プライマリMySQL状態ファイルを保存するファイル:
- sudo nano /srv/salt/mysql/init.sls
次のことを確認する必要があります debconf-utils
必要な値を簡単に設定するために、パッケージがミニオンにインストールされます。 私たちはこれを行うことができます pkg.installed
状態モジュール:
debconf-utils:
pkg.installed
後に debconf-utils
パッケージがインストールされたら、プロンプトを使用してプロンプトへの回答を事前にシードできます。 debconf.set
状態モジュール。 を使用します name
プロンプトを設定するパッケージ名を指定する属性。 次に、 data
プロンプトの入力に使用できる情報の辞書を含む構造。
The data
構造は基本的に、テスト用のMySQLインストールから照会したプロンプトに関する情報を使用します。 これらのフィールドに使用する必要があるフィールド名とデータ型はわかっています。 実際のパスワードを指定するには、Saltpillarシステムからプルします。 pillar.get
実行モジュール機能。
ピラーシステムでパスワードを設定するのは少し後でします。 これにより、パスワードデータを構成から分離しておくことができます。
ノート
内に保存されている辞書のインデントに細心の注意を払ってください data
. ブロック全体は、通常の2つのスペースのインデントではなく、追加の4つのスペースでインデントされます。 これは、辞書がYAMLリストに埋め込まれている場合に発生します。 詳細については、このリンクをご覧ください。
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構成ファイルを監視し、変更が検出された場合はサービスをリロードします。
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つのファイルです。 データベース接続ファイルはテンプレートである必要があります。
. . .
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
最後に、 service.restart
リロードする状態 salt-minion
自分自身を処理します。 これは、ミニオンが /etc/salt/minion.d/mysql.conf
ファイル。 欲しいのは salt-minion
に変更があった場合に再起動します /etc/salt/minion.d/mysql.conf
ファイル自体。 使用できます watch
それを達成するために必要なもの:
. . .
/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ピラーファイルを作成する前に、ピラー「トップ」ファイルを作成する必要があります。 一番上のファイルは、ソルトミニオンをピラーデータと照合するために使用されます。 ソルトミニオンは、トップファイルで一致しないピラーデータにアクセスできなくなります。
The /srv/pillar
インストールガイド中にディレクトリが作成されているはずです。 作成できます top.sls
開始するには、このディレクトリ内のファイル:
- cd /srv/pillar
- sudo nano top.sls
内部では、を指定する必要があります base
環境(複雑さと文書化されていない動作のため、このシリーズではSaltの環境の概念を使用していません。 すべてのサーバーは base
環境および環境指定のための穀物を使用してください)。 複合マッチングを使用してノードをマッチングします。 サーバーの役割とサーバー環境を照合して、各ホストに割り当てる柱を決定します。
柱は、ドット表記を使用してディレクトリ内のファイルを示します。 たとえば、柱システムのルートは /srv/pillar
. を割り当てるには mysql.sls
内にある柱 dev
ディレクトリ、使用します dev.mysql
.
このガイドに必要な割り当ては次のようになります。
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ルートパスワードをプルしたいと考えています。 mysql:root_pw
鍵。 これは実際にはネストされたキーです。つまり、 root_pw
の子です mysql
鍵。 これを念頭に置いて、MySQL rootユーザーのパスワードを選択し、次のようにファイルに設定できます。
mysql:
root_pw: staging_mysql_root_pass
使用するパスワードを選択してください。 完了したら、ファイルを保存して閉じます。 今のところ必要なのはこれだけです。
開発の柱の中に同様のファイルを作成します。
- sudo nano /srv/pillar/dev/mysql.sls
mysql:
root_pw: development_mysql_root_pass
本番環境の柱についても同じようにします。
- sudo nano /srv/pillar/prod/mysql.sls
mysql:
root_pw: production_mysql_root_pass
これらの環境ごとに異なるパスワードを選択してください。
構成自体に属さないデータがさらに必要になるため、後でこれらの柱に戻ります。 今のところ、開いているファイルを保存して閉じます。
/etc/mysql/my.cnf.jinjaテンプレートを作成します
以前に基本的なMySQL状態ファイルを作成しましたが、インストール用の管理対象ファイルを作成したことはありません。
のテストインストールを行ったとき mysql-server
私たちに stage-db1
以前のサーバー、私たちはプッシュしました /etc/mysql/my.cnf
ファイルをマスターにバックアップします。 それはまだSaltマスターキャッシュで利用できるはずです。 そのキャッシュファイルに至るまでのディレクトリ構造全体を /srv/salt/mysql
次のように入力してディレクトリを作成します。
- sudo cp -r /var/cache/salt/master/minions/stage-db1/files /srv/salt/mysql
コピーされたディレクトリに移動します mycnf
MySQL状態ディレクトリ内のファイル:
- 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はローカルループバックインターフェイスにバインドしています。 ノードのプライベートネットワークアドレスをリッスンするようにこれを設定します。
これを行うには、 bind-address
の行 [mysqld]
セクション。 を使用します network.interface_ip
ミニオンに割り当てられたアドレスを取得する実行モジュール関数 eth1
インターフェース。
. . .
[mysqld]
. . .
bind-address = {{ salt['network.interface_ip']('eth1') }}
もう1つ追加する必要があるのは、サーバーのDNS名前解決をオフにすることです。 追加することにより skip-name-resolve
オプション、名前と逆の名前解決を完了できない場合、MySQLは失敗しません:
. . .
[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
:
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]
定義する情報のタイプを指定するセクション。 このヘッダーの下で、クライアントが次の場所にあるUnixソケットでMySQLrootユーザーを使用してローカルマシンに接続するように指定できます。 /var/run/mysqld/mysqld.sock
. これらはすべてデフォルトのMySQL値です。
[client]
host = localhost
user = root
socket = /var/run/mysqld/mysqld.sock
ここで追加する必要があるのはパスワードだけです。 繰り返しになりますが、これをピラーシステムから直接プルします。 debconf
MySQL状態ファイルのセクション。 次のようになります。
[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
ファイル。
次に、追加して状態アプリケーションのドライランを実行します test=True
の終わりまで state.apply
実行モジュール機能:
- sudo salt stage-db1 state.apply mysql test=True
このコマンドは失敗することが予想されます。 ファイル内の一部の状態関数は、特定のパッケージがインストールされるまで使用できないため、ドライラン中に障害が発生することが予想されます。 実際の実行中、状態の順序付けにより、前提条件のパッケージがインストールされてから、それらを利用する状態が呼び出されます。
失敗国家に関するすべてのコメントは、「1つ以上の必要条件が失敗した」ことを示している必要があります。 mysql_setup
状態、これは次の理由で失敗するはずです debconf.set
利用できません(これは単なる別の前提条件の失敗です)。 ここでの出力を使用して、他の無関係なエラーが表面化しないようにします。
テストを実行した後、次のように入力して状態を適用できます。
- sudo salt stage-db1 state.apply mysql
これにより、状態の実行が成功するはずです。
SaltがMySQLデータベースに接続してクエリを実行できることをテストする必要があります。 次のように入力して、デフォルトのデータベースを一覧表示できることを確認してください。
- sudo salt stage-db1 mysql.db_list
次のようなリストが表示されます。
Outputstage-db1:
- information_schema
- mysql
- performance_schema
これは、Saltがで指定された情報を使用してMySQLインスタンスに接続できたことを示します。 /etc/mysql/salt.cnf
ファイル。
基本の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データベースのレプリケーションに取り組みます。