本文を読み飛ばす

mercurialのpush(ssh)で複数のコマンドを実行する

更新 19/02/22 今日も sudoerは後で書いているルールが優先 にハマりました

特定ファイルのコピーを含めたpushを実施しているのですが、 パスワード入力が大変なので、工夫してみました。

From:

scp file host://path/to/deploy/file
hg push
ssh host "sudo systemctl restart my.service"

To:

tar cf - file | ssh -t -M host "tar xvf - -C /path/to/deploy"
hg push -e "ssh -t -S host"
ssh -t -S host host "sudo /bin/systemctl restart my.service"

1. sshを shared connection にする

同じホストにsshを何回も実行するのは大変なので shared connectionという機能があります。

"-M" オプションで開始して、 "-S host" で継続します。

このとき.ssh/configに以下のように設定します

host *
  ControlMaster auto
  ControlPath ~/.ssh/ssh_mux_%h_%p_%r
  ControlPersist 600

デフォルト値での動作は見ていませんが、 ControlPersistで指定した時間内は shared connectionが動きました。

今回、単にパスワードを入力する回数を減らしたかったのですが、 ssh-agentの方がやり方としては有名だと思います。

shared connectionが有効なのは、

  • 何回もconnectionを開くのが負担になる場合

  • サーバ側の設定が不要

  • 時折、パスワード入力がある

という点があると思います。 (あんまり詳しくないのであれですが)

2. mercurialで shared connection を活用する

mercurialからshared connectionを活用するには "-e/--ssh" オプションを使います。

これは問題なくできましたが、 "-S"オプションには引数があるので注意してください。 "-M"オプションのときのホスト名が必要です。

3. scpをsshに変更する (scpには ssh shared connectionがない)

scpには"-S"のオプションがないので、 tarコマンドなどを駆使して実行します。

今回のようにファイルが1つなら、catでもいいんじゃないかと思います。

4. hostのsudoersにNOPASSWDを設定する

これが一番ハマったんですが、 sudoerは後で書いているルールが優先 なんで こう書いてください:

%sudo ALL=(ALL:ALL) ALL
...
%sudo ALL=NOPASSWD: /bin/systemctl restart my.service

こう書いてはだめです:

%sudo ALL=NOPASSWD: /bin/systemctl restart my.service
...
%sudo ALL=(ALL:ALL) ALL

わかったら簡単なことなんですけど、ハマりました。

あと、 sudo visudo してからしばらくの間は、 パスワード入力しなくてもsudoできてしまうので、それが問題の発覚を送らせました。

visudoする端末と、sudo実験する端末は分けた方がいいですね。

コメント

Comments powered by Disqus
宣伝: