0

Ich weiß über Ansible-Umgebung: Befehl oben im Playbook, aber ich glaube nicht, dass es für mich funktionieren wird, da ich den Variablenwert vor der Ausführung des Playbooks nicht kenne. Ich versuche, Paketversionen und PHP-Module abzurufen und sie in einer Datei zu protokollieren. Ich möchte Regex verwenden, um die Version zu erfassen und in einer Umgebungsvariablen zu speichern. Dann möchte ich diese Variable mit dem Wert dieser Variablen in eine Umgebungsdatei mit einem Shell-Befehl schreiben. Ich möchte auch ein Array aus der Umgebung ziehen und durchlaufen. Ansible scheint die Shell-Umgebung nicht beizubehalten und die Umgebungsvariable wird zwischen den Befehlen gelöscht. Das ist einfach in Bash. Ist das in Ansible möglich? Ich versuche:Ansible Set Dynamische Umgebungsvariablen

--- 
- hosts: all 
    become: yes 
    vars: 
     site_variables: 
      code_directory: /home/ 
     dependency_versions: 
      WGET_VERSION: placeholder 
      PHP_MODULES: placeholder 

    tasks: 
    - name: Retrieve Environment 
     shell: export WGET_VERSION=$(wget --version | grep -o 'Wget [0-9]*.[0-9]*\+') 
     shell: export PHP_MODULES=$(php -m) 
     shell: echo "export {{ item }}={{ lookup('env', item) }}" >> {{ site_variables.code_directory }}/.env.log 
     with_items: 
     - WGET_VERSION 


    - name: Write PHP Modules Out 
     shell: export PHP_MODULES=$(php -m) 
     shell: export PHP_MODULES=$(echo {{ lookup('env', 'PHP_MODULES') }} | sed 's/\[PHP Modules\]//g') 
     shell: export PHP_MODULES=$(echo {{ lookup('env', 'PHP_MODULES') }} | sed 's/\[Zend Modules\]//g') 
     shell: export PHP_MODULES=({{ lookup('env', 'PHP_MODULES') }}) 
     shell: echo "# - {{ item.0 }}" >> {{ site_variables.code_directory }}/.env.log 
     with_items: 
     - "{{ lookup('env', 'PHP_MODULES') }}" 

Antwort

2

Hier ist viel los.

Zuerst lookup läuft immer auf dem ansible Steuer Host, während das Skript, das Sie das shell Modul übergeben wird auf dem Remote-Server ausgeführt wird. So werden Sie nie eine entfernte Umgebungsvariable unter Verwendung lookup erhalten können.

Einzelheiten: https://docs.ansible.com/ansible/playbooks_lookups.html

Zweitens Umgebungsvariablen propagieren nicht von einem Kind zu Eltern. Wenn Sie ein Skript, das dies tut ...

export MYVARIABLE=foo 

... und Sie führen das Skript, wird Ihre aktuelle Umgebung nicht plötzlich eine Variable mit dem Namen MYVARIABLE. Dies gilt sowohl für Prozesse, die von Ansible erzeugt werden, als auch für Prozesse, die von Ihrer Shell erzeugt werden.

Wenn Sie eine ansible Variable einstellen möchten, sollten Sie die register Schlüsselwort den Wert zu erhalten:

- hosts: localhost 
    gather_facts: false 
    tasks: 
    - name: get wget version 
     command: wget --version 
     register: wget_version_raw 

    - name: extract wget version 
     set_fact: 
     wget_version: "{{ wget_version_raw.stdout_lines[0].split()[2] }}" 

    - name: show wget version 
     debug: 
     msg: "wget version is: {{ wget_version }}" 
+0

nicht sicher, ob ich Sie ganz bin nach. Ich ssh'ed in den Remote-Host und setze WGET_VERSION manuell ... also sagen wir WGET_VERSION = 1.1.1. {{lookup ('env', item)}} hat tatsächlich die Umgebungsvariable aus dem remote_host gezogen, den ich manuell eingerichtet habe (1.1.1) und ihn entsprechend protokolliert habe. Es hat den neuen Wert nicht nur über Ansible in der Shell gesetzt: export WGET_VERSION = $ (wget --version | grep -o 'Wget [0-9] *. [0-9] * \ +'). Ich muss wahrscheinlich nur darüber nachdenken, da ich definitiv am Ende alles durch ein Array füttern muss. Vielleicht ist Ansible einfach nicht der richtige Weg dafür. – Nabsta

+0

Vielen Dank für Ihren Rat! Ich bin neu bei Ansible und es ist definitiv hilfreich. – Nabsta

+0

Danke nochmal! Ich habe es funktioniert mit set_fact, eine Reihe von parallelen Arrays und entkam Regex-Anweisungen. Es scheint, als wäre in diesem Fall die direkte Bash besser geeignet und sauberer: P. – Nabsta

Verwandte Themen