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 での各種定義について記載しています。
プロジェクト、インベントリーについては特別な設定を行っていないため割愛します。
認証情報
今回使用する認証情報の設定内容になります。
設定していない項目は記載していません。
テンプレート
テンプレートの設定内容になります。
設定していない項目は記載していません。
今回は、実行時の出力情報を確認したいので、「詳細」(ログレベル)を「1(Verbose)」としました。
プレイブック
今回実行するプレイブックの内容になります。
[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の使用時にエラーが発生した際、こちらの記事を参考に調査して頂ければ、エラーの解消や問題の切り分けが行えるかと思います。
コメント