Bagaimana cara mengalihkan pengguna per tugas atau serangkaian tugas?

160

Tema berulang yang ada di playbook saya yang memungkinkan adalah bahwa saya sering harus menjalankan perintah dengan hak sudo ( sudo: yes) karena saya ingin melakukannya untuk pengguna tertentu. Idealnya saya lebih suka menggunakan sudo untuk beralih ke pengguna itu dan menjalankan perintah secara normal. Karena dengan begitu saya tidak perlu melakukan perintah postingan biasa seperti membersihkan direktori chowning. Berikut cuplikan dari salah satu buku pedoman saya:

- 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

Idealnya saya bisa menjalankan perintah atau set perintah sebagai pengguna yang berbeda walaupun itu memerlukan sudo untuk su ke pengguna itu.

rgrinberg
sumber

Jawaban:

241

Dengan An 1.9 atau lebih baru

Kegunaan Ansible yang become, become_userdan become_methodarahan untuk mencapai eskalasi hak istimewa. Anda dapat menerapkannya ke seluruh permainan atau buku pedoman, mengaturnya dalam buku pedoman yang disertakan, atau mengaturnya untuk tugas tertentu.

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

Anda dapat menggunakan become_withuntuk menentukan bagaimana eskalasi hak istimewa dicapai, defaultnya adalah sudo.

Arahan berlaku untuk ruang lingkup blok di mana ia digunakan ( contoh ).

Lihat Host dan Pengguna untuk beberapa contoh tambahan dan Menjadi (Privilege Escalation) untuk dokumentasi yang lebih rinci.

Selain lingkup tugas becomedan become_userarahan, Ansible 1.9 menambahkan beberapa variabel baru dan opsi baris perintah untuk menetapkan nilai-nilai ini selama durasi permainan tanpa adanya arahan eksplisit:

Pada Ansible 2.0.2.0, sintaks lama sudo/ yang sudo_userdijelaskan di bawah ini masih berfungsi, tetapi pemberitahuan penghentian menyatakan, "Fitur ini akan dihapus dalam rilis mendatang."


Sintaksis sebelumnya, tidak digunakan lagi pada Ansible 1.9 dan dijadwalkan untuk dihapus:

- name: checkout repo
  git: repo=https://github.com/some/repo.git version=master dest={{ dst }}
  sudo: yes
  sudo_user: some_user
Brett
sumber
4
Untuk menentukan sudo_user dari suatu variabel, gunakan tanda kutip di sekitar templat variabel Anda, seperti ini - sudo_user: "{{ ansible_ssh_user }}"atau Anda akan mendapatkan kesalahan sintaksis yaml.
Sumeet Pareek
Tangkapan yang bagus. Saya mencoba untuk mencocokkan formulasi OP dari masalah sedekat mungkin, tetapi saya setuju bahwa menggunakan interpolasi variabel akan menjadi pilihan yang paling umum.
Brett
5
Dari Ansible 1.9, itu adalah becomesistem, bukan "sudo *".
AndiDog
2
1.9+ sintaks untuk "menjadi" benar. Anda mungkin juga ingin memeriksa "into_method", karena "su" terkadang lebih baik daripada "sudo" default, tergantung pada pengaturan sistem Anda.
ElementalStorm
New Ansible variables and command line options are added to set these values for the duration of a play. @ Brett jadi apakah itu berarti tugas selanjutnya setelah ini akan dijalankan oleh some_userdan bukan pengguna asli remote_useryang digunakan untuk terhubung ke host, apakah itu benar?
JohnnyQ
43

Di Ansible 2.x, Anda dapat menggunakan blockuntuk kelompok tugas:

- 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
Arbab Nazar
sumber
26

Di Ansible> 1.4 Anda sebenarnya dapat menentukan pengguna jarak jauh di tingkat tugas yang seharusnya memungkinkan Anda untuk login sebagai pengguna itu dan menjalankan perintah itu tanpa menggunakan sudo. Jika Anda tidak dapat masuk sebagai pengguna itu maka solusi sudo_user juga akan berfungsi.

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

Lihat http://docs.ansible.com/playbooks_intro.html#hosts-and-users

trcarden
sumber
Ini adalah solusi terbaik untuk situasi ketika Anda tidak memiliki hak istimewa sudo
Darrel Holt
7

Solusinya adalah dengan menggunakan includepernyataan dengan remote_uservar (jelaskan di sana: http://docs.ansible.com/playbooks_roles.html ) tetapi harus dilakukan di playbook alih-alih tingkat tugas.

Guillaume Dedrie
sumber
Ini bukan solusi yang baik untuk use case di atas. Namun saya tidak menyadari solusi ini untuk waktu yang lama. Saya pikir saya hanya bisa memasukkan peran.
ArjanSchouten
1

Anda dapat menentukan become_methoduntuk mengganti metode default yang diatur dalam ansible.cfg(jika ada), dan yang dapat diatur ke salah satu 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 }}'

Harus ditampilkan

TASK [my-task : my secret identity] ************************************************************
ok: [my_ansible_server] => {
    "msg": "some_user"
}
avi.elkharrat
sumber