[小ネタ]cfn-initでsudoする方法
fluentdのインストールスクリプトはスクリプト内でsudoコマンドを使用しているが、これをcfn-initで実行しようとすると以下のエラーが出る。
「じゃあ、cfn-initはいったいどんな環境で実行されているんだろう?」と思って、
結果は以下の通り。
これを回避してsudoを使えるようにするためには、以下のようにUserDataで/etc/sudoersに「Defaults !requiretty」をいう設定を追加する。
sudo: sorry, you must have a tty to run sudoこれは/etc/sudoersに
Defaults requirettyという記載があり、tty以外からのsudoコマンドの使用が制限されているため。
「じゃあ、cfn-initはいったいどんな環境で実行されているんだろう?」と思って、
"commands" : {こんな感じでCloudFormationのStackを作ってみた。
"env" : {
"command" : "env > /tmp/cfn-init.env"
}
}
結果は以下の通り。
$ cat /tmp/cfn-init.env
TERM=linuxserialでした。
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
これを回避して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が使えるようになる。
以上、小ネタでした。