Невозможно создать источник .bashrc с Ansible

Я могу 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

Я не знаю, что я делаю неправильно...

Ответ 1

У вас есть два варианта использования источника с возможностью доступа. Один из них - с командой "shell:" и /bin/sh (по умолчанию - по умолчанию). "Источник" называется ".". in/bin/sh. Таким образом, ваша команда будет:

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

Обратите внимание, что вам нужно запустить команду после поиска .bashrc b/c, каждый сеанс ssh различен - каждая команда ansible запускается в отдельной транзакции ssh.

Второй вариант - заставить Ansible shell использовать bash, а затем вы можете использовать команду "source":

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

Наконец, я хочу отметить, что вы можете захотеть на самом деле указать "/etc/profile", если вы на Ubuntu или аналогичном, что более полно имитирует локальный вход.

Ответ 2

Так что command будет запускать только исполняемые файлы. source текст сам по себе не является исполняемым. (Это встроенная команда оболочки). Есть ли причина, почему вы хотите, чтобы 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 Ansible:

- 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>

В этих случаях экземпляр оболочки/среда завершается после выполнения шага Ansible.

Ответ 3

Я знаю, что этот ответ пришел слишком поздно, но я видел в достаточном количестве кода, вы можете использовать опцию 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 -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.

Ответ 4

Я столкнулся с этой проблемой при попытке заставить virtualenvwrapper работать на сервере Ubuntu. Я использовал 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, и после этого все сработало, как ожидалось.

Ответ 5

Ну, я попробовал перечисленные ответы, но это не сработало для меня при установке ruby ​​через 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'

Ответ 6

Я нашел лучшее решение:

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

Вы можете изменить пользователя, добавив (по умолчанию: root):

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

Дополнительная информация здесь: Ansible стать

Ответ 7

Я перепробовал все варианты выше с ansible 2.4.1.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] **********************************************************************************************************************
[email protected] 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' но для этого требуется ввод пароля локально.

Ответ 8

Мои 2 цента, я ~/.nvm/nvm.sh проблему поиска источника ~/.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    

Ответ 9

Правильный путь:

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

Примечание: это тест в версии ansible 2.0.2