स्रोत के लिए संभव नहीं है


85

मैं दूरस्थ मेजबान के लिए ssh कर सकता हूं और source /home/username/.bashrcसब कुछ ठीक काम करता हूं । हालाँकि अगर मैं करता हूँ:

- name: source bashrc
  sudo: no
  action: command source /home/username/.bashrc

मुझे मिला:

failed: [hostname] => {"cmd": ["source", "/home/username/.bashrc"], "failed": true, "rc": 2}
msg: [Errno 2] No such file or directory

मुझे नहीं पता कि मैं क्या गलत कर रहा हूं ...


sourceकेवल तब ही समझ में आता है जब आप इसे किसी मौजूदा शेल के अंदर चलाते हैं - यह उस शेल में कमांड चलाता है , और इस प्रकार केवल उपयोगी / सहायक होता है जब कोई मौजूदा शेल होता है जिसका राज्य या कॉन्फ़िगरेशन आप बदलना चाहते हैं। जब आप कोई कार्रवाई करने योग्य क्रिया चलाते हैं, जो एक नया शेल बनाता है , और उस शेल के अंदर एक कमांड चलाता है - तो आप किसी अन्य संदर्भ में पर्यावरण चर को अपडेट नहीं करेंगे, इसलिए यह वास्तव में कोई उपयोगी / स्थायी पुतला नहीं होगा , भले ही आपको यह त्रुटियों के बिना चलाने के लिए मिला हो।
चार्ल्स डफी

@CharlesDuffy यदि आप ऐसी कमांड निष्पादित करना चाहते हैं, जो पर्यावरण के चर को परिभाषित करने की अपेक्षा करती है, तो इस तरह के .bashrc या .bash_profile जैसे कुछ स्रोतों को स्रोत के लिए प्रयास करना एक वैध उपयोग मामला है न?
htellez

@htellez, sourceकेवल चल रहे गोले की अवधि के लिए चर को परिभाषित करता है । और उस शेल से बाहर निकल गया है (और चर इसे खो देता है) उस समय तक समाप्त हो जाता है, जब तक कि कमांड से बाहर निकलता है और अगला शुरू होता है।
चार्ल्स डफी

@htellez, ... इस प्रकार, यहां केवल एक ही जवाब जो वास्तव में किसी भी सार्थक तरीके से उपयोगी है , स्टीव मिडगली द्वारा किया गया है , क्योंकि यह एक ही शेल में कुछ और कर रहा है source, जो इससे पहले कि बाहर निकल गया।
चार्ल्स डफी

यह बिल्कुल उपयोग मामला है जिसका मैंने वर्णन करने की कोशिश की, मुझे खेद है अगर मैं स्पष्ट नहीं था। मैंने एक ऐसे परिदृश्य का वर्णन करने की कोशिश की, जिसमें आप कुछ ऐसा चलाना चाहते हैं जो किसी विशेष वातावरण को परिभाषित करता हो। मुझे यह धागा मिल गया क्योंकि मुझे वही त्रुटि मिल रही है, और स्टीव के जवाब को पढ़कर मुझे यह महसूस हुआ कि एज़िबल का शेल कार्य बश के बजाय डिफ़ॉल्ट रूप से श का उपयोग करता है। कमांड को बैश कमांड बनाना स्पष्ट रूप से sourceउस तरह से काम करता है जिस तरह से आपको सबसे अधिक संभावना है।
htellez

जवाबों:


88

आपके पास स्रोत के साथ स्रोत का उपयोग करने के लिए दो विकल्प हैं। एक "शेल:" कमांड और / बिन / श (asible default) के साथ है। "स्रोत" को "कहा जाता है।" in / बिन / श। तो आपकी आज्ञा होगी:

- name: source bashrc
  sudo: no   
  shell: . /home/username/.bashrc && [the actual command you want run]

ध्यान दें कि आपको सोर्सिंग के बाद एक कमांड चलाना है। bashrc b / c प्रत्येक ssh सेशन अलग है - प्रत्येक ansible कमांड एक अलग ssh ट्रांजेक्शन में चलता है।

