サーバのオペレーションをしている時、ホスト名のみを羅列したファイルを用意して pssh
や fabric
なんかでワンライナーを流すみたいなことをよくやる。
$ cat hostlist host1 host2 host3
pssh
は -h hostlist
とかするとそのままファイルを読んでくれるが、
fabric
は -H
オプションに カンマ区切りで ホスト一覧を指定しないといけない。
何も考えずにワンライナーでやるとしたら tr
を使って改行をカンマに置換する
$ fab -H $(tr '\n' ',' < hostlist) -- uname -n
だがしかし、 fabric
は文末にカンマがあると以下のように 空のホスト名として認識しホスト名をいれろと催促してくる
$ echo $(tr '\n' ',' < hostlist) host1,host2,host3, $ fab -H $(tr '\n' ',' < hostlist) -- uname -n -- -- snip -- -- [] Executing task '<remainder>' No hosts found. Please specify (single) host string for connection: No hosts found. Please specify (single) host string for connection: ^C Stopped.
これはちょっとうざいので何とかしたい。 ってことで、以下のように変更した。
$ fab -H $(echo `cat hostlist` | tr ' ' ',') -- uname -n -- -- snip -- -- $ echo $(echo `cat hostlist` | tr ' ' ',') host1,host2,host3
これで毎回聞かれなくなったのであった。 めでたしめでたし。
なおこの方法は、引数の最大長を超えるとエラーになるけどそこまで大量のホストに対してこの方法で実行しないだろうから大丈夫だよね?…ね?
$ getconf ARG_MAX 262144
2016/02/09リンク追加
もっとスマートなやり方を教えていただいたので追記しました。