2018年3月22日

データソリューション技術グループの秋元です。主にScality RINGを担当しています。

Scality RINGをインストールするにはSaltStackが必須となりますが、今回は私が日々Scality RINGを扱って行く中で、最近その存在に気が付いたSaltStackのdiff機能についてまとめたいと思います。

なお、SaltStackの概要ついては過去にも紹介されていますので、ここでは触れません。

今回試した環境は下記となります。

[root@supv221 ~]# salt --version
salt 2016.11.9 (Carbon)
[root@supv221 ~]#

では本題です。
Linuxサーバを管理しているとサーバ間での設定の差分を確認したいと言うことはよくあると思います。
例えばサーバ間のrc.localの差分を確認するには下記の様なコマンドで確認が出来ます。

[root@supv221 ~]# ssh 10.22.0.11 'cat /etc/rc.d/rc.local' | diff -u /etc/rc.d/rc.local -
root@10.22.0.11's password:
--- /etc/rc.d/rc.local  2018-01-10 16:03:40.942156871 +0900
+++ -   2018-03-19 15:03:47.261093673 +0900
@@ -15,3 +15,4 @@
 echo "0" > /sys/kernel/mm/transparent_hugepage/khugepaged/defrag
 echo "never" > /sys/kernel/mm/transparent_hugepage/enabled
 echo "never" > /sys/kernel/mm/transparent_hugepage/defrag
+echo "0" > /sys/block/sdb/queue/rotational
[root@supv221 ~]#

数台の確認ならこれでも問題は無いのですが、対象が多い場合はforで回すと…結局は出力全体の目視確認が必要で辛くなってきます。

[root@supv221 ~]# for i in 10.22.0.{11..16};do echo $i;ssh $i 'cat /etc/rc.d/rc.local' | diff -u /etc/rc.d/rc.local -;done
10.22.0.11
root@10.22.0.11's password:
--- /etc/rc.d/rc.local  2018-01-10 16:03:40.942156871 +0900
+++ -   2018-03-19 15:05:33.203603278 +0900
@@ -15,3 +15,4 @@
 echo "0" > /sys/kernel/mm/transparent_hugepage/khugepaged/defrag
 echo "never" > /sys/kernel/mm/transparent_hugepage/enabled
 echo "never" > /sys/kernel/mm/transparent_hugepage/defrag
+echo "0" > /sys/block/sdb/queue/rotational
10.22.0.12
root@10.22.0.12's password:
--- /etc/rc.d/rc.local  2018-01-10 16:03:40.942156871 +0900
+++ -   2018-03-19 15:05:36.357722960 +0900
@@ -15,3 +15,4 @@
 echo "0" > /sys/kernel/mm/transparent_hugepage/khugepaged/defrag
 echo "never" > /sys/kernel/mm/transparent_hugepage/enabled
 echo "never" > /sys/kernel/mm/transparent_hugepage/defrag
+echo "0" > /sys/block/sdb/queue/rotational
10.22.0.13
root@10.22.0.13's password:
--- /etc/rc.d/rc.local  2018-01-10 16:03:40.942156871 +0900
+++ -   2018-03-19 15:05:40.062086340 +0900
@@ -15,3 +15,4 @@
 echo "0" > /sys/kernel/mm/transparent_hugepage/khugepaged/defrag
 echo "never" > /sys/kernel/mm/transparent_hugepage/enabled
 echo "never" > /sys/kernel/mm/transparent_hugepage/defrag
+echo "0" > /sys/block/sdb/queue/rotational
:
:

さすがにこれをやり続けるのは辛いのでSaltStackのドキュメントを調べると、やはりいい感じのコマンドが用意されていました。

https://docs.saltstack.com/en/latest/ref/modules/all/salt.modules.file.html#salt.modules.file.get_diff

このコマンドはファイルのみに利用できるコマンドですが、利用方法に少し癖があります。
SaltStackのドキュメントには例として下記が記載されています。

salt ‘*’ file.get_diff /home/fred/.vimrc salt://users/fred/.vimrc

“salt://~”で指定されるファイルはmaster側のファイルになりますが、これはmaster側のパラメータのfile_rootsで指定されるパスにアクセスするものになります。file_rootsはデフォルトでは/srv/salt/に設定されているので、このパスに比較したいファイルを置く必要があります。

手元のScality RINGがインストールされた環境ではRINGインストーラが設定する60_scality.confによりfile_rootsは下記のパスに設定されていました。

[root@supv221 ~]# cat /etc/salt/master.d/60_scality.conf
..snip..

file_roots:
base:
- /srv/scality/salt/local/
- /srv/scality/salt/formula/

..snip..
[root@supv221 ~]#

このパスに何かファイルを置いてfile.get_diffを試してみます。

[root@supv221 ~]# cp  /etc/rc.d/rc.local /srv/scality/salt/local/
[root@supv221 ~]# ls -l /srv/scality/salt/local/
合計 12
-rw-r--r-- 1 root root 449  3月  6 14:58 installer_top.sls
-rwxr-xr-x 1 root root 656  3月 19 15:07 rc.local
-rw-r--r-- 1 root root  83  2月 26 22:29 top.sls
[root@supv221 ~]# salt '*' file.get_diff /etc/rc.d/rc.local salt://rc.local
supv221:
stor225:
    --- /etc/rc.d/rc.local
    +++ salt://rc.local
    @@ -15,4 +15,3 @@
     echo "0" > /sys/kernel/mm/transparent_hugepage/khugepaged/defrag
     echo "never" > /sys/kernel/mm/transparent_hugepage/enabled
     echo "never" > /sys/kernel/mm/transparent_hugepage/defrag
    -echo "0" > /sys/block/sdb/queue/rotational
