タスクまたはタスクのセットごとにユーザーを切り替える方法は?


159

私のansibleプレイブックにある繰り返しのテーマsudo: yesは、特定のユーザーに対して実行したいので、sudo特権()でコマンドを実行する必要があることが多いということです。理想的には、sudoを使用してそのユーザーに切り替え、コマンドを通常どおりに実行したいのです。そうすれば、ディレクトリの変更など、いつものpostコマンドでクリーンアップを行う必要がなくなります。これが私のプレイブックのスニペットです。

- name: checkout repo
  git: repo=https://github.com/some/repo.git version=master dest={{ dst }}
  sudo: yes
- name: change perms
  file: dest={{ dst }} state=directory mode=0755 owner=some_user
  sudo: yes

理想的には、sudoでそのユーザーにsuする必要がある場合でも、コマンドまたはコマンドセットを別のユーザーとして実行できます。

回答:


241

Ansible 1.9以降

Ansibleは、、、およびディレクティブを使用してbecome、特権の昇格を実現します。プレイまたはプレイブック全体に適用したり、インクルードされたプレイブックに設定したり、特定のタスクに設定したりできます。become_userbecome_method

- name: checkout repo
  git: repo=https://github.com/some/repo.git version=master dest={{ dst }}
  become: yes
  become_user: some_user

を使用become_withして、権限の昇格を実現する方法を指定できますsudo。デフォルトはです。

ディレクティブは、それが使用されるブロックのスコープに対して有効です()。

その他の例については、ホストとユーザーを参照してください。詳細なドキュメントについては、「になる(特権エスカレーション)」を参照してください。

Ansible 1.9では、タスクスコープのディレクティブbecomebecome_userディレクティブに加えて、明示的なディレクティブがない場合に再生中にこれらの値を設定するために、いくつかの新しい変数とコマンドラインオプションが追加されました。

Ansible 2.0.2.0以降、以下で説明する古いsudo/ sudo_user構文は引き続き機能しますが、非推奨通知には「この機能は将来のリリースで削除される予定です」と記載されています。


以前の構文。Ansible1.9で非推奨になり、削除される予定です。

- name: checkout repo
  git: repo=https://github.com/some/repo.git version=master dest={{ dst }}
  sudo: yes
  sudo_user: some_user

4
変数からsudo_userを指定するには、このように変数テンプレートを引用符でsudo_user: "{{ ansible_ssh_user }}"囲みます。そうしないと、yaml構文エラーが発生します。
Sumeet Pareek、2015

良いキャッチ。私は問題のOPの定式化にできるだけ一致するように試みましたが、変数補間の使用が最も一般的な選択になることに同意します。
ブレット

5
Ansible 1.9以降では、「sudo *」ではなくbecomeシステムです。
AndiDog 2015

2
「become」の1.9+構文は正しいです。システムの設定によっては、「su」がデフォルトの「sudo」よりも優れている場合があるため、「become_method」を確認することもできます。
ElementalStorm

New Ansible variables and command line options are added to set these values for the duration of a play. @ブレットは、ホストへの接続に使用されsome_userた元のユーザーremote_userではなく、この後に実行されるタスクが実行されることを意味しますか?
JohnnyQ 2016年

42

Ansible 2.xでは、blockタスクのグループにを使用できます。

- block:
    - name: checkout repo
      git:
        repo: https://github.com/some/repo.git
        version: master
        dest: "{{ dst }}"
    - name: change perms
      file:
      dest: "{{ dst }}"
      state: directory
      mode: 0755
      owner: some_user
  become: yes
  become_user: some user

26

Ansible> 1.4では、実際にタスクレベルでリモートユーザーを指定できます。これにより、そのユーザーとしてログインし、sudoを使用せずにそのコマンドを実行できます。そのユーザーとしてログインできない場合は、sudo_userソリューションも機能します。

---
- hosts: webservers
  remote_user: root
  tasks:
    - name: test connection
      ping:
      remote_user: yourname

http://docs.ansible.com/playbooks_intro.html#hosts-and-usersを参照してください


これは、sudo特権がない場合の最良のソリューションです
Darrel Holt

7

解決策は、includeステートメントをremote_uservarで使用することです(そこで説明:http : //docs.ansible.com/playbooks_roles.html)が、タスクレベルではなく、プレイブックで実行する必要があります。


これは、上記のユースケースに適したソリューションではありません。しかし、私はこの解決策を長い間知らなかった。私は役割しか含めることができないと思っていました。
ArjanSchouten 2015

1

(存在する場合)でbecome_method設定されているデフォルトのメソッドをオーバーライドするように指定できます。ansible.cfgこれは、のいずれかに設定できますsudo, su, pbrun, pfexec, doas, dzdo, ksu

- name: I am confused
  command: 'whoami'
  become: true
  become_method: su
  become_user: some_user
  register: myidentity

- name: my secret identity
  debug:
    msg: '{{ myidentity.stdout }}'

表示する必要があります

TASK [my-task : my secret identity] ************************************************************
ok: [my_ansible_server] => {
    "msg": "some_user"
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.