आपका दूसरा विकल्प है कि अनबेलिबल शेल को बैश का उपयोग करने के लिए मजबूर किया जाए और फिर आप "स्रोत" कमांड का उपयोग कर सकते हैं:

- name: source bashrc
  sudo: no   
  shell: source /home/username/.bashrc && [the actual command you want run]
  args:
     executable: /bin/bash

अंत में, मैं ध्यान दूंगा कि आप उबंटू या उसके समान होने पर वास्तव में "/ etc / profile" स्रोत चाहते हैं, जो एक स्थानीय लॉगिन को और अधिक पूरी तरह से अनुकरण करता है।


3
यह भी ध्यान दें कि यह मुद्दा (और मेरे द्वारा टिप्पणी की गई है) अन्सिबल कोर में बग / फीचर अनुरोध के रूप में दर्ज किया गया है। लेकिन Ansible ने इसे बंद कर दिया और कहा कि "एक प्लगइन लिखें।" बाह। github.com/ansible/ansible/issues/4854
स्टीव मिडली

1
क्या आप मेरा मन पढ़ रहे हैं? आपने इस 3 पतंगों का उत्तर दिया, और मैं इसे संपादित करने के बारे में सोच रहा था .-> source- और आपने तुरंत ऐसा किया :)
warvariuc

मैंने कोशिश की source "/etc/profile"- यह मेरे लिए काम नहीं किया। इसने काम किया:source "~/.profile"
वार्वारियुक

5
मेरे पास कुछ बैश फ़ंक्शंस हैं। मैं उन कार्यों को कैसे निष्पादित / कॉल कर सकता हूं? मैं कोशिश कर रहा हूँ shell: . ~/.bashrc && nvm install {{ node_version }}और यह कह रहा है, nvm command not found। इसे कैसे हल किया जा सकता है?
रवितेज

1
@RaviTezu: मेरे मामले में समस्या .bashrc में निम्न पंक्तियों के कारण थी: # यदि अंतःक्रियात्मक रूप से नहीं चल रही है, तो कुछ भी मामला $ न करें - i ) ;; *) वापसी;; esac यह कम से कम ubuntu-16.04 xenial64 पर एक समस्या है जहाँ .bashrc गैर संवादात्मक गोले पर नहीं चलाया जाता है जो ssh के माध्यम से कमांड चलाते समय होता है। इसे आज़माने के लिए, कुछ PATH को ~ / .bashrc में सेट करें और चलाएं (यह मानते हुए कि आपने पोर्ट 2222 को अतिथि ओएस पर 22 को अग्रेषित कर दिया है): ssh -p 2222 ubuntu@127.0.0.1 'echo $ATHH' टी पथ आप .bashrc में निर्धारित किया है तो .bashrc ठीक दिखाने
Divick

24

तो commandकेवल निष्पादन योग्य चलेंगे। sourceप्रति se एक निष्पादन योग्य नहीं है। (यह बिलिन शेल कमांड है)। क्या कोई कारण है कि आप sourceपूर्ण पर्यावरण चर चाहते हैं?

Ansible में पर्यावरण चर को शामिल करने के अन्य तरीके हैं। उदाहरण के लिए, environmentनिर्देश:

- name: My Great Playbook
  hosts: all
  tasks:
    - name: Run my command
      sudo: no
      action: command <your-command>
      environment:
          HOME: /home/myhome

एक और तरीका है कि shellअंसबल मॉड्यूल का उपयोग करें :

- name: source bashrc
  sudo: no
  action: shell source /home/username/.bashrc && <your-command>

या

- name: source bashrc
  sudo: no   
  shell: source /home/username/.bashrc && <your-command>

इन मामलों में, शेल का उदाहरण / वातावरण एक बार जब अन्सिबल कदम चलाया जाता है, तो वह समाप्त हो जाएगा।


