私の手ごたえのあるプレイブックにある繰り返しのテーマは、私は特定のユーザーのためにそれをしたいのでSudo特権(Sudo: yes
)でコマンドを実行しなければならないことです。理想的には、私はSudoを使ってそのユーザーに切り替えてコマンドを普通に実行したいと思います。それから私はいつものポストコマンドでディレクトリを変更するなどのクリーンアップをする必要がないからです。これが私のプレイブックの1つの抜粋です。
- 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を要求する場合でも、理想的には別のユーザーとしてコマンドまたはコマンドのセットを実行できます。
Ansibleは特権の昇格を達成するためにbecome
、become_user
、およびbecome_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
です。
この指令は、それが使用されているブロックの有効範囲に対して有効です( examples )。
その他の例については、 ホストとユーザー を参照してください。より詳細なドキュメントについては、 Become(Privilege Escalation) を参照してください。
タスクスコープのbecome
およびbecome_user
ディレクティブに加えて、Ansible 1.9では、明示的なディレクティブがない場合に、プレイ中にこれらの値を設定するための新しい変数とコマンドラインオプションが追加されました。
become
/become_user
ディレクティブの場合。Ansible 2.0.2.0以降、以下で説明されている古いSudo
/Sudo_user
構文はまだ機能しますが、「この機能は将来のリリースで削除される予定です」と述べています。
- name: checkout repo
git: repo=https://github.com/some/repo.git version=master dest={{ dst }}
Sudo: yes
Sudo_user: some_user
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
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 を参照してください。
解決策はinclude
ステートメントをremote_user
var(そこに記述している: http://docs.ansible.com/playbooks_roles.html )と一緒に使うことですが、タスクレベルではなくplaybookで行う必要があります。
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"
}