[PYTHON] Stellen Sie PATH in der Umgebung von Ansible auf "sudo su-" ein

■ Was ist Ansible?

■ Einführung

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.

Stolperpunkt

Ansible Honkes Ansicht

Ich habe die Probleme auf GitHub, der offiziellen Website von Ansible, untersucht.

Offizielle Ansible-Website (Link)

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 und su können nicht gleichzeitig verwendet werden. Wenn Sie also sudo 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

■ Betriebsüberprüfung

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

■ Stellen Sie den Pfad auf "sudo su-" ein.

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.

** Vor dem Einstellen angeben **

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, PATH in der Umgebung einzustellen **

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.

** Umgebungsumfang **

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

■ Fazit

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.

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

Stellen Sie PATH in der Umgebung von Ansible auf "sudo su-" ein
So richten Sie eine Python-Umgebung mit pyenv ein
So richten Sie SVM mit Optuna ein
So stellen Sie xg boost mit Optuna ein
So richten Sie eine zufällige Gesamtstruktur mit Optuna ein
So richten Sie eine zufällige Gesamtstruktur mit Optuna ein
Verfahren zum Einstellen des Wasserstoffs des Atoms (virtuelle Umgebung)