2
लगभग अच्छा, दुर्भाग्य से / बिन / श के पास केवल स्रोत कमंड नहीं है। तो shell source /home/username/.bashrcबन जाता हैshell . /home/username/.bashrc
b1r3k

शेल टास्क एक पैरामीटर लेता है जैसे: executable=/usr/bin/bashजो इसे उपलब्ध होने पर बैश में चलाएगा।
fgysin ने Monica

16

मुझे पता है कि यह उत्तर बहुत देर से आया है लेकिन मैंने पर्याप्त कोड में देखा है कि आप sudo विकल्प का उपयोग कर सकते हैं -i :

- name: source bashrc
  shell: sudo -iu {{ansible_user_id}} [the actual command you want run]

जैसा कि प्रलेखन में कहा गया है

The -i (simulate initial login) option runs the shell specified by the password database entry of the target user as a login shell.  This means that login-specific
               resource files such as .profile or .login will be read by the shell.  If a command is specified, it is passed to the shell for execution via the shell's -c option.
               If no command is specified, an interactive shell is executed.  sudo attempts to change to that user's home directory before running the shell.  It also initializes
               the environment to a minimal set of variables, similar to what is present when a user logs in.  The Command environment section below documents in detail how the -i
               option affects the environment in which a command is run.

5

मैं एक ही समस्या का सामना कर रहा था जब एक Ubuntu सर्वर पर काम करने के लिए virtualenvwrapper पाने की कोशिश कर रहा था। मैं इस तरह से Ansible का उपयोग कर रहा था:

- name: Make virtual environment
  shell: source /home/username/.bashrc && makevirtualenv virenvname
  args:
    executable: /bin/bash

लेकिन सोर्स कमांड काम नहीं कर रहा था।

आखिरकार मुझे पता चला कि .bashrc फ़ाइल में फ़ाइल के शीर्ष पर कुछ पंक्तियाँ होती हैं जो स्रोत को कार्य करने से रोकती हैं जब Ansible द्वारा कॉल किया जाता है:

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

मैंने उन पंक्तियों को .bashrc में टिप्पणी की और उसके बाद की अपेक्षा के अनुसार सब कुछ काम किया।


यह पूरी तरह से उचित और ज्यादातर .bashrcफ़ाइलों के लिए मानक हैडर है । आप शायद एक अलग शेल फ़ाइल को सोर्स करना चाहते हैं, या BASH_ENVबैश डॉक्स में चर्चा के रूप में उपयोग करना चाहते हैं ।

2

वैसे मैंने सूचीबद्ध उत्तरों की कोशिश की, लेकिन उन लोगों ने मेरे लिए काम नहीं किया, जो रेंब के जरिए माणिक स्थापित करते थे । मैं लाइनों से नीचे स्रोत था/root/.bash_profile

PATH=$PATH:$HOME/bin:$HOME/.rbenv/bin:$HOME/.rbenv/plugins/ruby-build/bin
export PATH
eval "$(rbenv init -)"

अंत में, मैं इसे लेकर आया

- shell: sudo su - root -c 'rbenv install -v {{ ruby_version }}'

इसका उपयोग कोई भी कमांड के साथ कर सकता है।

- shell: sudo su - root -c 'your command'

1
यह क्लासिक अप्रोच Ansible के साथ काम करता है 2.2.0.0। हालाँकि, यह nags है कि मैं का उपयोग करना चाहिए become, become_methodऔर become_userइसके बजाय ... मैं उन "विधि" params के संयोजन का पता नहीं लगा सका जो वैसे भी काम करेंगे।
यूरी

2

मुझे सबसे अच्छा समाधान के रूप में मिला:

- name: Source .bashrc
  shell: . .bashrc
  become: true

आप उपयोगकर्ता को जोड़कर बदल सकते हैं (डिफ़ॉल्ट: रूट):

- name: Source .bashrc
  shell: . .bashrc
  become: true
  become-user: {your_remote_user}

अधिक यहाँ जानकारी: Ansible बन


