Làm cách nào để lấy một biến có tên của người dùng đang chạy ansible?


80

Tôi đang viết kịch bản cho quy trình triển khai lấy tên của người dùng đang chạy tập lệnh ansible (ví dụ: tlau) và tạo thư mục triển khai trên hệ thống từ xa dựa trên tên người dùng đó và ngày / giờ hiện tại (ví dụ: tlau-deploy-2014-10 -15-16: 52).

Bạn sẽ nghĩ rằng điều này có sẵn trong các dữ kiện không thể che giấu được (ví dụ: LOGNAME hoặc SUDO_USER), nhưng tất cả chúng đều được đặt thành "root" hoặc id triển khai được sử dụng để ssh vào hệ thống từ xa. Không ai trong số đó chứa người dùng cục bộ, người hiện đang chạy quá trình có thể kiểm soát được.

Làm cách nào để tập lệnh lấy tên của người dùng đang chạy quy trình ansible và sử dụng nó trong playbook của tôi?

Câu trả lời:


71

Nếu ý bạn là tên người dùng trên hệ thống máy chủ, có hai tùy chọn:

Bạn có thể chạy một hành động cục bộ (chạy trên máy chủ chứ không phải máy đích):

- name: get the username running the deploy
  become: false
  local_action: command whoami
  register: username_on_the_host

- debug: var=username_on_the_host

Trong ví dụ này, đầu ra của whoamilệnh được đăng ký trong một biến có tên "username_on_the_host" và tên người dùng sẽ được chứa trong username_on_the_host.stdout.

(tác vụ gỡ lỗi không bắt buộc ở đây, nó chỉ thể hiện nội dung của biến)


Các tùy chọn thứ hai là sử dụng "plugin tra cứu":

{{ lookup('env', 'USER') }}

Đọc về các plugin tra cứu tại đây: docs.ansible.com/ansible/playbooks_lookups.html


1
thiết lập sudo: nođể đảm bảo rằng nó không cố gắng sudo trước khi chạylocal_action
drs 02/02

1
trong ansible 2.0, đó sẽ là become: nohoặc become: false. Nhưng nếu không thì một mẹo hay, cảm ơn!
Ramon de la Fuente

Có cách nào để tránh changed=1không? Ngoài ra, có thể sử dụng ủy quyền thực tế không?
nponeccop

Chắc chắn có, sử dụng change_when: False ( docs.ansible.com/ansible/... )
Ramon de la Fuente

3
Đáng chú ý, biến thay đổi là changed_when, không change_when. Chỉ có một chút bởi điều này.
abegosum

116

Nếu bạn gather_facts, được bật theo mặc định cho sách phát, thì có một biến tích hợp được đặt có tên là ansible_user_idcung cấp tên người dùng mà các tác vụ đang được chạy. Sau đó, bạn có thể sử dụng biến này trong các tác vụ hoặc mẫu khác với {{ ansible_user_id }}. Điều này sẽ giúp bạn tiết kiệm bước chạy một tác vụ để đăng ký biến đó.

Xem: https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#variables-discovered-from-systems-facts


21
Đối với các tham chiếu trong tương lai, điều này trả về tên của người dùng trên máy được quản lý, hay còn gọi là tên remote_usercủa người dùng trên máy chủ. Để lấy tên người dùng trên máy chủ, tôi không thấy giải pháp thay thế cho local_actiontên như được giải thích bởi @Ramon.
astorije

41
Một giải pháp thay thế để tra cứu người dùng trên localhost đang chạy ansible là sử dụng tra cứu: {{lookup ('env', 'USER')}} docs.ansible.com/ansible/playbooks_lookups.html
Budric

10
@Budric Theo ý kiến ​​của tôi, điều này nên được đăng như một câu trả lời
030

14
Tuy nhiên {{ansible_user_id}}kết thúc lên được "root" nếu bạnbecome:yes
Stephen Ostermiller

5
Trong Ansible 2.8.3, ansible_user_idkhông không dường như kết thúc được gốc ngay cả với become: yes.
David Oliver

51

Tôi đặt một cái gì đó như sau trong tất cả các mẫu:

# Placed here by {{ lookup('env','USER') }} using Ansible, {{ ansible_date_time.date }}.

Khi được tạo mẫu trên nó hiển thị như sau:

# Placed here by staylorx using Ansible, 2017-01-11.

Nếu tôi sử dụng {{ ansible_user_id }}và tôi đã trở thành root thì biến đó chỉ ra "root", không phải những gì tôi muốn hầu hết thời gian.


Bạn cũng có thể thêm tra cứu này trong var ở đầu sách vở trong một varsphần. Như thế này: `` `- hosts: xxx collect_facts: no vars: user:" {{lookup ('env', 'USER')}} "` ``
Bludwarf 31/07/17

bạn có thể sử dụng bộ lọc nhận xét jinja2 và biến ansible_managed được mô tả trong tài liệu docs.ansible.com/ansible/latest/… (tìm kiếm ansible_managed)
dtrv

3

Điều này đọc tên người dùng từ hệ thống từ xa, vì nó không được đảm bảo rằng tên người dùng trên hệ thống cục bộ và hệ thống từ xa là giống nhau. Có thể thay đổi tên trong cấu hình SSH.

- name: Run whoami without become.
  command: whoami
  changed_when: false
  become: false
  register: whoami

- name: Set a fact with the user name.
  set_fact:
    login_user: "{{ whoami.stdout }}"

0

nếu bạn muốn có được người dùng chạy mẫu trong tháp kín, bạn có thể sử dụng var {{tower_user_name}} này trong playbook của mình nhưng nó chỉ được xác định trên các lần thực thi thủ công

tower_user_name: Tên người dùng của người dùng Tower đã bắt đầu công việc này. Điều này không khả dụng cho các công việc gọi lại hoặc đã lên lịch.

kiểm tra tài liệu này https://docs.ansible.com/ansible-tower/latest/html/userguide/job_templates.html

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.