Unable to create .bashrc source with Ansible

I can ssh to the remote host and make source /home/username/.bashrc - everything works fine. However, if I do this:

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

I get:

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

I don't know what I'm doing wrong ...

+61
ansible
Mar 07 '14 at 17:34
source share
9 answers

You have two options for using a source with accessibility. One of them is with the command "shell:" and / bin / sh (by default - by default). The "source" is called ".". in / bin / sh. Thus, your team will:

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

Note that you need to run the command after searching for .bashrc b / c, each ssh session is different - each ansible command is launched in a separate ssh transaction.

The second option is to force Ansible shell to use bash, and then you can use the "source" command:

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

Finally, I want to note that you might want to actually specify "/ etc / profile" if you are on Ubuntu or similar, which more closely mimics a local login.

+67
Dec 18 '14 at 8:11
source share
β€” -

So command will only run executable files. source text is not itself executable. (This is a built-in shell command). Is there a reason why you want the source full variable environment?

There are other ways to include environment variables in Ansible. For example, the environment directive:

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

Another way is to use the shell Ansible module:

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

or

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

In these cases, the shell instance / environment terminates after completing the Ansible step.

+16
Mar 07
source share

I know this answer came too late, but I saw in enough code, you can use the sudo -i option like this:

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

As stated in the documentation

 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 -c option. If no command is specified, an interactive shell is executed. sudo attempts to change to that user 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. 
+13
Aug 15 '15 at 23:23
source share

I ran into this problem when trying to get virtualenvwrapper to work on an Ubuntu server. I used Ansible as follows:

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

but the source team did not work.

In the end, I found that the .bashrc file has several lines at the top of the file that prevent the source from working when Ansible is called:

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

I commented on these lines in .bashrc, and after that everything worked as expected.

+2
May 03 '18 at 20:55
source share

Well, I tried the listed answers, but that did not work for me when installing ruby ​​through rbenv . I needed to print the lines below /root/.bash_profile

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

Finally, I came up with this

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

You can use this with any command.

 - shell: sudo su - root -c 'your command' 
+1
03 Mar. '16 at 7:25
source share

I found a better solution:

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

You can change the user by adding (default: root):

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

Further information here: become ansible

0
Jul 21 '16 at 11:13
source share

I tried all the options above with ansible 2.4.1.0, and no one works, for two more, and here are the details to reproduce the case.

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

And this is a response test:

 - 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 

And here is the result:

 $ 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 password: changed: [127.0.0.1] PLAY RECAP ****************************************************************************************************************************************************************************** 127.0.0.1 : ok=8 changed=6 unreachable=0 failed=0 

There are two work options:

  • shell: /bin/bash -ic 'ta'
  • shell: ssh -tt localhost/bin/bash -ci 'ta' but this requires a password locally.
0
Oct 31 '18 at 2:14
source share

My 2 cents, I had ~/.nvm/nvm.sh problem of finding the source ~/.nvm/nvm.sh in ~/.profile and then used sudo -iu as suggested in another answer.

Tried in January 2018 against Ubuntu 04.16.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 
0
Jan 15 '19 at 13:27
source share

The right way:

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

Note: this is a test in ansible 2.0.2 version ansible 2.0.2

-2
Jul 30 '16 at 15:34
source share



All Articles