উত্তর সহ .bashrc উত্স করা সম্ভব নয়


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আপনি যখন এটি কোনও বিদ্যমান শেলের ভিতরে চালাবেন কেবল তখনই তা বোধগম্য হয় - এটি সেই শেলের মধ্যে কমান্ডগুলি চালায় এবং যখন এমন কোনও শেল থাকে যার অবস্থা বা কনফিগারেশন আপনি পরিবর্তন করতে চান তখন কেবল কার্যকর / সহায়ক হয়। আপনি যখন কোনও জবাবদিহিমূলক ক্রিয়াটি চালান, এটি সম্পূর্ণ নতুন শেল তৈরি করে এবং সেই শেলের ভিতরে একটি কমান্ড চালায় - সুতরাং আপনি অন্য কোনও প্রসঙ্গে পরিবেশের পরিবর্তনশীলগুলি আপডেট করবেন না, সুতরাং এটিতে কোনও কার্যকর / দীর্ঘস্থায়ী ছাপ নেই have এমনকি যদি ত্রুটি ছাড়াই এটি চালাতে পেলেন।
চার্লস ডাফি

@ চার্লসডুফি আপনি যদি এমন একটি কমান্ড প্রয়োগ করতে চান যা পরিবেশের ভেরিয়েবলগুলি সংজ্ঞায়িত হওয়ার প্রত্যাশা করে তবে .bashrc বা .bash_profile এর মতো কোনও ভেরিয়েবলকে সংজ্ঞায়িত করার চেষ্টা করার বিষয়টি কি বৈধ ব্যবহারের ঘটনা নয়?
htellez

@htellez, চলমান শেলটির সময়কাল জন্যsource কেবল চলকগুলি সংজ্ঞায়িত করে । উত্তরসূচক কমান্ডটি বেরিয়ে আসে এবং পরবর্তীটি শুরু হওয়ার সাথে সাথে সেই শেলটি বের হয়ে যায় (এবং এটির নির্ধারিত পরিবর্তনগুলি হারিয়ে যায়) been
চার্লস ডাফি

@ হিটলেজ, ... সুতরাং এখানে যে একমাত্র উত্তরটি আসলে কোনও অর্থবহ উপায়ে কার্যকর তা হ'ল স্টিভ মিডলেগির উত্তর , যেহেতু sourceএটি বের হওয়ার আগে আপনি একই শেলটিতে অন্য কিছু করেছিলেন doing
চার্লস ডাফি

এটি হ'ল আমি ব্যবহারের ক্ষেত্রে বর্ণনা করার চেষ্টা করেছি, আমি পরিষ্কার না হলে দুঃখিত। আমি এমন একটি দৃশ্যের বর্ণনা দেওয়ার চেষ্টা করেছি যাতে আপনি এমন কোনও কিছু চালাতে চান যা প্রত্যাশিত কোনও নির্দিষ্ট পরিবেশের সংজ্ঞা দেয়। আমি এই থ্রেডে পৌঁছেছি কারণ আমি একই ত্রুটি পেয়েছি এবং স্টিভের উত্তরটি পড়ে আমি বুঝতে পেরেছি যে উত্তরীর শেল টাস্ক ব্যাশের পরিবর্তে ডিফল্টরূপে sh ব্যবহার করে। কমান্ডটি ব্যাশ কমান্ড তৈরি করা আপনার sourceসম্ভবত যেভাবে ব্যবহার করা হয় তা স্পষ্টভাবে কাজ করে।
htellez

উত্তর:


88

উত্তরযোগ্য সহ উত্সটি ব্যবহার করার জন্য আপনার কাছে দুটি বিকল্প রয়েছে। একটি হ'ল "শেল:" কমান্ড এবং / বিন / শ (উত্তরযোগ্য ডিফল্ট) সহ। "উত্স" বলা হয় "।" ইন / বিন / শি সুতরাং আপনার আদেশ হবে:

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

দ্রষ্টব্য আপনি সোর্স করার পরে একটি কমান্ড চালাতে হবে। Bshrc বি / সি প্রতিটি ssh অধিবেশন পৃথক - প্রতিটি উত্তরসূচক কমান্ড পৃথক ssh লেনদেনে চলমান।