2

कई प्रतिक्रियाएं स्रोत ~ / .bashrc की सलाह देती हैं लेकिन मुख्य समस्या यह है कि ansible खोल इंटरैक्टिव नहीं है और ~ / -bashrc डिफ़ॉल्ट रूप से गैर-संवादात्मक शेल को अनदेखा करता है (इसकी शुरुआत की जाँच करें)।

अपने ssh इंटरैक्टिव लॉगिन के बाद उपयोगकर्ता के रूप में कमांड निष्पादित करने का सबसे अच्छा समाधान है:

- hosts: all
  tasks:
    - name: source user profile file
      #become: yes
      #become_user: my_user  # in case you want to become different user (make sure acl package is installed)
      shell: bash -ilc 'which python' # example command which prints
      register: which_python
    - debug:
      var: which_python

bash: '-i' का अर्थ है इंटरेक्टिव शेल, इसलिए .bashrc को नजरअंदाज नहीं किया जाएगा '-l' का मतलब है लॉगिन शेल जो स्रोतों को पूर्ण उपयोगकर्ता प्रोफाइल बनाता है


0

मैंने उपरोक्त सभी विकल्पों को २.४.१.० के साथ आज़माया है और कोई भी एक दो तक काम नहीं करता है और यहाँ मामले को फिर से बनाने के लिए विस्तार से बताया गया है।

$ cat ~/.bash_aliases 
alias ta="echo 'this is test for ansible interactive shell'";

और यह एक परीक्षा है :

- name: Check the basic string operations
  hosts: 127.0.0.1 
  connection: local

  tasks:
  - name: Test Interactive Bash Failure
    shell: ta
    ignore_errors: True

  - name: Test Interactive Bash Using Source
    shell: source ~/.bash_aliases && ta
    args:
      executable: /bin/bash
    ignore_errors: yes

  - name: Test Interactive Bash Using .
    shell: . ~/.bash_aliases && ta
    ignore_errors: yes

  - name: Test Interactive Bash Using /bin/bash -ci
    shell: /bin/bash -ic 'ta'
    register: result
    ignore_errors: yes

  - debug: msg="{{ result }}"

  - name: Test Interactive Bash Using sudo -ui
    shell: sudo -ui hearen ta
    register: result
    ignore_errors: yes

  - name: Test Interactive Bash Using ssh -tt localhost /bin/bash -ci
    shell: ssh -tt localhost /bin/bash -ci 'ta'
    register: result
    ignore_errors: yes

और यह परिणाम है:

$ ansible-playbook testInteractiveBash.yml 
 [WARNING]: Could not match supplied host pattern, ignoring: all

 [WARNING]: provided hosts list is empty, only localhost is available


PLAY [Check the basic string operations] ************************************************************************************************************************************************

TASK [Gathering Facts] ******************************************************************************************************************************************************************
ok: [127.0.0.1]

TASK [Test Interactive Bash Failure] ****************************************************************************************************************************************************
fatal: [127.0.0.1]: FAILED! => {"changed": true, "cmd": "ta", "delta": "0:00:00.001341", "end": "2018-10-31 10:11:39.485897", "failed": true, "msg": "non-zero return code", "rc": 127, "start": "2018-10-31 10:11:39.484556", "stderr": "/bin/sh: 1: ta: not found", "stderr_lines": ["/bin/sh: 1: ta: not found"], "stdout": "", "stdout_lines": []}
...ignoring

TASK [Test Interactive Bash Using Source] ***********************************************************************************************************************************************
fatal: [127.0.0.1]: FAILED! => {"changed": true, "cmd": "source ~/.bash_aliases && ta", "delta": "0:00:00.002769", "end": "2018-10-31 10:11:39.588352", "failed": true, "msg": "non-zero return code", "rc": 127, "start": "2018-10-31 10:11:39.585583", "stderr": "/bin/bash: ta: command not found", "stderr_lines": ["/bin/bash: ta: command not found"], "stdout": "", "stdout_lines": []}
...ignoring

