J'essaie d'apprendre à utiliser les faits Ansible comme variables, et je ne les comprends pas. Quand je cours ...
$ ansible localhost -m setup
... il énumère tous les faits de mon système. J'en ai choisi un au hasard pour essayer de l'utiliser, ansible_facts.ansible_date_time.date, mais je ne peux pas comprendre COMMENT l'utiliser. Quand je cours ...
$ 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
}
Donc, c'est clairement là. Mais quand je cours ...
$ 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
Qu'est-ce que je n'arrive pas ici? Comment utiliser les faits comme variables?
La commande ansible localhost -m setup
indique essentiellement "exécutez le module d'installation contre localhost", et le module d'installation rassemble les faits que vous voyez dans le résultat.
Lorsque vous exécutez la commande echo
, ces informations n'existent pas car le module d'installation n'a pas été exécuté. Une meilleure méthode pour tester des choses comme celle-ci consisterait à utiliser ansible-playbook pour exécuter un livre de lecture ressemblant à ceci:
- hosts: localhost
tasks:
- debug: var=ansible_date_time
- debug: msg="the current date is {{ ansible_date_time.date }}"
Parce que cela fonctionne comme un livre de jeu, les informations pour localhost sont rassemblées avant l'exécution des tâches. La sortie du livre de jeu ci-dessus ressemblera à ceci:
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
Le module de recherche de ansible fonctionne bien pour moi. Le yml est:
- hosts: test
vars:
time: "{{ lookup('pipe', 'date -d \"1 day ago\" +\"%Y%m%d\"') }}"
Vous pouvez remplacer n'importe quelle commande par la date pour obtenir le résultat de la commande.
Notez que la commande ansible
ne collecte pas de faits, mais la commande ansible-playbook
le fait. Lors de l'exécution de ansible -m setup
, le module d'installation exécute la collection de faits afin que vous obteniez les faits, mais l'exécution de ansible -m command
ne le fait pas. Par conséquent, les faits ne sont pas disponibles. C'est pourquoi les autres réponses incluent les fichiers YAML de playbook et indiquent que la recherche fonctionne.
L'option de filtrage ne filtre que la sous-clé de premier niveau sous ansible_facts