Làm thế nào để chuyển đổi người dùng theo từng nhiệm vụ hoặc tập hợp các nhiệm vụ?


159

Một chủ đề lặp đi lặp lại trong các vở kịch ansible của tôi là tôi thường phải thực thi một lệnh với các đặc quyền sudo ( sudo: yes) vì tôi muốn làm điều đó cho một người dùng nhất định. Lý tưởng hơn là tôi sử dụng sudo để chuyển sang người dùng đó và thực hiện các lệnh bình thường. Bởi vì sau đó tôi sẽ không phải thực hiện các lệnh bài viết thông thường của mình để dọn dẹp, chẳng hạn như các thư mục chowning. Đây là một đoạn trích từ một trong những cuốn sách của tôi:

- 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

Lý tưởng nhất là tôi có thể chạy các lệnh hoặc bộ lệnh với tư cách là một người dùng khác ngay cả khi nó yêu cầu sudo để su cho người dùng đó.

Câu trả lời:


241

Với Ansible 1.9 trở lên

Sử dụng Ansible sự become, become_userbecome_methodchỉ thị để đạt được đặc quyền leo thang. Bạn có thể áp dụng chúng cho toàn bộ vở kịch hoặc vở kịch, đặt chúng trong một vở kịch đi kèm hoặc đặt chúng cho một nhiệm vụ cụ thể.

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

Bạn có thể sử dụng become_withđể xác định cách đạt được sự leo thang đặc quyền, mặc định sudo.

Lệnh này có hiệu lực đối với phạm vi của khối mà nó được sử dụng ( ví dụ ).

Xem Chủ nhà và Người dùng để biết một số ví dụ bổ sung và Trở thành (Đặc quyền nâng cao) để biết thêm tài liệu chi tiết.

Ngoài các lệnh becomevà phạm vi nhiệm vụ become_user, Ansible 1.9 đã thêm một số biến mới và các tùy chọn dòng lệnh để đặt các giá trị này trong suốt thời gian chơi trong trường hợp không có chỉ thị rõ ràng:

Kể từ Ansible 2.0.2.0, cú pháp sudo/ sudo_usercú pháp cũ hơn được mô tả bên dưới vẫn hoạt động, nhưng thông báo phản đối nói rõ, "Tính năng này sẽ bị xóa trong bản phát hành trong tương lai."


Cú pháp trước đó, không dùng nữa từ Ansible 1.9 và được lên lịch để xóa:

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

4
Để chỉ định sudo_user từ một biến, hãy sử dụng dấu ngoặc kép quanh mẫu biến của bạn, như thế này - sudo_user: "{{ ansible_ssh_user }}"hoặc bạn sẽ gặp lỗi cú pháp yaml.
Sumeet Pareek

Nắm bắt tốt. Tôi đã cố gắng kết hợp vấn đề của OP một cách chặt chẽ nhất có thể, nhưng tôi đồng ý rằng sử dụng phép nội suy biến đổi sẽ là lựa chọn phổ biến nhất.
Brett

5
Từ Ansible 1.9, đó là becomehệ thống thay vì "sudo *".
AndiDog 24/07/2015

2
1.9+ cú pháp cho "trở thành" là đúng. Bạn cũng có thể muốn kiểm tra "trở thành", vì "su" đôi khi có thể tốt hơn "sudo" mặc định, tùy thuộc vào thiết lập hệ thống của bạn.
ElementalStorm

New Ansible variables and command line options are added to set these values for the duration of a play. @Brett, điều đó có nghĩa là các tác vụ tiếp theo sau này sẽ được điều hành some_uservà không phải là người dùng ban đầu remote_userđược sử dụng để kết nối với máy chủ, điều đó có đúng không?
JohnnyQ

42

Trong Ansible 2.x, bạn có thể sử dụng blockcho nhóm tác vụ:

- 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

Trong Ansible> 1.4, bạn thực sự có thể chỉ định một người dùng từ xa ở cấp độ nhiệm vụ sẽ cho phép bạn đăng nhập như người dùng đó và thực hiện lệnh đó mà không cần dùng đến sudo. Nếu bạn không thể đăng nhập với tư cách người dùng đó thì giải pháp sudo_user cũng sẽ hoạt động.

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

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


Đây là giải pháp tốt nhất cho các tình huống khi bạn không có đặc quyền sudo
Darrel Holt

7

Một giải pháp là sử dụng includecâu lệnh với remote_uservar (mô tả ở đó: http://docs.ansible.com/playbooks_roles.html ) nhưng nó phải được thực hiện ở playbook thay vì mức độ nhiệm vụ.


Đây không phải là một giải pháp tốt cho trường hợp sử dụng ở trên. Tuy nhiên tôi đã không nhận thức được giải pháp này trong một thời gian dài. Tôi nghĩ rằng tôi chỉ có thể bao gồm các vai trò.
ArjanSchouten

1

Bạn có thể chỉ định become_methodghi đè phương thức mặc định được đặt trong ansible.cfg(nếu có) và có thể được đặt thành một trong số đó 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 }}'

Nên hiển thị

TASK [my-task : my secret identity] ************************************************************
ok: [my_ansible_server] => {
    "msg": "some_user"
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.