उपयोगकर्ता को कार्य या कार्यों के सेट पर कैसे स्विच करें?


160

एक पुनरावर्ती विषय जो मेरी अनसुनी प्लेबुक में है, वह यह है कि मुझे अक्सर sudo विशेषाधिकारों ( sudo: yes) के साथ एक कमांड निष्पादित करना चाहिए क्योंकि मैं इसे एक निश्चित उपयोगकर्ता के लिए करना चाहूंगा। आदर्श रूप में मैं उस उपयोगकर्ता पर स्विच करने और सामान्य रूप से कमांड निष्पादित करने के लिए sudo का उपयोग करूंगा। क्योंकि तब मुझे अपने सामान्य पोस्ट कमांड्स जैसे कि चाउनिंग निर्देशिकाओं को साफ करने की आवश्यकता नहीं होगी। यहाँ मेरी एक प्लेबुक से एक स्निपेट है:

- 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

आदर्श रूप में मैं एक अलग उपयोगकर्ता के रूप में कमांड या सेट को चला सकता था, भले ही इसके लिए उस उपयोगकर्ता को suo की आवश्यकता हो।

जवाबों:


241

Ansible 1.9 या बाद के साथ

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

निर्देश उस खंड के दायरे के लिए प्रभावी है जिसमें इसका उपयोग किया जाता है ( उदाहरण )।

कुछ अतिरिक्त उदाहरणों के लिए होस्ट और उपयोगकर्ता देखें और अधिक विस्तृत प्रलेखन के लिए (विशेषाधिकार वृद्धि) बनें

टास्क- स्कॉप्ड becomeऔर become_userनिर्देशों के अलावा, अन्सिबल 1.9 ने स्पष्ट निर्देशों के अभाव में एक नाटक की अवधि के लिए इन मूल्यों को निर्धारित करने के लिए कुछ नए चर और कमांड लाइन विकल्प जोड़े:

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 }}"या आपको यम वाक्य-विन्यास त्रुटि मिलेगी।
सुमीत पारी

अच्छी पकड़। मैं ओपी की समस्या के फॉर्मूलेशन को यथासंभव बारीकी से मैच करने की कोशिश कर रहा था, लेकिन मैं मानता हूं कि वेरिएबल इंटरपोलेशन का उपयोग करना सबसे आम विकल्प होगा।
ब्रेट

5
Ansible 1.9 से, यह " सुडो *" के बजाय becomeसिस्टम है
एंडी डॉग

2
1.9 "वाक्य" के लिए वाक्यविन्यास सही है। आप अपने सिस्टम सेटअप के आधार पर, "su" कभी-कभी डिफ़ॉल्ट "sudo" से बेहतर भी हो सकते हैं, क्योंकि "su_method" की जांच करना चाहते हैं।
ElementalStorm

New Ansible variables and command line options are added to set these values for the duration of a play. @ ब्रेट का मतलब यह है कि इसके बाद सफल होने वाले कार्यों को चलाया जाएगा some_userऔर न कि मूल उपयोगकर्ता को remote_userजो होस्ट से कनेक्ट करने के लिए उपयोग किया गया था, क्या यह सही है?
जॉनीक्यू

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 देखें


यह स्थितियों के लिए सबसे अच्छा समाधान है जब आपके पास सूडो विशेषाधिकार नहीं हैं
डारेल होल्ट

7

एक समाधान है कि includeवेरिएंट के साथ स्टेटमेंट का उपयोग करें remote_user(वहां वर्णन करें: http://docs.ansible.com/playbooks_roles.html ) लेकिन इसे कार्य स्तर के बजाय प्लेबुक में किया जाना है।


यह ऊपर उपयोग के मामले के लिए एक अच्छा समाधान नहीं है। हालाँकि मैं इस समाधान के बारे में लंबे समय से नहीं जानता था। मुझे लगा कि मैं केवल भूमिकाएं ही शामिल कर सकता हूं।
अर्जनशूटआउट

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"
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.