web-dev-qa-db-fra.com

Comment filtrer la collecte des faits dans un playbook?

Je travaille sur un rôle qui n'a besoin que de rassembler un seul fait.

La performance est une préoccupation et je sais que la collecte des faits prend du temps.

Je cherche un moyen de filtrer gather_facts à l'intérieur d'un playbook, cela me permettra de ne rassembler que les faits requis.

Ceci est possible en utilisant le module de base de configuration:

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

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

Est-il possible d'utiliser cette fonctionnalité dans le playbook? Quelque chose comme ça?

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

PS: Le code ci-dessus lève une exception de syntaxe.

EDIT 1 : Si quelqu'un a besoin d'obtenir le nom d'hôte, il y a aussi une autre variable utile inventaire_hôte .

13
Bernardo Vale

Oui, c'est possible, mais pas dans le comportement par défaut de collecte des faits. Après avoir défini gather_facts à true appelle simplement le module d'installation comme toute première tâche du jeu. De cette façon, vous n'avez aucun moyen de paramétrer l'appel du module setup.

Mais vous pouvez désactiver le comportement par défaut et appeler vous-même la configuration avec le paramètre de filtre.

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

Étant donné que vous travaillez sur un rôle et que vous ne souhaitez peut-être pas que cet appel de configuration figure dans votre rôle, vous pouvez utiliser les pré_tâches.

- hosts: all
  Sudo: yes
  gather_facts: False
  pre_tasks:
   - setup:
       filter: ansible_*
  roles:
   - your_role_here
22
udondan

La voie Ansible en haut du playbook (voie supplémentaire):

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

Déboguer les vars avec:

  - 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
10
imjoseangel

Après avoir posé cette question et répondu, Ansible 2.1 a ajouté le gather_subset option au module d'installation, il est donc désormais possible d'utiliser le !facter,!ohai,network syntaxe décrite dans la documentation plutôt qu'un filtre d'expression régulière:

- hosts: all
  Sudo: yes
  gather_facts: False
  pre_tasks:
   - setup:
       gather_subset: !facter,!ohai,network
  roles:
   - your_role_here
8
ZachP

Si tout ce qui vous intéresse est le nom d'hôte de chaque hôte, faire simplement quelque chose comme ça devrait faire ce dont vous avez besoin:

- hosts: all
  gather_facts: false
  tasks:

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

    - debug: var=my_hostname

Si c'est un autre fait qui vous intéresse, spécifiez simplement la commande appropriée et référez-vous au fait via la variable enregistrée.

2
Bruce P