conn222:
conn221:
stor223:
    --- /etc/rc.d/rc.local
    +++ salt://rc.local
    @@ -15,4 +15,3 @@
     echo "0" > /sys/kernel/mm/transparent_hugepage/khugepaged/defrag
     echo "never" > /sys/kernel/mm/transparent_hugepage/enabled
     echo "never" > /sys/kernel/mm/transparent_hugepage/defrag
    -echo "0" > /sys/block/sdb/queue/rotational
stor224:
    --- /etc/rc.d/rc.local
    +++ salt://rc.local
    @@ -15,4 +15,3 @@
     echo "0" > /sys/kernel/mm/transparent_hugepage/khugepaged/defrag
     echo "never" > /sys/kernel/mm/transparent_hugepage/enabled
     echo "never" > /sys/kernel/mm/transparent_hugepage/defrag
    -echo "0" > /sys/block/sdb/queue/rotational
..snip..
[root@supv221 ~]#

出力結果としてはdiffをforで回した時とほぼ同じで、file.get_diffでは引き続き出力全体の目視確認が必要そうです。

もう一つSaltStackのドキュメントにはdiffに関する情報がありました。このコマンドは個人的にお気に入りです。

https://docs.saltstack.com/en/latest/ref/runners/all/salt.runners.survey.html#salt.runners.survey.diff

salt-run survey.diff [survey_sort=up/down] <target>
<salt-execution-module> <salt-execution-module parameters>

<salt-execution-module>にはいつも使っているcmd.runなども指定できるので、これを試してみます。

[root@supv221 ~]# salt-run survey.diff '*' cmd.run 'cat /etc/rc.d/rc.local'
minion pool :
------------
['stor221', 'stor222', 'stor223', 'stor224', 'stor225', 'stor226']
pool size :
----------
    6
pool result :
------------
    #!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.

touch /var/lock/subsys/local

echo "0" > /sys/kernel/mm/transparent_hugepage/khugepaged/defrag
echo "never" > /sys/kernel/mm/transparent_hugepage/enabled
echo "never" > /sys/kernel/mm/transparent_hugepage/defrag
echo "0" > /sys/block/sdb/queue/rotational

minion pool :
------------
['conn221', 'conn222', 'conn223', 'supv221']
pool size :
----------
    4
differences from "stor221" results :
-----------------------------------
--- stor221
+++ conn221
@@ -18 +17,0 @@
-echo "0" > /sys/block/sdb/queue/rotational


|_
  ----------
  pool:
      - stor221
      - stor222
      - stor223
      - stor224
      - stor225
      - stor226
  result:
      #!/bin/bash
      # THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
      #
      # It is highly advisable to create own systemd services or udev rules
      # to run scripts during boot instead of using this file.
      #
      # In contrast to previous versions due to parallel execution during boot
      # this script will NOT be run after all other services.
      #
      # Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
      # that this script will be executed during boot.

      touch /var/lock/subsys/local

      echo "0" > /sys/kernel/mm/transparent_hugepage/khugepaged/defrag
      echo "never" > /sys/kernel/mm/transparent_hugepage/enabled
      echo "never" > /sys/kernel/mm/transparent_hugepage/defrag
      echo "0" > /sys/block/sdb/queue/rotational
|_
  ----------
  pool:
      - conn221
      - conn222
      - conn223
      - supv221
  result:
      #!/bin/bash
      # THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
      #
      # It is highly advisable to create own systemd services or udev rules
      # to run scripts during boot instead of using this file.
      #
      # In contrast to previous versions due to parallel execution during boot
      # this script will NOT be run after all other services.
      #
      # Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
      # that this script will be executed during boot.

      touch /var/lock/subsys/local

      echo "0" > /sys/kernel/mm/transparent_hugepage/khugepaged/defrag
      echo "never" > /sys/kernel/mm/transparent_hugepage/enabled
      echo "never" > /sys/kernel/mm/transparent_hugepage/defrag
[root@supv221 ~]#
  • 文字の色がついていない前半部分では、各poolごとの差分が表示されています。
  • 緑の文字色となっている後半部分では、各poolごとの実際の出力結果が表示されています。

斬新な出力結果ですが、この表示はかなり見やすい気がします。
差分が無いものはサーバごと(pool)にまとめられているので、差分の有るもの無いものが一目で分かります。
このコマンドを知ってからはSaltStackを使う環境でのサーバ間のdiffはこれ一択になりました。
これはもうお勧めです!

まとめ
salt-run survey.diffはいい感じに差分を表示してくれるので、SaltStackを使うなら覚えておいても良いのではないでしょうか。

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

投稿者: 秋元

ブロードバンドタワーでScality RINGを担当しています。検証、構築、サポートと幅広くやらせて頂いています。