2015-07-09 17 views
29

Ich versuche zu lernen, wie man Ansible Fakten als Variablen verwendet, und ich verstehe es nicht. Wenn ich renne ...Ansible Datum Variable

$ ansible localhost -m setup 

... es listet alle Fakten meines Systems auf. Ich habe eine zufällig ausgewählt, um es zu benutzen, ansible_facts.ansible_date_time.date, aber ich kann nicht herausfinden, wie ich es benutzen soll. Wenn ich renne ...

$ ansible localhost -m setup -a "filter=ansible_date_time" 
localhost | success >> { 
    "ansible_facts": { 
     "ansible_date_time": { 
      "date": "2015-07-09", 
      "day": "09", 
      "epoch": "1436460014", 
      "hour": "10", 
      "iso8601": "2015-07-09T16:40:14Z", 
      "iso8601_micro": "2015-07-09T16:40:14.795637Z", 
      "minute": "40", 
      "month": "07", 
      "second": "14", 
      "time": "10:40:14", 
      "tz": "MDT", 
      "tz_offset": "-0600", 
      "weekday": "Thursday", 
      "year": "2015" 
     } 
    }, 
    "changed": false 
} 

Also, es ist klar da. Aber wenn ich renne ...

$ ansible localhost -a "echo {{ ansible_facts.ansible_date_time.date }}" 
localhost | FAILED => One or more undefined variables: 'ansible_facts' is undefined 

$ ansible localhost -a "echo {{ ansible_date_time.date }}" 
localhost | FAILED => One or more undefined variables: 'ansible_date_time' is undefined 

$ ansible localhost -a "echo {{ date }}" 
localhost | FAILED => One or more undefined variables: 'date' is undefined 

Was bekomme ich hier nicht? Wie verwende ich Fakten als Variablen?

Antwort

52

Der Befehl ansible localhost -m setup sagt im Grunde "Ausführen des Setup-Moduls gegen localhost", und das Setup-Modul sammelt die Fakten, die Sie in der Ausgabe sehen.

Wenn Sie den Befehl echo ausführen, sind diese Fakten nicht vorhanden, da das Setup-Modul nicht ausgeführt wurde. Eine bessere Methode zum Testen Dingen wie dies wäre ansible-Textbuch zu verwenden, um ein Textbuch zu führen, die etwa wie folgt aussieht:

- hosts: localhost 
    tasks: 
     - debug: var=ansible_date_time 

     - debug: msg="the current date is {{ ansible_date_time.date }}" 

Da dies läuft als Textbuch Fakten für localhost gesammelt werden, bevor die Aufgaben ausgeführt werden. Die Ausgabe des obigen Textbuch wird so etwas wie diese:

PLAY [localhost] ************************************************** 

GATHERING FACTS *************************************************************** 
ok: [localhost] 

TASK: [debug var=ansible_date_time] ******************************************* 
ok: [localhost] => { 
    "ansible_date_time": { 
     "date": "2015-07-09", 
     "day": "09", 
     "epoch": "1436461166", 
     "hour": "16", 
     "iso8601": "2015-07-09T16:59:26Z", 
     "iso8601_micro": "2015-07-09T16:59:26.896629Z", 
     "minute": "59", 
     "month": "07", 
     "second": "26", 
     "time": "16:59:26", 
     "tz": "UTC", 
     "tz_offset": "+0000", 
     "weekday": "Thursday", 
     "year": "2015" 
    } 
} 

TASK: [debug msg="the current date is {{ ansible_date_time.date }}"] ********** 
ok: [localhost] => { 
    "msg": "the current date is 2015-07-09" 
} 

PLAY RECAP ******************************************************************** 
localhost  : ok=3 changed=0 unreachable=0 failed=0 
1

Das Lookup-Modul von ansible funktioniert gut für mich. Die yml ist:

- hosts: test vars: time: "{{ lookup('pipe', 'date -d \"1 day ago\" +\"%Y%m%d\"') }}"

Sie mit Datum, jeden Befehl ersetzen Ergebnis des Befehls zu erhalten.

2

Beachten Sie, dass der Befehl ansible keine Fakten erfasst, aber der Befehl ansible-playbook funktioniert. Wenn Sie ansible -m setup ausführen, passiert das Setup-Modul, die Faktensammlung auszuführen, damit Sie die Fakten erhalten, aber das Ausführen von ansible -m command nicht. Daher sind die Fakten nicht verfügbar. Aus diesem Grund enthalten die anderen Antworten Playbook-YAML-Dateien und zeigen an, dass die Suche funktioniert.

Verwandte Themen