メイン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
Code language: PHP (php)
試しに、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
Code language: PHP (php)
保存終了するときは、viの操作どおり、ESC、コロン、wq と操作します。構文エラーがあると、
>>> /etc/sudoers.d/taro: 構文エラー near line 2 <<<
次は何でしょうか?
Code language: JavaScript (javascript)
と聞かれるので、「e」で編集継続します。
構文エラーで、sudoを実行できなくなったとき
うっかり、構文エラーのまま保存終了してしまうと、sudoを実行できなくなります。
そうなってしまったら、sudoではなく、pkttyagentコマンドとpkexecコマンドを使います。ターミナルを2つ開きます。
ターミナル1で、pkttyagentコマンドを実行してください。
# ターミナル1
$ pkttyagent --process $(echo $$)
Code language: PHP (php)
ターミナル2で、pkexecコマンドを実行してください。パスワード入力のダイアログが表示されるので、パスワードを入力してください。
# ターミナル2
$ pkexec visudo -f /etc/sudoers.d/taro
Code language: PHP (php)
ターミナル2の作業が終わったら、ターミナル1で、Ctrl + C を押して、pkttyagentを終了してください。
# ターミナル1
Ctrl+Cで終了してください。
$
Code language: PHP (php)