Pocket

メインPCのUbuntuをansibleで設定しようとしたら、"The following modules failed to execute: setup\n setup: MODULE FAILURE\nSee stdout/stderr for the exact error\n"のエラーが。

$ ansible-playbook mypc.yml --inventory-file=mypc.cfg

PLAY [mypc.yml,] **************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************
fatal: [ubuntu_16]: FAILED! => {"ansible_facts": {}, "changed": false, "msg": "The following modules failed to execute: setup\n  setup: MODULE FAILURE\nSee stdout/stderr for the exact error\n"}

PLAY RECAP *************************************************************************************************************
ubuntu_16                  : ok=0    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0

試しに、playbook ymlのbecome: Trueをbecome: Falseにしたら、エラーなしで実行できました。メインPCのログインユーザーをsudo NOPASSWDにしていないのに、ansibleにsudoパスワードを指定していないことが原因でした。

対応方法1: --ask-become-pass オプション

ansible-playbookを実行するとき、コマンドラインオプション --ask-become-pass をつけてください。BECOME password: のプロンプトが表示されるので、sudoパスワードを入力してください。

$ ansible-playbook mypc.yml --inventory-file=mypc.cfg --ask-become-pass
BECOME password: 

対応方法2: sudoパスワード不要に設定する

ansibleの接続ユーザをsudoパスワード不要にすることでも、さきほどのansibleエラーはなくなります。

例えば、ユーザーtaroのsudoパスワードを不要にするときは、visudoコマンドを使って、/etc/sudoers.d/taroファイルを新規作成、編集します。

$ sudo visudo -f /etc/sudoers.d/taro
# /etc/sudoers.d/taro
taro	ALL=(ALL) NOPASSWD: ALL

保存終了するときは、viの操作どおり、ESC、コロン、wq と操作します。構文エラーがあると、

>>> /etc/sudoers.d/taro: 構文エラー near line 2 <<<
次は何でしょうか? 

と聞かれるので、「e」で編集継続します。

構文エラーで、sudoを実行できなくなったとき

うっかり、構文エラーのまま保存終了してしまうと、sudoを実行できなくなります。

そうなってしまったら、sudoではなく、pkttyagentコマンドとpkexecコマンドを使います。ターミナルを2つ開きます。

ターミナル1で、pkttyagentコマンドを実行してください。

# ターミナル1
$ pkttyagent --process $(echo $$)

ターミナル2で、pkexecコマンドを実行してください。パスワード入力のダイアログが表示されるので、パスワードを入力してください。

# ターミナル2
$ pkexec visudo -f /etc/sudoers.d/taro

ターミナル2の作業が終わったら、ターミナル1で、Ctrl + C を押して、pkttyagentを終了してください。

# ターミナル1
Ctrl+Cで終了してください。
$