Я могу 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
имеет смысл только тогда, когда вы запускаете его внутри существующей оболочки - он запускает команды в этой оболочке и, таким образом, полезен только тогда, когда есть существующая оболочка, состояние или конфигурацию которой вы хотите изменить. Когда вы запускаете доступное действие, которое создает совершенно новую оболочку и запускает команду внутри этой оболочки - поэтому вы не будете обновлять переменные среды в любом другом контексте, поэтому на самом деле это не будет иметь никакого полезного / длительного эффекта. , даже если вам удалось это запустить без ошибок.source
определяет переменные только на время работы оболочки, в которой он работает . И эта оболочка завершилась (и переменные, которые она определяет, были потеряны) к моменту выхода команды ansible и запуска следующей.source
, до ее выхода.source
работать так, как вы, скорее всего, привыкли.Ответы:
У вас есть два варианта использования источника с доступным. Один - с командой "shell:" и / bin / sh (доступный по умолчанию). "источник" называется "." в / бин / ш. Итак, ваша команда будет:
Обратите внимание, что вы должны запустить команду после получения .bashrc b / c, каждый сеанс ssh отличается - каждая доступная команда выполняется в отдельной транзакции ssh.
Второй вариант - заставить оболочку Ansible использовать bash, а затем вы можете использовать команду «source»:
Наконец, я отмечу, что вы можете захотеть создать источник «/ etc / profile», если вы используете Ubuntu или аналогичный, что более полно имитирует локальный вход.
источник
.
->source
- и вы немедленно сделали это :)source "/etc/profile"
- у меня не получилось. Это сработало:source "~/.profile"
shell: . ~/.bashrc && nvm install {{ node_version }}
и это говорит,nvm command not found
. Как я могу это решить?Так
command
будут запускаться только исполняемые файлы.source
сам по себе не является исполняемым файлом. (Это встроенная команда оболочки). Есть ли причина, по которой вы хотитеsource
использовать полную переменную среды?Есть и другие способы включить переменные среды в Ansible. Например,
environment
директива:Другой способ - использовать
shell
модуль Ansible:или же
В этих случаях экземпляр оболочки / среда завершится после выполнения шага Ansible.
источник
shell source /home/username/.bashrc
становитсяshell . /home/username/.bashrc
executable=/usr/bin/bash
который затем запускает его в bash, если он доступен как таковой.Я знаю, что этот ответ пришел слишком поздно, но я видел достаточно кода, чтобы вы могли использовать параметр sudo,
-i
поэтому:Как сказано в документации
источник
У меня возникла та же проблема, когда я пытался заставить virtualenvwrapper работать на сервере Ubuntu. Я использовал Ansible вот так:
но исходная команда не работала.
В конце концов я обнаружил, что файл .bashrc имеет несколько строк в верхней части файла, которые препятствуют работе источника при вызове Ansible:
Я закомментировал эти строки в .bashrc, и после этого все заработало, как ожидалось.
источник
.bashrc
файлов. Возможно, вы захотите получить другой файл оболочки или использовать,BASH_ENV
как описано в документации bash.Хорошо, я попробовал перечисленные ответы, но они не сработали для меня при установке ruby через rbenv . Мне пришлось использовать следующие строки из
/root/.bash_profile
Наконец, я придумал это
Это можно использовать с любой командой.
источник
2.2.0.0
. Тем не менее, он ворчит, что я должен использоватьbecome
,become_method
иbecome_user
вместо этого ... Я не мог понять комбинацию тех параметров "метода", которые все равно работали бы.Я нашел лучшее решение:
Вы можете изменить пользователя, добавив (по умолчанию: root):
Подробнее здесь: Ansible стать
источник
Многие ответы рекомендуют использовать источник ~ / .bashrc, но основная проблема заключается в том, что доступная оболочка не является интерактивной, а реализация ~ / .bashrc по умолчанию игнорирует неинтерактивную оболочку (проверьте ее начало).
Лучшее решение для выполнения команд от имени пользователя после обнаруженного мной интерактивного входа в систему ssh:
bash: '-i' означает интерактивную оболочку, поэтому .bashrc не будет проигнорирован '-l' означает оболочку входа, которая создает полный профиль пользователя
источник
Я пробовал все вышеперечисленные варианты с ansible 2.4.1.0, и никто не работает, пока не появятся еще два, и вот деталь, чтобы воспроизвести случай.
И это тест на анзибль :
И вот результат:
Работали два варианта:
shell: /bin/bash -ic 'ta'
shell: ssh -tt localhost /bin/bash -ci 'ta'
но для этого требуется ввод пароля локально.источник
Мой 2 цента, я плавал проблему поиска
~/.nvm/nvm.sh
в~/.profile
и затем использовать ,sudo -iu
как это предлагается в другом ответ.Пробовал в январе 2018 года против Ubuntu 16.04.5
источник
Правильный путь должен быть:
Примечание: это тест в
ansible 2.0.2
версииисточник