Ich kann ssh zum Remote-Host und mache ein source /home/username/.bashrc
- alles funktioniert gut. Wenn ich es jedoch tue:
- name: source bashrc
sudo: no
action: command source /home/username/.bashrc
Ich bekomme:
failed: [hostname] => {"cmd": ["source", "/home/username/.bashrc"], "failed": true, "rc": 2}
msg: [Errno 2] No such file or directory
Ich habe keine Ahnung, was ich falsch mache ...
source
Dies ist nur dann sinnvoll, wenn Sie es in einer vorhandenen Shell ausführen. Es führt Befehle in dieser Shell aus und ist daher nur dann nützlich / hilfreich, wenn eine vorhandene Shell vorhanden ist, deren Status oder Konfiguration Sie ändern möchten. Wenn Sie eine ansible-Aktion ausführen, wird eine ganz neue Shell erstellt und ein Befehl in dieser Shell ausgeführt. Sie würden also die Umgebungsvariablen in keinem anderen Kontext aktualisieren, sodass sie keinen nützlichen / dauerhaften Effekt hätte , auch wenn Sie dies ohne Fehler laufen lassen.source
definiert nur Variablen für die Dauer der Shell, in der es ausgeführt wird . Und diese Shell ist beendet (und die von ihr definierten Variablen sind verloren gegangen), als der ansible-Befehl beendet wird und der nächste startet.source
, bevor sie beendet wurde.source
funktioniert dies wie gewohnt.Antworten:
Sie haben zwei Möglichkeiten, die Quelle mit ansible zu verwenden. Eine davon ist der Befehl "shell:" und / bin / sh (die ansible Standardeinstellung). "Quelle" heißt "." in / bin / sh. Ihr Befehl wäre also:
Beachten Sie, dass Sie nach der Beschaffung von .bashrc b / c einen Befehl ausführen müssen. Jede SSH-Sitzung ist unterschiedlich. Jeder ansible-Befehl wird in einer separaten SSH-Transaktion ausgeführt.
Ihre zweite Option besteht darin, die Ansible-Shell zur Verwendung von bash zu zwingen. Anschließend können Sie den Befehl "source" verwenden:
Abschließend möchte ich darauf hinweisen, dass Sie möglicherweise "/ etc / profile" als Quelle verwenden möchten, wenn Sie Ubuntu oder ähnliches verwenden, wodurch eine lokale Anmeldung vollständiger simuliert wird.
quelle
.
source
source "/etc/profile"
- es hat bei mir nicht funktioniert. Dies funktionierte:source "~/.profile"
shell: . ~/.bashrc && nvm install {{ node_version }}
und es heißt ,nvm command not found
. Wie kann ich das lösen?Es
command
werden also nur ausführbare Dateien ausgeführt.source
per se ist keine ausführbare Datei. (Es ist ein eingebauter Shell-Befehl). Gibt es einen Grund, warum Siesource
eine vollständige Umgebungsvariable verwenden möchten ?Es gibt andere Möglichkeiten, Umgebungsvariablen in Ansible aufzunehmen. Zum Beispiel die
environment
Richtlinie:Eine andere Möglichkeit ist die Verwendung des
shell
Ansible-Moduls:oder
In diesen Fällen wird die Shell-Instanz / -Umgebung beendet, sobald der Ansible-Schritt ausgeführt wird.
quelle
shell source /home/username/.bashrc
wirdshell . /home/username/.bashrc
executable=/usr/bin/bash
der ihn dann in bash ausführt, wenn er als solcher verfügbar ist.Ich weiß, dass diese Antwort zu spät kommt, aber ich habe in genügend Code gesehen, dass Sie die sudo-Option verwenden können,
-i
also:Wie in der Dokumentation gesagt
quelle
Ich hatte das gleiche Problem, als ich versuchte, virtualenvwrapper auf einem Ubuntu-Server zum Laufen zu bringen. Ich habe Ansible folgendermaßen verwendet:
aber der Quellbefehl funktionierte nicht.
Schließlich stellte ich fest, dass die .bashrc-Datei oben in der Datei einige Zeilen enthält, die verhindern, dass die Quelle funktioniert, wenn sie von Ansible aufgerufen wird:
Ich habe diese Zeilen in .bashrc auskommentiert und danach hat alles wie erwartet funktioniert.
quelle
.bashrc
Dateien. Sie möchten wahrscheinlich eine andere Shell-DateiBASH_ENV
als Quelle verwenden oder wie in den Bash-Dokumenten beschrieben verwenden.Nun, ich habe die aufgelisteten Antworten ausprobiert, aber diese haben bei der Installation von Ruby über rbenv nicht funktioniert . Ich musste unter Zeilen von beziehen
/root/.bash_profile
Schließlich habe ich mir das ausgedacht
Man kann dies mit jedem Befehl verwenden.
quelle
2.2.0.0
. Es ist jedoch ein Nörgelei, das ich verwenden solltebecome
,become_method
undbecome_user
stattdessen ... konnte ich keine Kombination dieser "Methoden" -Parameter herausfinden, die sowieso funktionieren würden.Ich fand als beste Lösung geworden:
Sie können den Benutzer ändern, indem Sie Folgendes hinzufügen (Standard: root):
Mehr Infos hier: Ansible werden
quelle
In vielen Antworten wird empfohlen, ~ / .bashrc als Quelle zu verwenden. Das Hauptproblem besteht jedoch darin, dass die Ansible-Shell nicht interaktiv ist und die Implementierung von ~ / .bashrc standardmäßig nicht interaktive Shell ignoriert (überprüfen Sie den Anfang).
Die beste Lösung für die Ausführung von Befehlen als Benutzer nach der interaktiven Anmeldung von ssh, die ich gefunden habe, ist:
bash: '-i' bedeutet interaktive Shell, daher wird .bashrc nicht ignoriert. '-l' bedeutet Login-Shell, die das vollständige Benutzerprofil erstellt
quelle
Ich habe alle oben genannten Optionen mit ansible 2.4.1.0 ausprobiert und niemand arbeitet bis zwei weitere und hier ist das Detail, um den Fall wieder herzustellen.
Und das ist der ansible Test :
Und das ist das Ergebnis:
Es gibt zwei Möglichkeiten:
shell: /bin/bash -ic 'ta'
shell: ssh -tt localhost /bin/bash -ci 'ta'
Dieser erfordert jedoch die lokale Passworteingabe.quelle
My 2 cents, umsegelte ich das Problem der Beschaffung
~/.nvm/nvm.sh
in~/.profile
und dann unter Verwendung vonsudo -iu
wie in einer anderen Antwort vorgeschlagen.Versucht am Januar 2018 gegen Ubuntu 16.04.5
quelle
Der richtige Weg sollte sein:
Hinweis: Es ist ein Test in der
ansible 2.0.2
Versionquelle