序章

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

このシリーズの最後のガイドでは、Webサーバーの前にロードバランサーとしてHAProxyを設定しました。 このガイドでは、焦点を変更して、各環境にMySQLデータベースサーバーをインストールおよび管理する状態を作成します。 この記事では、MySQLの基本的なインストールとセットアップについて説明します。 将来のガイドでは、レプリケーションを設定するというより複雑なタスクに取り組みます。

debconf-utilsでMySQLプロンプト情報を取得する

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

状態ファイルを使用する前に、ミニオンの1つにMySQLのテストインストールを実行する必要があります。 その後、 debconf-utils 記入する必要のあるプロンプトに関する情報を取得するためのパッケージ。

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

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

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

  1. sudo salt stage-db1 pkg.install mysql-server

簡単にクエリするために debconf 必要なプロンプト情報のデータベースについては、 debconf-utils データベースミニオンのパッケージ:

  1. sudo salt stage-db1 pkg.install debconf-utils

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

  1. 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_passwordmysql-server/root_password_again). これらのエントリの2行目は、状態ファイルで指定する必要があるフィールドタイプを指定します。

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

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

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

  1. sudo salt-cloud -d stage-db1

サーバーが削除されたら、次のように入力して、バックグラウンドでサーバーを再作成できます。 The sm この例では、適切なクラウドクレデンシャルを持つSaltマスターサーバーの名前です。

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

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

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

まず、MySQL状態のディレクトリを作成します。 /srv/salt ディレクトリ:

  1. sudo mkdir -p /srv/salt/mysql

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

  1. 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 プロンプトの入力に使用できる情報の辞書を含む構造。

The data 構造は基本的に、テスト用のMySQLインストールから照会したプロンプトに関する情報を使用します。 これらのフィールドに使用する必要があるフィールド名とデータ型はわかっています。 実際のパスワードを指定するには、Saltpillarシステムからプルします。 pillar.get 実行モジュール機能。

ピラーシステムでパスワードを設定するのは少し後でします。 これにより、パスワードデータを構成から分離しておくことができます。

ノート

内に保存されている辞書のインデントに細心の注意を払ってください 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

最後に、 service.restart リロードする状態 salt-minion 自分自身を処理します。 これは、ミニオンが /etc/salt/minion.d/mysql.conf ファイル。 欲しいのは salt-minion に変更があった場合に再起動します /etc/salt/minion.d/mysql.conf ファイル自体。 使用できます 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ピラーファイルを作成する前に、ピラー「トップ」ファイルを作成する必要があります。 一番上のファイルは、ソルトミニオンをピラーデータと照合するために使用されます。 ソルトミニオンは、トップファイルで一致しないピラーデータにアクセスできなくなります。

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

  1. cd /srv/pillar
  2. sudo nano top.sls

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

柱は、ドット表記を使用してディレクトリ内のファイルを示します。 たとえば、柱システムのルートは /srv/pillar. を割り当てるには mysql.sls 内にある柱 dev ディレクトリ、使用します 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

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

環境固有の柱の作成

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

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

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

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

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

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

/srv/pillar/stage/mysql.sls
mysql:
  root_pw: staging_mysql_root_pass

使用するパスワードを選択してください。 完了したら、ファイルを保存して閉じます。 今のところ必要なのはこれだけです。

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

  1. sudo nano /srv/pillar/dev/mysql.sls
/srv/pillar/dev/mysql.sls
mysql:
  root_pw: development_mysql_root_pass

本番環境の柱についても同じようにします。

  1. 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状態ファイルを作成しましたが、インストール用の管理対象ファイルを作成したことはありません。

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

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

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

  1. cd /srv/salt/mysql/files/etc/mysql

現在存在するファイルを .orig 必要に応じて変更を元に戻すことができるように、接尾辞を付けます。

  1. sudo cp my.cnf my.cnf.orig

次に、名前を変更します my.cnf 持っているファイル .jinja サフィックス。 これは、このファイルがテンプレートであり、レンダリングせずにホストにドロップできるファイルではないことを一目で示します。

  1. sudo mv my.cnf my.cnf.jinja

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

  1. sudo nano my.cnf.jinja

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

これを行うには、 bind-address の行 [mysqld] セクション。 を使用します 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 ディレクトリ:

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

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

  1. 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 ディレクトリ:

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

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

/srv/salt/mysql/files/etc/mysql/salt.cnf.jinja
[client]
host                = localhost
user                = root
socket              = /var/run/mysqld/mysqld.sock

ここで追加する必要があるのはパスワードだけです。 繰り返しになりますが、これをピラーシステムから直接プルします。 debconf MySQL状態ファイルのセクション。 次のようになります。

/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 状態ファイルをレンダリングできることを確認するための実行モジュール関数:

  1. sudo salt stage-db1 state.show_sls mysql

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

次に、追加して状態アプリケーションのドライランを実行します test=True の終わりまで state.apply 実行モジュール機能:

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

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

失敗国家に関するすべてのコメントは、「1つ以上の必要条件が失敗した」ことを示している必要があります。 mysql_setup 状態、これは次の理由で失敗するはずです debconf.set 利用できません(これは単なる別の前提条件の失敗です)。 ここでの出力を使用して、他の無関係なエラーが表面化しないようにします。

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

  1. sudo salt stage-db1 state.apply mysql

これにより、状態の実行が成功するはずです。

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

  1. sudo salt stage-db1 mysql.db_list

次のようなリストが表示されます。

Output
stage-db1
: - information_schema - mysql - performance_schema

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

基本のMySQL状態が正しく機能することを確認したので、 stage-db1 サーバ:

  1. sudo salt-cloud -d stage-db1

サーバーをバックグラウンドで再作成して、後でさらにテストできるようにします。 また、 sm この場合のSaltマスターサーバーの名前は次のとおりです。

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

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

結論

これで、MySQLをミニオンにインストールする状態ができたはずです。 これらはまたキックします salt-minion Saltが関連するデータベースに接続して管理できるように、これらの各サーバーでプロセスを実行します。

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