2013/12/11

[小ネタ]cfn-initでsudoする方法

fluentdのインストールスクリプトはスクリプト内でsudoコマンドを使用しているが、これをcfn-initで実行しようとすると以下のエラーが出る。
sudo: sorry, you must have a tty to run sudo
これは/etc/sudoersに
Defaults requiretty
という記載があり、tty以外からのsudoコマンドの使用が制限されているため。

「じゃあ、cfn-initはいったいどんな環境で実行されているんだろう?」と思って、
"commands" : {
  "env" : {
    "command" : "env > /tmp/cfn-init.env"
  }
}
こんな感じでCloudFormationのStackを作ってみた。
結果は以下の通り。
$ cat /tmp/cfn-init.env
TERM=linux
PATH=/sbin:/usr/sbin:/bin:/usr/bin
_=/bin/env
runlevel=3
RUNLEVEL=3
LANGSH_SOURCED=1
PWD=/
LANG=en_US.UTF-8
previous=N
PREVLEVEL=N
CONSOLETYPE=serial
SHLVL=5
UPSTART_INSTANCE=
UPSTART_EVENTS=runlevel
UPSTART_JOB=rc 
serialでした。

これを回避してsudoを使えるようにするためには、以下のようにUserDataで/etc/sudoersに「Defaults !requiretty」をいう設定を追加する。
"UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [
  "#! /bin/bash -v\n",
  "echo \"Defaults !requiretty\" >> /etc/sudoers\n",
  (以下略)
こうすると/etc/sudoersには「Defaults requiretty」と「Defaults !requiretty」の2つの設定が共存してしまうのだけど、後ろの設定が有効になるようなので、CONSOLETYPE=serialでもsudoが使えるようになる。

以上、小ネタでした。