Ansible-сбор фактов с фильтром внутри Playbook
Я работаю над ролью, которая должна собрать только один факт.
производительность это проблема, и я знаю, что сбор фактов занимает много времени.
Я ищу какой-то способ фильтрации gather_facts
внутри книги, это позволит мне собрать только необходимые факты.
это возможно с помощью модуля Setup core:
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: приведенный выше код бросает исключение синтаксис.
правка 1: если кому-то нужно получить имя хоста есть еще одна полезная переменная inventory_hostname.
4 ответов
Да, это возможно, но не в поведении по умолчанию сбора фактов. Установив gather_facts
to true
просто называет модуль установки как самое первое задание игры. Таким образом, у вас нет никакого способа параметризовать setup
вызов модуля.
но вы можете отключить поведение по умолчанию и вызвать setup самостоятельно с параметром filter.
- 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
после того, как этот вопрос был задан и ответил: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
Если все, что вас интересует, это имя хоста каждого хоста, то просто делать что-то вроде этого должно делать то, что вам нужно:
- hosts: all
gather_facts: false
tasks:
- name: Get hostname
command: /bin/hostname
register: my_hostname
- debug: var=my_hostname
Если вас интересует какой-то другой факт, просто укажите соответствующую команду и обратитесь к факту через зарегистрированную переменную.
Ansible путь в верхней части playbook (дополнительный способ):
----
- hosts: web
gather_facts: True
gather_subset:
- network
- virtual
отладка vars с помощью:
- 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