web-dev-qa-db-ja.com

Ansibleの非ルートSudoユーザーと「become」特権エスカレーション

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の回答を参照)。

15
DavB

許可が拒否されるのはなぜですか?

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
26
techraf

remote_userdavidです。 --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
4
helloV