วิธีการสลับผู้ใช้ต่องานหรือชุดของงาน?


160

ชุดรูปแบบที่เกิดซ้ำที่อยู่ในเพลย์บุ๊คที่อ่านได้ของฉันคือฉันมักจะต้องดำเนินการคำสั่งด้วยสิทธิ์ sudo ( sudo: yes) เพราะฉันต้องการทำเพื่อผู้ใช้บางคน เป็นการดีที่ฉันค่อนข้างจะใช้ sudo เพื่อสลับไปยังผู้ใช้นั้นและรันคำสั่งตามปกติ เพราะแล้วฉันจะไม่ต้องทำคำสั่งโพสต์ตามปกติของฉันล้างเช่นไดเรกทอรี chowning นี่คือตัวอย่างจากหนึ่งใน playbooks ของฉัน:

- 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 หรือใหม่กว่า

ใช้เบิ้ลbecome, become_userและbecome_methodคำสั่งเพื่อให้บรรลุเพิ่มสิทธิ คุณสามารถนำไปใช้กับการเล่นหรือ playbook ทั้งชุดการตั้งค่าใน playbook รวมหรือตั้งค่าสำหรับงานเฉพาะ

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

คุณสามารถใช้เพื่อระบุว่าการเพิ่มสิทธิ์ที่จะประสบความสำเร็จเริ่มต้นเป็นbecome_withsudo

คำสั่งมีผลบังคับใช้สำหรับขอบเขตของบล็อกที่ใช้ ( ตัวอย่าง )

ดูโฮสต์และผู้ใช้สำหรับตัวอย่างเพิ่มเติมและกลายเป็น (สิทธิ์การเลื่อนระดับ)สำหรับเอกสารรายละเอียดเพิ่มเติม

นอกเหนือจากการกำหนดขอบเขตภารกิจbecomeและbecome_userคำสั่งแล้ว Ansible 1.9 ยังเพิ่มตัวแปรใหม่และตัวเลือกบรรทัดคำสั่งบางอย่างเพื่อตั้งค่าเหล่านี้ในช่วงระยะเวลาของการเล่นโดยไม่มีคำสั่งที่ชัดเจน:

ในฐานะของ Ansible 2.0.2.0 เก่าsudo/ sudo_userไวยากรณ์ที่อธิบายไว้ด้านล่างยังคงทำงาน แต่สถานะแจ้งให้ทราบล่วงหน้าเลิก "คุณลักษณะนี้จะถูกลบออกในรุ่นอนาคต"


ไวยากรณ์ก่อนหน้านี้เลิกใช้ตั้งแต่ Ansible 1.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

จับดี. ฉันพยายามจับคู่การกำหนดปัญหาของ OP ให้ใกล้เคียงที่สุด แต่ฉันยอมรับว่าการใช้การแก้ไขตัวแปรจะเป็นตัวเลือกที่ใช้กันโดยทั่วไป
Brett

5
จาก Ansible 1.9 เป็นbecomeระบบแทน "sudo *"
AndiDog

2
1.9+ ไวยากรณ์สำหรับ "กลายเป็น" ถูกต้อง คุณอาจต้องการตรวจสอบ "กลายเป็นวิธี" เนื่องจาก "su" อาจดีกว่า "sudo" เริ่มต้นซึ่งขึ้นอยู่กับการตั้งค่าระบบของคุณ
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

43

ใน 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 ) แต่ต้องทำที่ playbook แทนที่จะเป็นระดับงาน


นี่ไม่ใช่วิธีแก้ปัญหาที่ดีสำหรับกรณีการใช้งานด้านบน อย่างไรก็ตามฉันไม่ทราบวิธีแก้ปัญหานี้มาเป็นเวลานาน ฉันคิดว่าฉันสามารถรวมบทบาทได้เท่านั้น
ArjanSchouten

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.