ぶていのログでぶログ

思い出したが吉日

文末のカンマを付けずに改行区切りのファイルを1行のカンマ区切りにする

サーバのオペレーションをしている時、ホスト名のみを羅列したファイルを用意して psshfabric なんかでワンライナーを流すみたいなことをよくやる。

$ 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リンク追加

もっとスマートなやり方を教えていただいたので追記しました。

buty4649.hatenablog.com