今までの無駄作業
例えば以下のようなサーバー郡があるとする。
[nkym@localhost ~]$ knife node list
server001.test.net
server002.test.net
server003.test.net
server004.test.net
server005.test.net
server006.test.net
.
.
.
全てのサーバにknife ssh
を使用してコマンドを流したい時は、以下のようにすると思う。
[nkym@localhost ~]$ knife ssh "name:*" "hostname"
xxx.xxx.xxx.xxx server001.test.net
xxx.xxx.xxx.xxx server002.test.net
xxx.xxx.xxx.xxx server003.test.net
xxx.xxx.xxx.xxx server004.test.net
xxx.xxx.xxx.xxx server005.test.net
xxx.xxx.xxx.xxx server006.test.net
.
.
.
ただ、特定のサーバのみにコマンドを流したい場合など、ホスト名には*
以外の正規表現が使用できなそうなので
無知な私はそのたびにリストを取得してknife ssh
を実行してくれるスクリプトを書いていた。
便利なオプション、その名は-m
公式ドキュメント( https://docs.chef.io/knife_ssh.html )を見ると、
-m, --manual-list
Define a search query as a space-separated list of servers.
If there is more than one item in the list,
put quotes around the entire list. For example: --manual-list "server01 server02 server03"
「・・・リストできるやん(´・ω・`)」
使い方
公式に記載されている通り、スペース区切りでホスト名を書くとそれぞれにコマンドを流してくれる。
[nkym@localhost ~]$ knife ssh -m "server001.test.net server002.test.net server003.test.net" "hostname"
xxx.xxx.xxx.xxx server001.test.net
xxx.xxx.xxx.xxx server002.test.net
xxx.xxx.xxx.xxx server003.test.net
リストを読み込む
テキストファイルなどにホスト名を記載して、それを読み込むことで奇数番号のみなど自分が実行したいサーバ郡に対してコマンド1つでコマンドを流すことができる。
[nkym@localhost ~]$ cat server_list.txt
server001.test.net
server003.test.net
server005.test.net
server007.test.net
server009.test.net
.
.
.
[nkym@localhost ~]$ knife ssh -m "$(cat server_list.txt)" "hostname"
xxx.xxx.xxx.xxx server001.test.net
xxx.xxx.xxx.xxx server003.test.net
xxx.xxx.xxx.xxx server005.test.net
xxx.xxx.xxx.xxx server007.test.net
xxx.xxx.xxx.xxx server009.test.net
.
.
.
まとめ
knife sshの-m
オプションを使用することで、特定のサーバのみにコマンドを流し込むことができる。
これによりサーバリストを動的に作成するスクリプトを作って、そのサーバリストを使用してknife ssh
すればもっと楽にレシピ適用とかできそう。
もっと早くに気づきたかった。。。