Mogę ssh do zdalnego hosta i zrobić source /home/username/.bashrc
- wszystko działa dobrze. Jednak jeśli to zrobię:
- name: source bashrc
sudo: no
action: command source /home/username/.bashrc
Dostaję:
failed: [hostname] => {"cmd": ["source", "/home/username/.bashrc"], "failed": true, "rc": 2}
msg: [Errno 2] No such file or directory
Nie mam pojęcia, co robię źle ...
source
ma sens tylko wtedy, gdy uruchamiasz go w istniejącej powłoce - uruchamia polecenia w tej powłoce , a zatem jest przydatny / pomocny tylko wtedy, gdy istnieje istniejąca powłoka, której stan lub konfigurację chcesz zmienić. Kiedy uruchamiasz akcję ansible, która tworzy zupełnie nową powłokę i uruchamia polecenie wewnątrz tej powłoki - więc nie aktualizowałbyś zmiennych środowiskowych w żadnym innym kontekście, więc nie miałoby to żadnego użytecznego / trwałego efektu , nawet jeśli masz to do działania bez błędów.source
definiuje zmienne tylko na czas trwania powłoki, w której działa . Ta powłoka zakończyła pracę (a zdefiniowane przez nią zmienne zostały utracone) do czasu zakończenia polecenia ansibl i rozpoczęcia następnej.source
, zanim zakończyła pracę.source
praca jest taka, do jakiej prawdopodobnie jesteś przyzwyczajony.Odpowiedzi:
Masz dwie możliwości używania źródła z ansible. Jeden jest z poleceniem "shell:" i / bin / sh (domyślne ustawienie ansible). „źródło” nosi nazwę „”. w / bin / sh. Więc twoje polecenie byłoby następujące:
Zauważ, że musisz uruchomić polecenie po uzyskaniu .bashrc b / c każda sesja ssh jest inna - każde polecenie ansible działa w oddzielnej transakcji ssh.
Drugą opcją jest zmuszenie powłoki Ansible do korzystania z bash, a następnie możesz użyć polecenia „source”:
Na koniec zauważę, że możesz chcieć faktycznie pobrać plik „/ etc / profile”, jeśli używasz systemu Ubuntu lub podobnego, co w pełni symuluje logowanie lokalne.
źródło
.
->source
- i od razu to zrobiłeś :)source "/etc/profile"
- to mi się nie udało. To zadziałało:source "~/.profile"
shell: . ~/.bashrc && nvm install {{ node_version }}
i to mówiącnvm command not found
. Jak mogę to rozwiązać?Więc
command
będzie uruchamiać tylko pliki wykonywalne.source
per se nie jest plikiem wykonywalnym. (To wbudowana komenda powłoki). Czy jest jakiś powód, dla którego chceszsource
mieć pełną zmienną środowiskową?Istnieją inne sposoby dołączania zmiennych środowiskowych do Ansible. Na przykład
environment
dyrektywa:Innym sposobem jest użycie
shell
modułu Ansible:lub
W takich przypadkach instancja / środowisko powłoki zostanie zakończone po uruchomieniu kroku Ansible.
źródło
shell source /home/username/.bashrc
się stanieshell . /home/username/.bashrc
executable=/usr/bin/bash
który następnie uruchomi je w bash, jeśli jest dostępny jako taki.Wiem, że ta odpowiedź nadeszła za późno, ale widziałem wystarczająco dużo kodu, że możesz użyć opcji sudo,
-i
więc:Jak wspomniano w dokumentacji
źródło
Miałem ten sam problem, gdy próbowałem uruchomić virtualenvwrapper na serwerze Ubuntu. Używałem Ansible w ten sposób:
ale polecenie źródła nie działało.
W końcu odkryłem, że plik .bashrc ma kilka wierszy na górze pliku, które uniemożliwiają działanie źródła po wywołaniu przez Ansible:
Skomentowałem te linie w .bashrc i po tym wszystko działało zgodnie z oczekiwaniami.
źródło
.bashrc
plików. Prawdopodobnie chcesz pobrać inny plik powłoki lub użyć goBASH_ENV
zgodnie z opisem w dokumentacji bash.Cóż, wypróbowałem wymienione odpowiedzi, ale te nie zadziałały podczas instalowania Ruby przez rbenv . Musiałem znaleźć poniżej linii z
/root/.bash_profile
W końcu to wymyśliłem
Można tego użyć z każdym poleceniem.
źródło
2.2.0.0
. Jednak szkodzi, że powinienem użyćbecome
,become_method
abecome_user
zamiast tego ... Nie mogłem wymyślić kombinacji tych parametrów „metody”, które i tak by działały.Znalazłem najlepsze rozwiązanie:
Możesz zmienić użytkownika dodając (domyślnie: root):
Więcej informacji tutaj: Ansible staje się
źródło
Wiele odpowiedzi poleca source ~ / .bashrc, ale głównym problemem jest to, że powłoka ansible nie jest interaktywna, a implementacja ~ / .bashrc domyślnie ignoruje powłokę nieinteraktywną (sprawdź jej początek).
Najlepszym rozwiązaniem do wykonywania poleceń jako użytkownik po jego interaktywnym logowaniu przez ssh, które znalazłem, jest:
bash: „-i” oznacza powłokę interaktywną, więc .bashrc nie będzie ignorowane „-l” oznacza powłokę logowania, która pobiera pełny profil użytkownika
źródło
Wypróbowałem wszystkie powyższe opcje z ansiblem 2.4.1.0 i nikt nie działa do następnych dwóch, a oto szczegóły ponownego odtworzenia sprawy.
A to jest test ansibli :
A oto wynik:
Dostępne są dwie opcje:
shell: /bin/bash -ic 'ta'
shell: ssh -tt localhost /bin/bash -ci 'ta'
ale ten wymaga wprowadzenia hasła lokalnie.źródło
Moje 2 centy, i obejście problemu zaopatrzenia
~/.nvm/nvm.sh
w~/.profile
a następnie przy użyciusudo -iu
jak zasugerowano w innej odpowiedzi.Próbowano w styczniu 2018 vs Ubuntu 16.04.5
źródło
Właściwy sposób powinien być:
Uwaga: jest to test w
ansible 2.0.2
wersjiźródło