インフラ管理ツール SaltStack ってなんだ！？（連載１回目）

# [SaltStack](https://docs.saltstack.com/en/latest/)とは？
SaltStack、別名Saltです。
インフラの構築手順をコードで記述し、これらの手続きを自動化するためのツールです。
クラウドに対応しており、AWSにおけるEC2インスタンスの作成、ミドルウェアのインストール・設定・アップデート、アプリケーションのデプロイなどを実施することができます。
似たような製品は幾つかあり、[Chef](https://www.chef.io/chef/)、[Puppet](https://puppet.com/)、[Ansible](https://www.ansible.com/)などが有名です。

実際に試してみると、ChefやAnsibleにはない便利な機能を持っており、ほとんどのインフラ管理はこれで賄えてしまう便利さを持っているのですが、残念なことに日本国内では利用実績が少ないのが現状です。
そこで、インストール方法や簡単な使い方について、連載記事のような形で紹介しようと思います。

## Saltの良いところ
Saltは、Puppetのような高機能を持ちながら、Ansibleのように簡単にインフラ管理を自動化できる事が最大のメリットです。

インフラ管理のコードはyamlのテンプレートだけで記述することができます。
テンプレートエンジンから出力されるyamlをSaltが読み込み、そのyamlを元にサーバ上の設定を更新します。（Ansibleみたいですね）

手軽にコードを記述一方で、強力なイントロスペクション機能を持っており、サーバのターゲティング（どのサーバにどの設定を適用するか？）が簡単にできるよう設計されています。

Ansibleは簡単に導入できますが、コードの増加、サーバ台数の増加に従って、次第に管理が複雑になってきます。
「yamlをテンプレートエンジンで出力する」というアプローチなので、Puppetのような独自DSLを覚える必要がありません。
込み入った手続きをChefで記述すると、ruby_block に頼らざるを得ない場合がありますが、Saltは標準機能が比較的豊富なので、無理なく記述することができます。

美味しいところのいいとこ取り、それがSaltです。

## Saltの悪いところ
さて、Saltをべた褒めしたのですが、一方で悪いところもあります。
思いつく限りだと以下のようなものがあります。

#### 複雑なロジックの記述が苦手
yamlのレンダリングにPythonで実装されたテンプレートエンジン(jinja)を利用しています。
あくまでテンプレートエンジンなので、複雑な処理は苦手です。
この不足分をSaltの機能である程度補っているのですが、それでもやはり不足感は否めません。
（ただ、いざとなったら直接Pythonで記述する事もできるので、詰む事は少ないです）

#### 頻繁なバージョンアップと互換性の欠如
以前、Saltのメジャーバージョンアップした際に動作しない現象が発生しました。
幸い、設定ファイルの修正だけで済んだのですが、Saltのバージョンアップは必ずテスト環境などで確認したほうが良いでしょう。

#### コミュニティがまだ弱い
まだマイナーなためかコミュニティが弱いように思えます。
Chef supermarketのようなものもSaltには存在しますが、絶対数が足りない事と、品質にバラつきがあります。
これらは参考程度に捉え、自分で実装したほうが結果的にうまくいきます。

#### 日本語の情報が少ない
はい、だから頑張って書きます。

# 対応ディストリビューション
Saltが対応しているディストリビューションは 2016-09-29 現在、以下のものがあります。

- Arch Linux
- Debian GNU/Linux / Raspbian
- Fedora
- FreeBSD
- Gentoo
- OpenBSD
- OS X
- RHEL / CentOS / Scientific Linux / Amazon Linux / Oracle Linux
- Solaris
- Ubuntu
- Windows
- SUSE

この連載では、最終的にクラウド連携まで書きたいので、 Amazon Linux を使います。

# 実際に使ってみよう
今回は１回目ということもあって、とりあえずSaltのインストールと、Saltを使って nginx のインストールするところまでやってみましょう。
細かいアーキテクチャーの説明や、用語、実践的なコードは次回以降に書いていこうと思います。

## Saltのインストール
Saltは複数の方法でインストールすることができるのですが、
Saltが提供している salt-bootstrap を使うと簡単にインストールすることができます。

適当なEC2インスタンスを作成し、以下のコマンドを実行してみてください。

```bash:terminal
wget -O bootstrap_salt.sh https://bootstrap.saltstack.com
sudo sh bootstrap_salt.sh
```

これでSalt（正確には**salt-minion**）のインストールは完了です。

# Saltでnginxをインストールする
今回は第１回目なので、簡単なところから始めましょう。
とりあえず、何も考えず以下のように、
*/srv/salt* に *top.sls* と *example.sls* を作成してください。

```bash:terminal
sudo mkdir /srv/salt
sudo vi /srv/salt/top.sls
sudo vi /srv/salt/example.sls
```

```yaml:top.sls
base:
  '*':
    - example
```

```yaml:example.sls
example-install:
  pkg.installed:
    - name: nginx
```

これで nginx をパッケージからインストールするコードが記述できました。
では、実際に nginx がインストールされるか確認してみましょう。

まずは、nginxがインストールされていない事を確認します。

```bash:terminal
sudo yum list installed nginx
```

この段階では、nginx はインストールされていません。
では、Saltを実行し、nginxをインストールしてみます。

```bash:terminal
sudo salt-call --local state.highstate
```

2016-09-29 現在以下のWarningが発生しますが、将来のバージョンで修正される予定なので無視してください。

```text:terminal
/usr/lib/python2.6/site-packages/salt/grains/core.py:1493: DeprecationWarning: The "osmajorrelease" will be a type of an integer.
```

では、nginxがインストールされているか確認してみましょう。

```bash:terminal
sudo yum list installed nginx
```

無事、インストールされている事が確認できました。

# 次回は
次回は先ほど作成した *top.sls*、 *example.sls* について説明します。
また、nginxの設定ファイルの生成、実際の運用を考慮し、nginxの設定ファイルが「**更新された時のみ**」nginxをreload/restartする手法について説明したいと思います。