【Ansible Tower/AWX】becomeを使用せず、sudoで権限昇格する


この記事はプロモーションを含みます。

Ansible

Ansible AWXでは、権限昇格する際に「become」ディレクティブを使用しますが、今回は「shell」モジュールで権限昇格(sudo)しつつ、コマンドを実行する方法を解説したいと思います。

定義

AWXにおける各種設定内容について説明します。

認証情報

今回使用する認証情報の設定内容になります。
設定していない項目は記載していません。

  • 名前:awx
  • 説明:awxユーザ
  • 認証情報タイプ:マシン
  • ユーザ名:awx
  • パスワード:ユーザ名に対応したパスワード

インベントリー

今回使用するインベントリーの設定内容になります。
設定していない項目は記載していません。

  • 名前:Test Server Inventory
  • 説明:試験環境向けインベントリ
  • 組織:Default

ホスト(接続先)の設定になります。

  • ホスト名:接続先サーバのIPアドレス
  • 説明:試験環境サーバ

テンプレート

今回実行するテンプレートの設定になります。

  • 名前:Module Shell sudo Template
  • 説明:shellモジュール sudoコマンド
  • ジョブタイプ:実行
  • インベントリー:Test Server Inventory
  • プロジェクト:秋拓プロジェクト
  • PLAYBOOK:shell_sudo.yml
  • 認証情報:awx
  • 詳細:1(Verbose)

プレイブック

今回実行するプレイブックの内容になります。
[shell]モジュールで、[whoami]コマンドを実行しています。
[sudo]の有無で2度実行しています。

---
- hosts: all
  gather_facts: False
  tasks:

  - name: whoamiコマンドの実行
    shell: whoami

  - name: whoamiコマンドの実行
    shell: sudo whoami

実行結果

プレイブックの実行結果になります。

以下は実行結果の出力内容の抜粋です。
「sudo」を付与していない、「whoami」コマンドの実行結果は「awx」で、付与しているほうは「root」と表示されており、権限昇格されていることが確認できます。

[WARNING]が表示されていますが、これは「sudo」と同様の機能を持つ、Ansibleの「become」ディレクティブの使用を推奨するというものです。

becomeディレクティブの使用方法は下記が参考になります。

以下は実行結果の出力内容です。

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]を付与します。

記事は以上です。基本的には、Ansibleで提供されているbecomeを使用すればいいと思いますが、sudoを使用する場合に本記事を参考にして頂ければと思います。

コメント

タイトルとURLをコピーしました