আপনার দ্বিতীয় বিকল্পটি উত্তরীয় শেলটিকে বাশ ব্যবহার করতে বাধ্য করা এবং তারপরে আপনি "উত্স" কমান্ডটি ব্যবহার করতে পারেন:

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

পরিশেষে, আমি লক্ষ করব যে আপনি যদি উবুন্টু বা অনুরূপ হয়ে থাকেন তবে আপনি সম্ভবত "/ etc / প্রোফাইল" উত্স তৈরি করতে চাইতে পারেন যা কোনও স্থানীয় লগইনকে আরও সম্পূর্ণরূপে অনুকরণ করে।


4
এছাড়াও নোট করুন যে এই সমস্যাটি উত্তরযোগ্য কোরটিতে বাগ / বৈশিষ্ট্য অনুরোধ হিসাবে দায়ের করা হয়েছে (এবং আমার দ্বারা মন্তব্য করা হয়েছে)। তবে উত্তরযোগ্য এটি বন্ধ করে বললেন "একটি প্লাগইন লিখুন"। বাহ। github.com/ansible/ansible/issues/4854
স্টিভ

4
আপনি আমার মন পড়ছেন? আপনি এই 3 মথ আগে উত্তর দিয়েছিলেন, এবং আমি এটি সম্পাদনা করার কথা ভাবছিলাম .-> source- এবং আপনি তাত্ক্ষণিকভাবে এটি করেছেন :)
ওয়ারওয়ারিচ

আমি চেষ্টা করেছিলাম source "/etc/profile"- এটি আমার পক্ষে কাজ করে না। এটি কাজ করেছে:source "~/.profile"
ওয়ারওয়ারিচ

4
আমার .bashrc এর ভিতরে এবং .bashrc উত্সাহিত করার পরে কিছু বাশ ফাংশন নির্ধারণ করা হয়েছে। আমি কীভাবে এই ফাংশনগুলি সম্পাদন / কল করতে পারি? আমি চেষ্টা করছি shell: . ~/.bashrc && nvm install {{ node_version }}এবং এটা বলছে nvm command not found,। আমি কীভাবে এটি সমাধান করতে পারি?
রবিতেজু

4
@ রভিটিজু: আমার ক্ষেত্রে সমস্যাটি ছিল .বাশিআরসি-র নিম্নলিখিত লাইনগুলির কারণে: # যদি ইন্টারেক্টিভভাবে চলতে না থাকে তবে কোনও মামলা করবেন না $ - আমি ) ;; *) প্রত্যাবর্তন ;; এসাক এটি কমপক্ষে উবুন্টু -১.0.০৪ জেনিয়াল on৪ তে একটি সমস্যা যেখানে .bashrc নন ইন্টারেক্টিভ শেলগুলিতে চালিত হয় না যা ssh এর মাধ্যমে কমান্ডগুলি চালনার ক্ষেত্রে হয়। এটি চেষ্টা করার জন্য, P / .bashrc এ কিছু PATH সেট করুন এবং চালান (ধরে নিলেন যে আপনি 2222 অতিথির ওপরে 2222 ফরোয়ার্ড রেখেছেন): ssh -p 2222 ubuntu@127.0.0.1 'প্রতিধ্বনি $ PATH' যদি উপরের কমান্ডটি না করে তবে ' আপনি
.Bashrc এ যে প্যাথটি

24

সুতরাং commandশুধুমাত্র এক্সিকিউটেবল চালানো হবে। sourceপ্রতি সে এক্সিকিউটেবল নয়। (এটি একটি বিল্টিন শেল কমান্ড)। আপনি sourceএকটি পূর্ণ পরিবেশের পরিবর্তনশীল করতে চান এমন কোনও কারণ আছে কি ?

উত্তরযোগ্য পরিবেশে পরিবর্তনশীল অন্তর্ভুক্ত করার অন্যান্য উপায় আছে। উদাহরণস্বরূপ, 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>