TASK [Test Interactive Bash Using .] ****************************************************************************************************************************************************
fatal: [127.0.0.1]: FAILED! => {"changed": true, "cmd": ". ~/.bash_aliases && ta", "delta": "0:00:00.001425", "end": "2018-10-31 10:11:39.682609", "failed": true, "msg": "non-zero return code", "rc": 127, "start": "2018-10-31 10:11:39.681184", "stderr": "/bin/sh: 1: ta: not found", "stderr_lines": ["/bin/sh: 1: ta: not found"], "stdout": "", "stdout_lines": []}
...ignoring

TASK [Test Interactive Bash Using /bin/bash -ci] ****************************************************************************************************************************************
changed: [127.0.0.1]

TASK [debug] ****************************************************************************************************************************************************************************
ok: [127.0.0.1] => {
    "msg": {
        "changed": true, 
        "cmd": "/bin/bash -ic 'ta'", 
        "delta": "0:00:00.414534", 
        "end": "2018-10-31 10:11:40.189365", 
        "failed": false, 
        "rc": 0, 
        "start": "2018-10-31 10:11:39.774831", 
        "stderr": "", 
        "stderr_lines": [], 
        "stdout": "this is test for ansible interactive shell", 
        "stdout_lines": [
            "this is test for ansible interactive shell"
        ]
    }
}

TASK [Test Interactive Bash Using sudo -ui] *********************************************************************************************************************************************
 [WARNING]: Consider using 'become', 'become_method', and 'become_user' rather than running sudo

fatal: [127.0.0.1]: FAILED! => {"changed": true, "cmd": "sudo -ui hearen ta", "delta": "0:00:00.007906", "end": "2018-10-31 10:11:40.306128", "failed": true, "msg": "non-zero return code", "rc": 1, "start": "2018-10-31 10:11:40.298222", "stderr": "sudo: unknown user: i\nsudo: unable to initialize policy plugin", "stderr_lines": ["sudo: unknown user: i", "sudo: unable to initialize policy plugin"], "stdout": "", "stdout_lines": []}
...ignoring

TASK [Test Interactive Bash Using ssh -tt localhost /bin/bash -ci] **********************************************************************************************************************
hearen@localhost's password: 
changed: [127.0.0.1]

PLAY RECAP ******************************************************************************************************************************************************************************
127.0.0.1                  : ok=8    changed=6    unreachable=0    failed=0  

दो विकल्प काम कर रहे हैं:

  • shell: /bin/bash -ic 'ta'
  • shell: ssh -tt localhost /bin/bash -ci 'ta' लेकिन इसके लिए स्थानीय स्तर पर पासवर्ड इनपुट की आवश्यकता होती है।

0

मेरे 2 सेंट, मैंने समस्या का सोर्सिंग ~/.nvm/nvm.shमें ~/.profileउपयोग किया और फिर sudo -iuएक अन्य उत्तर में सुझाव दिया।

जनवरी 2018 बनाम Ubuntu 16.04.5 पर कोशिश की गई

- name: Installing Nvm 
  shell: >
    curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh | bash
  args:
    creates: "/home/{{ ansible_user }}/.nvm/nvm.sh"
  tags:
    - nodejs    

- name: Source nvm in ~/.profile
  sudo: yes
  sudo_user: "{{ ansible_user }}"
  lineinfile: >
    dest=~/.profile
    line="source ~/.nvm/nvm.sh"
    create=yes
  tags: 
    - nodejs
  register: output    

- name: Installing node 
  command: sudo -iu {{ ansible_user }} nvm install --lts
  args:
     executable: /bin/bash
  tags:
    - nodejs    

-3

सही तरीका होना चाहिए:

- hosts: all
  tasks:
    - name: source bashrc file
      shell: "{{ item }}"
      with_items:
         - source ~/.bashrc
         - your other command

नोट: यह ansible 2.0.2संस्करण में परीक्षण है

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