おいちゃんと呼ばれています

ウェブ技術や日々考えたことなどを綴っていきます

vagrant up したらエラー「sudo: sorry, you must have a tty to run sudo」が出たときの対処

Puppet のための試験環境として、MacVirtualBoxVagrant を入れています。で、あるときから、vagrant up するたびにエラーが出るようになりました。原因と解決方法をメモしておきます。環境は下記のとおりです。

エラー内容

初回は vagrant up して仮想マシンが立ち上がる。で Puppet のマニフェストを適用して、サーバ設定を変更したり。しかし、Mac を一度でも落とした後、vagrant up すると下記のエラーメッセージ。

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
[default] Setting the name of the VM...
...
[default] Setting hostname...
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!


sed -i 's/\(HOSTNAME=\).*/\1foo.example.local/' /etc/sysconfig/network


Stdout from the command:
Stderr from the command:


sudo: sorry, you must have a tty to run sudo

また、仮想マシンは一応立ち上がるのですが、vagrant ssh で入ってみたら、/vagrant にマウントがされてない状態。

さらには、仮想マシンを一旦停止させてから起動させようにも、vagrant halt できません。結局、毎回 vagrant destroy するハメに。。

$ vagrant halt
[default] Attempting graceful shutdown of VM...
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!


shutdown -h now


Stdout from the command:
Stderr from the command:


sudo: sorry, you must have a tty to run sudo

原因

Puppet のマニフェストを適用して、/etc/sudoers を変更しているのですが、その中の下記の記述がマズかったようです。

# Disable "ssh hostname sudo <cmd>", because it will show the password in clear.
#         You have to run "ssh -t hostname sudo <cmd>".
Defaults requiretty

対処方法

「Defaults requiretty」という設定は、sudo するときに TTY を要求するもので、クラッキング目的で侵入したプログラム等から sudo されないようにするのが目的のようです。

なので、下記のようにして vagrant ユーザについては除外してあげるとうまくいきます。

Defaults:vagrant !requiretty

あるいは、ローカルでしか使わないマシンだし、

# Defaults requiretty

コメントアウトしてしまうか。あるいは下記でも同じ意味のようです。

Defaults !requiretty

以上です。ではでは。