এই ক্ষেত্রেগুলি, উত্তর পদক্ষেপটি চালিত হয়ে গেলে শেলের উদাহরণ / পরিবেশটি সমাপ্ত হবে।


4
প্রায় ভাল, দুর্ভাগ্যক্রমে / বিন / শ এর সোর্স কম্যান্ড নেই। তাই shell source /home/username/.bashrcহয়ে যায়shell . /home/username/.bashrc
b1r3k

শেল টাস্কটি এমন একটি প্যারামিটার নেয়: executable=/usr/bin/bashএটি যদি এটি উপলব্ধ থাকে তবে এটি এটি ব্যাশে চালাবে।
fgysin মনিকা

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

উবুন্টু সার্ভারে কাজ করার জন্য ভার্চুয়ালেনভ্রাপার পাওয়ার চেষ্টা করার সময় আমি এই একই সমস্যার মুখোমুখি হয়েছিলাম। আমি এর মতো উত্তরযোগ্য ব্যবহার করছিলাম:

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

তবে সোর্স কমান্ডটি কাজ করছে না।

অবশেষে আমি আবিষ্কার করেছি যে .bashrc ফাইলটির ফাইলের শীর্ষে কয়েকটি লাইন রয়েছে যা উত্সযোগ্যকে ফোন করা হলে উত্সকে কাজ করা থেকে বিরত করে:

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

.Bashrc এ এই লাইনগুলি মন্তব্য করেছি এবং তারপরে প্রত্যাশা অনুযায়ী সবকিছুই কাজ করেছে।


এটি বেশিরভাগ .bashrcফাইলের জন্য পুরোপুরি যুক্তিযুক্ত এবং মানক শিরোনাম । আপনি সম্ভবত একটি আলাদা শেল ফাইল উত্স করতে চান, বা BASH_ENVব্যাশ ডক্সে আলোচিত হিসাবে ব্যবহার করতে পারেন ।

2

ওয়েল আমি তালিকাভুক্ত উত্তর চেষ্টা করেছিলেন কিন্তু সেই আমার জন্য কাজ করা হয়নি যখন মাধ্যমে রুবি ইনস্টল rbenv । আমি থেকে লাইন নীচে উত্স ছিল/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'

4
এই ক্লাসিক পদ্ধতির সাথে উত্তরযোগ্য কাজ করে 2.2.0.0। যাইহোক, এটা খুঁতগুলোও যে আমি ব্যবহার করা উচিত become, become_methodএবং become_userপরিবর্তে ... আমি ঐ "পদ্ধতি" প্যারাম যা যাহাই হউক না কেন কাজ করবে সংমিশ্রণ জিনিসটা করতে পারিনি।
ইউরি

2

আমি খুঁজে পেয়েছি সেরা সমাধান হিসাবে:

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

আপনি (ডিফল্ট: মূল) যুক্ত করে ব্যবহারকারীটিকে পরিবর্তন করতে পারেন:

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

এখানে আরও তথ্য: উত্তরযোগ্য হয়ে


2

অনেক প্রতিক্রিয়া উত্সকে b / .brcrc দেওয়ার পরামর্শ দেয় তবে মূল সমস্যাটি হ'ল উত্তরসূচক শেলটি ইন্টারেক্টিভ নয় এবং default / .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

বাশ: '-i' এর অর্থ ইন্টারেক্টিভ শেল, সুতরাং .brcrc উপেক্ষা করা হবে না '-l' অর্থ লগইন শেল যা পুরো ব্যবহারকারীর প্রোফাইল উত্স করে


0

আমি উপরের সমস্ত বিকল্পগুলি উত্তরযোগ্য ২.৪.১.০ দিয়ে চেষ্টা করেছি এবং অন্য দু'জন অবধি কেউ কাজ করে না এবং এখানে কেসটি পুনঃ উত্পাদন করার জন্য বিস্তারিত রয়েছে detail

$ 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অন্য উত্তরে প্রস্তাবিত হিসাবে ব্যবহার করে nav

জানুয়ারী 2018 বনাম উবুন্টু 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সংস্করণে পরীক্ষা

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.