2016年10月27日

ブロードバンドタワーの池田です。

タイトルでSaltとして紹介しましたが、正確にはSaltStack社が提供している構成管理ツールです。私がこのツールを知ったのは、Scality社のScality RINGのイントーラーがsaltを利用することが切っ掛けですが、運用開始後もsaltコマンドを使用することで、Scality RINGのような多数のサーバの構成管理や設定の変更など様々な用途でsaltコマンドを使用できるため、今回この場を借りてご紹介させて頂きます。

目次

SaltStackのメリット

Saltstackはサーバ/クライアント型のツールで、サーバ側をmaster、クライアント側はminionが担当します。SaltStackのメリットは、masterがminionを認証してしまえば、クライアント(minion)のrootパスワードを変更してもmasterからコマンドを発行しminion上でコマンドを実行することができることです。
また、sshやscpと違って1ホスト毎にコマンドを発行するのではなく、指定する複数ホストに対して一括でのコマンド実施が可能なことは大きなメリットです。

インストールの前に

saltstackはTCPの4505、4506を使用します。iptablesを使用している場合には、ポートの解放をしましょう。

バージョンについて

Saltstackには2016年3月版と2015年8月版があり、それぞれ指定できるオプションなどが異なります。

インストール環境の説明

今回の環境は以下となります。(ホスト名:IPアドレス)
supervisor:172.16.51.221
store1:172.16.51.222
store2:172.16.51.223

*sutpervisorをサーバ、store1,store2をクライアントとしています。

OS:CentOS release 6.8 (Final)

今回の環境では、saltstackのバージョンは2015年8月版(Version12)を使用します。

インストールの実施

なおサーバ側にはmasterとminonの両方をインストールします。これはmasterサーバ側に対しコマンドを発行する場合に、minionがないとコマンドを受け付けてくれないためです。

[root@supervisor ~]# yum install -y https://repo.saltstack.com/yum/redhat/salt-repo-2015.8-3.el6.noarch.rpm
[root@supervisor ~]# yum install -y salt-master salt-minion

インストール後、99-master-address.conf を作成し、masterの指定を明記します。

[root@supervisor ~]#  echo "master: 172.16.51.221" > /etc/salt/minion.d/99-master-address.conf

念のため確認

[root@supervisor ~]# cat /etc/salt/minion.d/99-master-address.conf
master: 172.16.51.221

登録後は、masterとminionを起動します。

[root@supervisor ~]# service salt-master start
Starting salt-master daemon:                               [  OK  ]
[root@supervisor ~]# service salt-minion start
Starting salt-minion daemon:                               [  OK  ]

次に、クライアント側にminionをインストールします。

[root@store1 ~]# yum install -y https://repo.saltstack.com/yum/redhat/salt-repo-2015.8-3.el6.noarch.rpm
[root@store1 ~]# yum install -y salt-minion

同じくmasterサーバの指定を以下の通り行います。

[root@store1 ~]# echo "master: 172.16.51.221" > /etc/salt/minion.d/99-master-address.conf

念のため確認

[root@store1 ~]# cat /etc/salt/minion.d/99-master-address.conf
master: 172.16.51.221

登録後は、minionを起動します。

[root@store1 ~]# service salt-minion start

minionの起動後は、master側でクライアント(minion)の認証を行います。

[root@supervisor ~]# salt-key
Accepted Keys:
Denied Keys:
Unaccepted Keys:
store1
store2
supervisor
Rejected Keys:

salt-keyコマンドにより、master/minionで通信を行い、現在Unaccepted Keys:以下に未承認のホストが3台あることがわかります。

salt-key コマンドの-Aオプションにより、承認をします。

[root@supervisor ~]# salt-key -A
The following keys are going to be accepted:
Unaccepted Keys:
store1
store2
supervisor
Proceed? [n/Y] y
Key for minion store1 accepted.
Key for minion store2 accepted.
Key for minion supervisor accepted.

