【Ansible Tower/AWX】sudo(become)での権限昇格に失敗する場合の対処方法


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

Ansible AWXでの権限昇格「become(sudoと同様の機能)」ディレクティブでエラーが発生した際の対処方法について説明します。
Ansible Tower及び、コマンドラインのAnsibleでも同様に対処出来るかと思います。

Ansibleで被管理ホストに接続する際は、一般ユーザ相当の権限を持ったユーザを使用するかと思いますが、rootユーザ(特権ユーザ)でしか実行出来ない処理も多々あります。
その際、[su -]や[sudo]コマンドで作業を行いますが、Ansibleでは、[become]ディレクティブを使用します。
今回は、[become]ディレクティブを使用した際に発生したエラーと対処方法をまとめてみました。

becomeディレクティブで権限昇格する方法については下記を参考にして下さい。

エラーの内容

まずは出力されたエラーの内容です。
このエラーから、何らかのエラーでジョブが失敗していることは分かりますが、具体的な事象は分かりにくいですね。

{
    "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\nansible is not in the sudoers file.  This incident will be reported.\r\n",
    "module_stderr": "Shared connection to 192.168.56.105 closed.\r\n",
    "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error",
    "rc": 1,
    "_ansible_no_log": false,
    "changed": false
}

ここからは、実際に実行した時のAWXの設定とプレイブックを見ていきましょう。

Ansible AWX の各種定義

Ansible AWX での各種定義について記載しています。
プロジェクト、インベントリーについては特別な設定を行っていないため割愛します。

認証情報

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

  • 名前:ansible
  • 説明:ansibleユーザ
  • 認証情報タイプ:マシン
  • ユーザ名:ansible
  • パスワード:ユーザ名に対応したパスワード
  • 権限昇格方法:sudo
  • 権限昇格のユーザ名:root
  • 権限昇格のパスワード:権限昇格のユーザ名に指定したユーザにsudoするためのパスワード

「権限昇格のパスワード」に設定するパスワードは、「権限昇格のユーザ名」で指定したユーザに設定しているパスワードではないので注意が必要です。
「sudo」で使用するパスワードなので、「ユーザ名」(本記事では、[ansible]ユーザ)に設定しているパスワードになります。
よく間違うポイントなので注意しておきましょう。

テンプレート

テンプレートの設定内容になります。
設定していない項目は記載していません。

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

今回は、実行時の出力情報を確認したいので、「詳細」(ログレベル)を「1(Verbose)」としました。

Xserver Domain
お名前.com

プレイブック

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

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

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

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

原因と対処方法

まず、エラーの原因ですが、被管理ホストに接続したユーザ(認証情報で設定したユーザ)に、sudo権限が付与されていないためです。
今回の例では、「ansible」ユーザに、sudo権限が無いからですね。

なので、対処方法は、「sudo権限を付与する」です。
*sudo権限を付与するのは、被管理ホスト(接続先のサーバ)のユーザです。

では、「ansible」ユーザに、sudo権限を付与して実行してみます。

Using /etc/ansible/ansible.cfg as config file
SSH password: 
BECOME password[defaults to SSH password]: 

PLAY [all] *********************************************************************

TASK [whoamiコマンドの実行] ***********************************************************
changed: [192.168.56.105] => {"changed": true, "cmd": "whoami", "delta": "0:00:00.003664", "end": "2022-02-11 17:47:49.550701", "rc": 0, "start": "2022-02-11 17:47:49.547037", "stderr": "", "stderr_lines": [], "stdout": "ansible", "stdout_lines": ["ansible"]}

TASK [whoamiコマンドの実行] ***********************************************************
changed: [192.168.56.105] => {"changed": true, "cmd": "whoami", "delta": "0:00:00.003954", "end": "2022-02-11 17:47:50.037194", "rc": 0, "start": "2022-02-11 17:47:50.033240", "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されているか確認してみましょう。

1つ目の[whoami]では、「ansible」ユーザが表示され、
2つ目は、「root」ユーザが表示されているので、
問題なく、sudoで実行されていることが確認できました!

記事は以上です。対処は簡単ですが、エラー内容から原因を特定しにくい事象でした。becomeの使用時にエラーが発生した際、こちらの記事を参考に調査して頂ければ、エラーの解消や問題の切り分けが行えるかと思います。

コメント

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