Ein Tool, das die Serverkonstruktion ohne Agenten automatisiert. --SSH stellt eine Verbindung zu dem Computer her, auf dem sshd ausgeführt wird, und erstellt die Umgebung. --Schreiben Sie die Konfigurationsdatei in YAML. Es sind keine Programmierkenntnisse (Ruby, Python usw.) erforderlich. ――Es ist einfacher als ein Koch, einen Server mit mehreren bis Dutzenden von Einheiten zu bauen.
Ab Ansible 1.9 wurde 'werden' hinzugefügt, um mit anderen Benutzerberechtigungen (z. B. Root-Berechtigungen) ausgeführt zu werden.
Wenn Sie einen Server verwalten möchten, auf den Root keinen direkten Zugriff hat, sollten Sie sich als allgemeiner Benutzer anmelden und dann "sudo su-" verwenden, um Root zu werden. Wenn Sie einen Befehl mit "werden: ture" in Ansible ausführen und wenn Sie einen Befehl direkt über die Befehlszeile nach "sudo su-" ausführen, kann das Ausführungsergebnis des Befehls unterschiedlich sein, da der Pfad der Umgebungsvariablen unterschiedlich ist. Ja, du musst vorsichtig sein.
Bis jetzt habe ich es verwendet, ohne diesem Bereich viel Aufmerksamkeit zu schenken, daher schlug der Befehl, der durch direktes Ausführen des Befehls bestätigt wurde, manchmal in PlayBook fehl, sodass ich ein kleines Problem hatte, also über "Werden" und die Umgebungsvariable PATH. Ich habe es noch einmal überprüft.
geworden: wahr
≠ sudo su -
".Ich habe die Probleme auf GitHub, der offiziellen Website von Ansible, untersucht.
Only one method may be enabled per host
Methods cannot be chained. You cannot use
sudo /bin/su -
to become a user, you need to have privileges to run the command as that user in sudo or be able to su directly to it.
Freie Übersetzung:
sudo
undsu
können nicht gleichzeitig verwendet werden. Wenn Sie alsosudo su -
verwenden möchten, führen Sie den Befehl direkt aus.
Ansible GitHub issues Es scheint, dass die Diskussion in der Oberfamilie nicht zu einem Abschluss gekommen ist (der Status bleibt offen). GitHub issues#12686
Zuerst untersuchte ich, wie der PFAD aussehen würde. Umfrageumgebung: Amazon Linux AMI 2016.03
remote_user: ec2-user
1. become: false(ec2-user) /usr/local/bin:/bin:/usr/bin:/opt/aws/bin 2. become: true(root) /sbin:/bin:/usr/sbin:/usr/bin 3. lookup('pipe', 'echo $PATH') /usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin: /sbin:/opt/aws/bin:/home/ec2-user/.local/bin:/home/ec2-user/bin 4. lookup('env', 'PATH') /usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin: /sbin:/opt/aws/bin:/home/ec2-user/.local/bin:/home/ec2-user/bin 5. ec2-user /usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin: /sbin:/opt/aws/bin:/home/ec2-user/.local/bin:/home/ec2-user/bin 6. sudo su - /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin: /opt/aws/bin:/root/bin 7. sudo su /sbin:/bin:/usr/sbin:/usr/bin:/opt/aws/bin
Es ist herrlich unzusammenhängend ^^;
Eine Google-Suche zeigt Ihnen, wie Sie .bashrc und .bash_profile mit Befehl und Shell laden. Dies macht es jedoch schwierig, die Gleichwertigkeit zu gewährleisten. Daher werde ich vorstellen, wie der Pfad in der Umgebung festgelegt wird.
Lassen Sie uns zuerst sehen, was passiert, wenn nichts getan wird.
playbook.yml
- hosts: all
remote_user: ec2-user
tasks:
- command: echo $PATH
register: become_path
become: true
changed_when: False
- name: become
debug: var=become_path.stdout
- command: echo $PATH
register: not_become_path
changed_when: False
- name: not become
debug: var=not_become_path.stdout
Ich werde es versuchen.
$ ansible-playbook env_path.yml
PLAY [all] *********************************************************************
TASK [setup] *******************************************************************
ok: [target03]
TASK [command] *****************************************************************
ok: [target03]
TASK [become] ******************************************************************
ok: [target03] => {
"become_path.stdout": "/sbin:/bin:/usr/sbin:/usr/bin"
}
TASK [command] *****************************************************************
ok: [target03]
TASK [not become] **************************************************************
ok: [target03] => {
"not_become_path.stdout": "/usr/local/bin:/bin:/usr/bin:/opt/aws/bin"
}
PLAY RECAP *********************************************************************
target03 : ok=5 changed=0 unreachable=0 failed=0
Allgemeiner Benutzerpfad: / usr / local / bin: / bin: / usr / bin: / opt / aws / bin
root PATH: / sbin: / bin: / usr / sbin: / usr / bin
Es ist geworden. Es scheint, dass Sie nicht angemeldet sind.
Wenn Sie Lookup verwenden, ist dies wie folgt.
playbook.yml
---
- hosts: all
remote_user: ec2-user
vars:
pipe_path: "{{ lookup('pipe', 'echo $PATH') }}"
env_path: "{{ lookup('env', 'PATH') }}"
tasks:
- name: pipe path
debug: msg={{ pipe_path }}
- name: env path
debug: msg={{ env_path }}
Das Ausführungsergebnis bei Verwendung der Suche ist wie folgt.
$ ansible-playbook playbook.yml
PLAY [all] *********************************************************************
TASK [setup] *******************************************************************
ok: [target01]
TASK [pipe path]] **************************************************************
ok: [target01] => {
"msg": "/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/aws/bin:/home/ec2-user/.local/bin:/home/ec2-user/bin"
}
TASK [env path]] ***************************************************************
ok: [target01] => {
"msg": "/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/aws/bin:/home/ec2-user/.local/bin:/home/ec2-user/bin"
}
PLAY RECAP *********************************************************************
target01 : ok=3 changed=0 unreachable=0 failed=0
Dies war im Zustand der Anmeldung als ec2-Benutzer.
Versuchen Sie, den Pfad in der Umgebung festzulegen.
Machen Sie im Voraus sudo su -
und aktivieren Sie echo $ PATH
.
$ sudo su -
# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/aws/bin:/root/bin
Das PlayBook sieht folgendermaßen aus:
playbook.yml
- hosts: all
remote_user: ec2-user
environment:
PATH: "/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/aws/bin:/root/bin"
tasks:
- command: echo $PATH
register: become_path
become: true
changed_when: False
- name: become
debug: var=become_path.stdout
- command: echo $PATH
register: not_become_path
changed_when: False
- name: not become
debug: var=not_become_path.stdout
Lass es uns laufen.
$ ansible-playbook playbook.yml
PLAY [all] *********************************************************************
TASK [setup] *******************************************************************
ok: [target01]
TASK [command] *****************************************************************
ok: [target01]
TASK [become] ******************************************************************
ok: [target01] => {
"become_path.stdout": "/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/aws/bin:/root/bin"
}
TASK [command] *****************************************************************
ok: [target01]
TASK [not become] **************************************************************
ok: [target01] => {
"not_become_path.stdout": "/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/aws/bin:/root/bin"
}
PLAY RECAP *********************************************************************
target01 : ok=5 changed=0 unreachable=0 failed=0
Da wir für das PlayBook "environment:" festlegen, ist dies der festgelegte Pfad, sowohl wenn er "true" wird als auch wenn dies nicht der Fall ist.
Übrigens kann "Umgebung:" auch in die Aufgabe geschrieben werden. Wenn Sie es für jede Aufgabe festlegen möchten, müssen Sie es für jede Aufgabe angeben. Das PlayBook sieht folgendermaßen aus:
playbook.yml
- hosts: all
remote_user: ec2-user
tasks:
- command: echo $PATH
register: become_path
become: true
changed_when: False
environment:
PATH: "/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/aws/bin:/root/bin"
- name: become
debug: var=become_path.stdout
- command: echo $PATH
register: not_become_path
changed_when: False
environment:
PATH: "/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/aws/bin:/root/bin"
- name: not become
debug: var=not_become_path.stdout
Das Ausführungsergebnis ist das gleiche wie wenn "Umgebung:" für das gesamte PlayBook festgelegt ist.
Der für PlayBook und Task festgelegte Bereich von "Umgebung:" ist der festgelegte Bereich. Wenn Sie es beispielsweise für ein PlayBook festlegen, wirkt es sich nicht auf ein anderes PlayBook aus. Wenn Sie die Befehle selbst auflisten und mit / bin / sh ausführen, müssen Sie auch einen Befehl schreiben, um den festgelegten Pfad wiederherzustellen. Das PlayBook von Ansible ist jedoch praktisch, da dies automatisch erfolgt. ..
Dieses Mal habe ich vorgestellt, wie der Pfad mithilfe der Umgebung festgelegt wird.
Die PATH-Einstellungsmethode ist wie beschrieben, aber PATH-abhängige PlayBooks können in unerwarteten Fallstricken stecken bleiben. Wenn Sie die Shell oder das Befehlsmodul in PlayBook verwenden, ist es meiner Meinung nach sicher, sich das Schreiben mit dem vollständigen Pfad zur Gewohnheit zu machen.
Kann in einer Falle stecken bleiben (PATH-abhängig)
- command: cmd
Sicheres Schreiben
- command: /usr/local/bin/cmd
Wenn Sie ein Konfigurationsmanagement-Tool wie Ansible verwenden, sollten Sie berücksichtigen, dass es nicht nur für den Betrieb, sondern auch unter Berücksichtigung der Wartbarkeit und Robustheit betrieben werden kann.
Recommended Posts