承認されると、以下の通りUnaccepted Keys:以下にあった3台のホストが、Accepted Keys:以下に移動します。

[root@supervisor ~]# salt-key
Accepted Keys:
store1
store2
supervisor
Denied Keys:
Unaccepted Keys:
Rejected Keys:

これで、masterからminionに対しコマンドの実行が可能になります。

コマンドの記述方法としては、saltコマンドはホスト名と実施するコマンドを指定することができます。
注意点としては、interactiveなコマンドの実施はできません。

以下の例では、masterからすべてのminionが稼動するクライアントに対し、pingを実施しています。

[root@supervisor ~]# salt '*' test.ping
store1:
    True
store2:
    True
supervisor:
    True

おいしい使い方

1)cmd.run
cmd.runを使用することで、クライアント上でコマンド実施が可能です。これはよく使うオプションのひとつですが、
かなり便利です。

[root@supervisor ~]# salt '*' cmd.run 'ls -la /etc/hosts'
supervisor:
    -rw-r--r--. 1 root root 158 Jan 12  2010 /etc/hosts
store2:
    -rw-r--r--. 1 root root 158 Jan 12  2010 /etc/hosts
store1:
    -rw-r--r--. 1 root root 158 Jan 12  2010 /etc/hosts

2) ホストの指定方法
すでに何度が使用していますが、*を使うことで、補完が可能です。

[root@supervisor ~]# salt 'store*' test.ping
store1:
    True
store2:
    True

また、-Cオプションを使うことで、ターゲットのminionを絞ることも可能です。

[root@supervisor ~]# salt -C 'store* and not store2' test.ping
store1:
    True

3)salt-cp
salt-cpを使用することで、master上にあるファイルをminionへ転送することができます。

[root@supervisor ~]# echo test > /tmp/test.file
[root@supervisor ~]# cat /tmp/test.file
test
[root@supervisor ~]# salt-cp 'store*' /tmp/test.file /tmp
store1:
    ----------
    /tmp/test.file:
        True
store2:
    ----------
    /tmp/test.file:
        True
[root@supervisor ~]# salt 'store*' cmd.run 'cat /tmp/test.file'
store2:
    test
store1:
    test

4) service.start と service.stop
minion上でserviceコマンドを実行します。以下の例ではhttpdをインストールし、httpdのサービスの起動、停止を実施しています。

[root@supervisor ~]# salt 'store*' cmd.run 'yum -y install httpd'
store2:
    Loaded plugins: fastestmirror, security
    Setting up Install Process

===インストールログは割愛===

    Installed:
      httpd.x86_64 0:2.2.15-54.el6.centos

    Complete!
store1:
    Loaded plugins: fastestmirror, security
    Setting up Install Process

===インストールログは割愛===

    Installed:
      httpd.x86_64 0:2.2.15-54.el6.centos

    Complete!
[root@supervisor ~]#
[root@supervisor ~]# salt 'store*'  service.start httpd
store2:
    True
store1:
    True
[root@supervisor ~]# salt 'store*' cmd.run 'service httpd status'
store1:
    httpd (pid  24066) を実行中...
store2:
    httpd (pid  25606) を実行中...
[root@supervisor ~]# salt 'store*'  service.stop httpd
store2:
    True
store1:
    True
[root@supervisor ~]# salt 'store*' cmd.run 'service httpd status'
store2:
    httpd は停止しています
store1:
    httpd は停止しています

saltだけに、ちょっとしょっぱいこと

minionが反応せずにコマンドが通らないことはしばしばありますが、経験したもので一番しょっぱかったのが
古いバージョンでは、cmd.runでminion上でコマンドを実施した際にPATHが通らずコマンドに実行に失敗する
というものがありました。saltstackのバージョンアップで回避できましたが、そういうものもたまにありますね。

本ブログの情報につきましては、自社の検証に基づいた結果からの情報提供であり、
品質保証を目的としたものではございません。

投稿者: 池田

主にストレージ関連のお仕事をしております