Sudo特権を持つユーザーdavid
でボックスを設定しました。ボックスにsshして、apt-get install
などのSudo操作を実行できます。 Ansibleの "become privilege escalation"を使用して同じことを行おうとすると、permission denied
エラーが発生します。したがって、単純なプレイブックは次のようになります。
simple_playbook.yml:
---
- name: Testing...
hosts: all
become: true
become_user: david
become_method: Sudo
tasks:
- name: Just want to install sqlite3 for example...
apt: name=sqlite3 state=present
このプレイブックを次のコマンドで実行します。
ansible-playbook -i inventory simple_playbook.yml --ask-become-pass
これにより、パスワードを求めるプロンプトが表示されます。パスワードを入力すると、次のエラー(略称)が表示されます。
fatal: [123.45.67.89]: FAILED! => {...
failed: E: Could not open lock file /var/lib/dpkg/lock - open (13:
Permission denied)\nE: Unable to lock the administration directory
(/var/lib/dpkg/), are you root?\n", ...}
許可が拒否されるのはなぜですか?
追加情報
Ansible 2.1.1.0を実行しており、Ubuntu 16.04ボックスをターゲットにしています。 Ansible <v1.9に従ってremote_user
およびSudo
オプションを使用すると、次のように正常に動作します:remote_user: david Sudo: yes
更新
ローカルとリモートのユーザー名は同じです。これを機能させるには、become: yes
を指定する必要がありました(@techrafの回答を参照)。
許可が拒否されるのはなぜですか?
APT requires root権限(エラーを参照:are you root?
)タスクをdavid
として実行しています。
これらの設定ごと:
become: true
become_user: david
become_method: Sudo
Ansibleはdavid
メソッドを使用してSudo
になります。基本的には、PythonスクリプトをSudo david
前に。
リモートボックスのユーザー「david」にはSudo特権があります。
david
は、Sudo
- executableを使用してコマンド(一部またはすべて)を実行し、子プロセス(コマンド)の有効なユーザーを変更できることを意味します。ユーザー名が指定されていない場合、このプロセスはroot
アカウントとして実行されます。
これら2つのコマンドの結果を比較します。
$ Sudo whoami
root
$ Sudo david whoami
david
APT問題に戻ります。あなたは(CLIから)およびAnsible(アカウントを使用してSSHで接続)を実行する必要があります。
Sudo apt-get install sqlite3
ではない:
Sudo david apt-get install sqlite3
ansibleが表示される非常に正確なメッセージで失敗します。
次のプレイブックは、デフォルトでルートユーザーにエスカレートします。
---
- name: Testing...
hosts: all
become: true
tasks:
- name: Just want to install sqlite3 for example...
apt: name=sqlite3 state=present
remote_user
はdavid
です。 --ask-pass
を使用してスクリプトを呼び出し、david
のパスワードを指定します。 david
にパスワードなしのSudoがない場合は、--ask-become-pass
で呼び出す必要もあります。
- name: Testing...
hosts: all
remote_user: david
become: true
become_method: Sudo
tasks:
- name: Just want to install sqlite3 for example...
apt: name=sqlite3 state=present