Как отфильтровать сбор фактов внутри playbook?

Я работаю над ролью, которая должна собрать только один факт.

Производительность вызывает беспокойство, и я знаю, что сбор фактов требует много времени.

Я ищу способ отфильтровать gather_facts внутри playbook, это позволит мне собрать только необходимые факты.

Это возможно с помощью основного модуля настройки:

ansible -m setup -a 'filter=ansible_hostname' my_host

10.200.0.127 | success >> {
    "ansible_facts": {
        "ansible_hostname": "my_host"
    },
    "changed": false
}

Можно ли использовать эту функцию внутри playbook? Что-то вроде этого?

- hosts: all
  sudo: yes
  gather_facts: True
    filter: "filter=ansible_*"

PS: приведенный выше код вызывает синтаксическое исключение.

EDIT 1: если кому-то нужно получить имя хоста, есть еще одна полезная переменная inventory_hostname.


person Bernardo Vale    schedule 27.12.2015    source источник


Ответы (4)


Да, это возможно, но не при сборе фактов по умолчанию. Установив gather_facts в true, вы просто вызываете модуль установки как самую первую задачу игры. Таким образом, у вас нет возможности параметризовать вызов модуля setup.

Но вы можете отключить поведение по умолчанию и вызвать настройку самостоятельно с помощью параметра фильтра.

- hosts: all
  sudo: yes
  gather_facts: False
  tasks:
   - setup:
       filter: ansible_*

Поскольку вы работаете над ролью и, возможно, не хотите, чтобы этот установочный вызов был в вашей роли, вы можете использовать pre_tasks.

- hosts: all
  sudo: yes
  gather_facts: False
  pre_tasks:
   - setup:
       filter: ansible_*
  roles:
   - your_role_here
person udondan    schedule 28.12.2015

Способ Ansible в верхней части playbook (дополнительный способ):

----
- hosts: web
  gather_facts: True
  gather_subset:
    - network
    - virtual

Отладка переменных с помощью:

  - name: Print some debug information 
    vars: 
      msg: |
          Module Variables ("vars"):
          --------------------------------
          {{ vars | to_nice_json }} 

          Environment Variables ("environment"):
          --------------------------------
          {{ environment | to_nice_json }} 

          GROUP NAMES Variables ("group_names"):
          --------------------------------
          {{ group_names | to_nice_json }}

          GROUPS Variables ("groups"):
          --------------------------------
          {{ groups | to_nice_json }}

          HOST Variables ("hostvars"):
          --------------------------------
          {{ hostvars | to_nice_json }} 

    debug: 
      msg: "{{ msg.split('\n') }}"       
    tags: debug_info
person imjoseangel    schedule 12.07.2018
comment
Мне нужен был этот способ, чтобы обновить мои существующие плейбуки с минимальными изменениями. Используйте команду, подобную этой, чтобы получить все возможные подмножества: ansible remote1 -i myhosts -m setup -a 'gather_subset=' - person ghitesh; 09.01.2019

После того, как этот вопрос был задан и получен ответ, Ansible 2.1 добавила параметр gather_subset в модуль настройки, поэтому теперь можно использовать синтаксис !facter,!ohai,network, описанный в документации, а не фильтр регулярных выражений:

- hosts: all
  sudo: yes
  gather_facts: False
  pre_tasks:
   - setup:
       gather_subset: !facter,!ohai,network
  roles:
   - your_role_here
person ZachP    schedule 26.07.2017

Если все, что вас интересует, это имя хоста каждого хоста, то простое выполнение чего-то подобного должно сделать то, что вам нужно:

- hosts: all
  gather_facts: false
  tasks:

    - name: Get hostname
      command: /bin/hostname
      register: my_hostname

    - debug: var=my_hostname

Если вас интересует какой-то другой факт, то просто укажите соответствующую команду и обратитесь к факту через зарегистрированную переменную.

person Bruce P    schedule 28.12.2015