2015-07-09 3 views
29

Я пытаюсь научиться использовать Ansible факты в качестве переменных, и я не понимаю. Когда я бегу ...Необязательная переменная даты

$ ansible localhost -m setup 

... в нем перечислены все факты моей системы. Я выбрал один случайным образом, чтобы попытаться использовать его, ansible_facts.ansible_date_time.date, но я не могу понять, КАК его использовать. Когда я бегу ...

$ 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 
} 

Итак, это ОЧЕНЬ там. Но когда я бегу ...

$ 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 

Что я не получу здесь? Как использовать факты в качестве переменных?

ответ

52

Команда ansible localhost -m setup в основном говорит «запустите установочный модуль против локального хоста», а модуль настройки собирает факты, которые вы видите на выходе.

При запуске команды echo эти факты не существуют, поскольку модуль установки не был запущен. Лучший способ тестирования таких вещей, как это было бы использовать анзибль-сборник пьес для запуска пьес, который выглядит примерно так:

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

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

Потому что это работает как PlayBook факты для локального хоста собираются перед задачи выполняются. Выход выше PlayBook будет что-то вроде этого:

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

поиска модуля анзибля отлично работает для меня. YML является:

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

Вы можете заменить любую команду с датой, чтобы получить результат команды.

2

Обратите внимание, что команда ansible не собирает факты, но команда ansible-playbook делает. При запуске ansible -m setup, модуль установки выполняет запуск коллекции фактов, поэтому вы получаете факты, но работает ansible -m command. Поэтому факты недоступны. Вот почему другие ответы включают файлы YAML в Playbook и показывают, что поиск работает.