Ansible AWXでは、権限昇格する際に「become」ディレクティブを使用しますが、今回は「shell」モジュールで権限昇格(sudo)しつつ、コマンドを実行する方法を解説したいと思います。
定義
AWXにおける各種設定内容について説明します。
認証情報
今回使用する認証情報の設定内容になります。
設定していない項目は記載していません。
インベントリー
今回使用するインベントリーの設定内容になります。
設定していない項目は記載していません。
ホスト(接続先)の設定になります。
テンプレート
今回実行するテンプレートの設定になります。
プレイブック
今回実行するプレイブックの内容になります。
[shell]モジュールで、[whoami]コマンドを実行しています。
[sudo]の有無で2度実行しています。
---
- hosts: all
gather_facts: False
tasks:
- name: whoamiコマンドの実行
shell: whoami
- name: whoamiコマンドの実行
shell: sudo whoami
実行結果
プレイブックの実行結果になります。
以下は実行結果の出力内容の抜粋です。
「sudo」を付与していない、「whoami」コマンドの実行結果は「awx」で、付与しているほうは「root」と表示されており、権限昇格されていることが確認できます。
以下は実行結果の出力内容です。
Using /etc/ansible/ansible.cfg as config file
SSH password:
PLAY [all] *********************************************************************
TASK [whoamiコマンドの実行] ***********************************************************
changed: [192.168.56.105] => {"changed": true, "cmd": "whoami", "delta": "0:00:00.003268", "end": "2022-02-13 18:05:39.142837", "rc": 0, "start": "2022-02-13 18:05:39.139569", "stderr": "", "stderr_lines": [], "stdout": "awx", "stdout_lines": ["awx"]}
TASK [whoamiコマンドの実行] ***********************************************************
[WARNING]: Consider using 'become', 'become_method', and 'become_user' rather
than running sudo
changed: [192.168.56.105] => {"changed": true, "cmd": "sudo whoami", "delta": "0:00:00.014682", "end": "2022-02-13 18:05:39.611098", "rc": 0, "start": "2022-02-13 18:05:39.596416", "stderr": "", "stderr_lines": [], "stdout": "root", "stdout_lines": ["root"]}
PLAY RECAP *********************************************************************
192.168.56.105 : ok=2 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
実行に失敗する場合
ジョブに失敗する原因として、下記のような原因が考えられます。
① 実行ユーザにsudo権限が付与されていない
② 実行ユーザのsudo権限に[NOPASSWD]設定が付与されていない
① 実行ユーザにsudo権限が付与されていない
実行ユーザにsudo権限が付与されていない場合に以下のエラーが表示されて、ジョブが失敗します。
以下の実行結果の10行目がエラーになります。
Using /etc/ansible/ansible.cfg as config file
SSH password:
PLAY [all] *********************************************************************
TASK [whoamiコマンドの実行] ***********************************************************
changed: [192.168.56.105] => {"changed": true, "cmd": "whoami", "delta": "0:00:00.003488", "end": "2022-02-13 17:08:42.916781", "rc": 0, "start": "2022-02-13 17:08:42.913293", "stderr": "", "stderr_lines": [], "stdout": "awx", "stdout_lines": ["awx"]}
TASK [whoamiコマンドの実行] ***********************************************************
fatal: [192.168.56.105]: FAILED! => {"changed": false, "module_stderr": "Shared connection to 192.168.56.105 closed.\\r\\n", "module_stdout": "bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)\\r\\n/bin/sh: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)\\r\\n/bin/sh: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)\\r\\n/bin/sh: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)\\r\\n\\r\\nWe trust you have received the usual lecture from the local System\\r\\nAdministrator. It usually boils down to these three things:\\r\\n\\r\\n #1) Respect the privacy of others.\\r\\n #2) Think before you type.\\r\\n #3) With great power comes great responsibility.\\r\\n\\r\\n[sudo] password for awx: \\r\\n\\r\\n{\\"msg\\": \\"non-zero return code\\", \\"cmd\\": \\"sudo whoami\\", \\"stdout\\": \\"\\", \\"stderr\\": \\"sudo: timed out reading password\\", \\"rc\\": 1, \\"start\\": \\"2022-02-13 17:08:43.362701\\", \\"end\\": \\"2022-02-13 17:13:43.406964\\", \\"delta\\": \\"0:05:00.044263\\", \\"changed\\": true, \\"failed\\": true, \\"invocation\\": {\\"module_args\\": {\\"_raw_params\\": \\"sudo whoami\\", \\"_uses_shell\\": true, \\"warn\\": true, \\"stdin_add_newline\\": true, \\"strip_empty_ends\\": true, \\"argv\\": null, \\"chdir\\": null, \\"executable\\": null, \\"creates\\": null, \\"removes\\": null, \\"stdin\\": null}}, \\"warnings\\": [\\"Consider using 'become', 'become_method', and 'become_user' rather than running sudo\\"]}\\r\\n", "msg": "MODULE FAILURE\\nSee stdout/stderr for the exact error", "rc": 1}
PLAY RECAP *********************************************************************
192.168.56.105 : ok=1 changed=1 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
実際の処理としては、プレイブックに記述した「sudo whoami」が、接続先サーバで実行されましたが、下記のようにパスワードの入力を求められているため、処理が停止してタイムアウトとなりました。
[awx@localhost ~]$ sudo whoami あなたはシステム管理者から通常の講習を受けたはずです。 これは通常、以下の3点に要約されます: #1) 他人のプライバシーを尊重すること。 #2) タイプする前に考えること。 #3) 大いなる力には大いなる責任が伴うこと。 [sudo] awx のパスワード:
対処方法として、コマンドを実行するユーザに、sudo権限を付与します。
② 実行ユーザのsudo権限に[NOPASSWD]設定が付与されていない
実行ユーザのsudo権限に[NOPASSWD]設定が付与されていない場合に以下のエラーが表示されて、ジョブが失敗します。
以下の実行結果の10行目がエラーになります。
Using /etc/ansible/ansible.cfg as config file
SSH password:
PLAY [all] *********************************************************************
TASK [whoamiコマンドの実行] ***********************************************************
changed: [192.168.56.105] => {"changed": true, "cmd": "whoami", "delta": "0:00:00.003639", "end": "2022-02-13 17:33:19.597493", "rc": 0, "start": "2022-02-13 17:33:19.593854", "stderr": "", "stderr_lines": [], "stdout": "awx", "stdout_lines": ["awx"]}
TASK [whoamiコマンドの実行] ***********************************************************
fatal: [192.168.56.105]: FAILED! => {"changed": false, "module_stderr": "Shared connection to 192.168.56.105 closed.\\r\\n", "module_stdout": "bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)\\r\\n/bin/sh: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)\\r\\n/bin/sh: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)\\r\\n/bin/sh: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)\\r\\n\\r\\nWe trust you have received the usual lecture from the local System\\r\\nAdministrator. It usually boils down to these three things:\\r\\n\\r\\n #1) Respect the privacy of others.\\r\\n #2) Think before you type.\\r\\n #3) With great power comes great responsibility.\\r\\n\\r\\n[sudo] password for awx: \\r\\n\\r\\n{\\"msg\\": \\"non-zero return code\\", \\"cmd\\": \\"sudo whoami\\", \\"stdout\\": \\"\\", \\"stderr\\": \\"sudo: timed out reading password\\", \\"rc\\": 1, \\"start\\": \\"2022-02-13 17:33:20.038988\\", \\"end\\": \\"2022-02-13 17:38:20.054533\\", \\"delta\\": \\"0:05:00.015545\\", \\"changed\\": true, \\"failed\\": true, \\"invocation\\": {\\"module_args\\": {\\"_raw_params\\": \\"sudo whoami\\", \\"_uses_shell\\": true, \\"warn\\": true, \\"stdin_add_newline\\": true, \\"strip_empty_ends\\": true, \\"argv\\": null, \\"chdir\\": null, \\"executable\\": null, \\"creates\\": null, \\"removes\\": null, \\"stdin\\": null}}, \\"warnings\\": [\\"Consider using 'become', 'become_method', and 'become_user' rather than running sudo\\"]}\\r\\n", "msg": "MODULE FAILURE\\nSee stdout/stderr for the exact error", "rc": 1}
PLAY RECAP *********************************************************************
192.168.56.105 : ok=1 changed=1 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
実際の処理としては、プレイブックに記述した「sudo whoami」が、接続先サーバで実行されましたが、下記のようにパスワードの入力を求められているため、処理が停止してタイムアウトとなりました。
[awx@localhost ~]$ sudo whoami あなたはシステム管理者から通常の講習を受けたはずです。 これは通常、以下の3点に要約されます: #1) 他人のプライバシーを尊重すること。 #2) タイプする前に考えること。 #3) 大いなる力には大いなる責任が伴うこと。 [sudo] awx のパスワード:
対処方法として、コマンドを実行するユーザのsudo権限に[NOPASSWD]を付与します。
sudo権限に[NOPASSWD]を付与する方法は、下記を参考にして下さい。
記事は以上です。基本的には、Ansibleで提供されているbecomeを使用すればいいと思いますが、sudoを使用する場合に本記事を参考にして頂ければと思います。
コメント