SaltStack を使ってみる（入門編）

## 前置き
現在のサーバ構築には欠かせなくなってきている、[Chef](https://www.chef.io/ "Chef")。
『Infrastructure as Code』を実現する構成管理フレームワークとしては最も有名なツールで、広く使われていると思います。

構成管理フレームワークには、Chef 以外にも [Puppet](https://puppetlabs.com/ "Puppet") や [Ansible](http://www.ansible.com/ "Ansible") など古くから有名なものもいくつかあります。
しかしながら、Python ベースの構成管理フレームワークである [SaltStack](http://www.saltstack.com/ "SaltStack")（以下、Salt）は日本ではあまり有名ではありません。
ドキュメントが日本語化されておらず、日本語の情報もほとんど無いからだと思います。

そこで、今回はこの Salt について記載していきたいと思います。

## 使い始めた経緯
個人的に [FreeBSD](https://www.freebsd.org/ja/ "FreeBSD") が好きで、自宅サーバはほぼ全て FreeBSD をベースに構築しています。

ESXi 上にゲストを立てて運用しているので台数も増え、だんだん新規構築が面倒になってきていました。

またご存知の方も多いかもですが、主に検証用として、[DigitalOcean](https://www.digitalocean.com/ "DigitalOcean") というホスティングサービスをヘビーユースしています。
（最近 FreeBSD にも対応しました！！DigitalOcean に興味があれば [Referral Program](https://www.digitalocean.com/?refcode=333ec533191f "Referral Program") を踏んで使ってみてもらえると嬉しかったりしますｗ）

AWS を含め、こういったクラウドサーバの構築を手動でやるのはそろそろ無いな〜と思いはじめていた、というのもありました。

そこで、流行の Chef を使っていこう！と思ったのですが、、、FreeBSD10-RELEASE ではうまく動かない！
具体的には pkgng に対応していて欲しかったのですが、Chef の公開バージョンではどうも古いコマンドを実行しているようなのでした。

じゃあ他になにがいいかなと探した所、Salt を見つけたのでした。

## SaltStack 事始め
Salt は SaltStack が開発している、Python をベースに開発されたオープンソースの構成管理フレームワークです。

2011 年ごろにリリースされた新興のフレームワークで、日本ではあまり知られていないかと思います。
ただ最近では Google が開発中の Dockerコンテナ管理のオーケストレーションツールである Kubernetes のプロジェクト支援に名乗りをあげています。

[グーグル主導のDockerコンテナー管理フレームワーク「Kubernetes」にマイクロソフトやレッドハットが参加 - @IT](http://www.atmarkit.co.jp/ait/articles/1407/11/news100.html "")

Salt はまず通信要件として 4505、4506 ポートを利用して通信を行います。

またサーバ側（管理側）を Master と呼び、クライアント側は Minion と呼びます。
それぞれデーモン起動が必要ですが、コマンドライン上からフォアグラウンド起動もできます。

Salt では Chef でいうところの Recipe、Ansible でいうところの Playbook に相当するものを State といい、Chef でいう Data Bag の様なデータ管理の仕組みは Pillar といいます。

## SaltStack の使い方
だらだらと話を続けてもなので、細かい話はもう置いておいてさっくりと使い方を！

pip などで Python パッケージとしてインストールすることもできますが、今回は OS でのパッケージインストールのみを記載します。

また、長くなってしまうので Minion のみでの Standalone 実行をする方法のみを記載したいと思います。

### Minion インストール
[情報参照元（2.Installation）](http://docs.saltstack.com/en/latest/topics/installation/index.html "情報参照元（2.Installation）")

* RHEL / CentOS

```RHEL/CentOSパッケージインストール
※ RedHat 系の場合 EPEL を追加する。
# yum install -y epel-release && yum update -y
# yum install -y salt-minion
# chkconfig salt-minion on
# service salt-minion start
```

* Ubuntu

```Ubuntuパッケージインストール
※ リポジトリを追加する。
# add-apt-repository ppa:saltstack/salt && apt-get update
# apt-get install salt-minion
```

* FreeBSD

```FreeBSDパッケージ
※ パッケージをアップデートしておく
# pkg upgrade -y
# pkg install -y py27-salt
# sysrc salt_minion_enable="YES"
# service salt_minion start
```

### State ファイルを作成
YAML 形式で SaltState ファイル（SLSファイル）を作成します。

top.sls というファイルに環境毎に実行する State の振り分けを記載し、そこに記載した State を個別の sls ファイルとして作成します。

以下の内容はサンプルで、どのサーバにも必ず設定する default という State ファイル、指定したノードに対して個別にインストールする nginx の State ファイルを作成した場合のイメージです。
また、以下の保管先パスについてはインストール後の標準設定の場合で、Salt の設定ファイルで変更できます。

[情報参照元（3.3.1. How Do I Use Salt States?）](http://docs.saltstack.com/en/latest/topics/tutorials/starting_states.html "情報参照元（3.3.1. How Do I Use Salt States?）")

* top.sls
 * 管理対象サーバ全体、個別に適用する設定を記載します。
 * アスタリスクを使った部分一致や、対象の OS やバージョンを条件分岐につかっての振り分けも記載できます。

```保管先
※ Linux の場合
# vi /srv/salt/top.sls

※ FreeBSD の場合
# vi /usr/local/etc/salt/states/top.sls
```

```top.sls
base:
  '*':
    - default
  '*web*':
    - nginx
```

* default.sls
 * 実際に適用する内容を SaltStack のフォーマットで記載します。
 * 以下は共通の test1 ユーザを作成する場合のサンプルです。

```保管先
※ Linux の場合
# vi /srv/salt/default.sls

※ FreeBSD の場合
# vi /usr/local/etc/salt/states/default.sls
```

```default.sls
# Add user
useradd_test1:
  user.present:
    - name: test1
    - fullname: Test1 user
    - shell: /bin/bash
    - home: /home/test1
    - uid: 4000
    - gid: 4000
    - groups:
      - wheel
```

* nginx.sls
 * nginx をパッケージでインストールする場合のイメージです。
 * top.sls で指定している様に、web をノード名に持つサーバに対して nginx をインストールする場合のサンプルです。

```保管先
※ Linux の場合
# vi /srv/salt/nginx.sls

※ FreeBSD の場合
# vi /usr/local/etc/salt/states/nginx.sls
```

```nginx.sls
# Install nginx package
install_nginx:
  pkg.installed:
    - name: nginx

# Managed nginx config
manage_nginxconf:
  file.managed:
    - name: /etc/nginx/nginx.conf
    - source: salt://files/nginx/nginx.conf
    - mode: 0644
    - user: nginx
    - group: nginx
 
# Run and enable nginx daemon
enable_nginx:
  service.running:
    - name: nginx
    - enable: True
    - require:
      - pkg: install-nginx
    - watch:
      - file: manage_nginxconf
```

* nginx.conf
 * 適用させたい nginx の設定ファイルを、ローカルに保管する場合の配置場所です。
 * ファイルパスは salt:// で指定した場合には、その State のカレントパスからです。

```保管先
※ Linux の場合
# vi /srv/salt/files/nginx/nginx.conf

※ FreeBSD の場合
# vi /usr/local/etc/salt/states/files/nginx/nginx.conf
```

```nginx.conf
〜 nginx の設定を記載 〜
```

### Salt を Standalone で実行する
今回は salt-minion のみを使った、Standalone 実行をする方法を記載します。

以下のページには --local を省略する設定の書き方、ログレベルの設定方法なども記載されています。

[情報参照元（3.1.1. Salt Masterless Quickstart）](http://docs.saltstack.com/en/latest/topics/tutorials/quickstart.html "情報参照元（3.1.1. Salt Masterless Quickstart）")

今回はスタンドアロン実行を、ログレベル warning で実行したいと思います。
（この highstate の意味はなんでしょうね・・・？ｗ）

```salt-call
# salt-call --local -l warning state.highstate
```

## あとがき
以上が Salt のかんたんな導入方法になります。

上記以外にも状態、環境による様々な分岐や、依存関係の設定など色々な記載方法があります。
なので、今後も少しずつ、読み解いた結果を展開していきたいと思います。

もしご興味ご感心ご感想があれば、コメント頂ければやる気出ると思いますのでぜひ！ｗ

以上、SaltStack 入門編でした。