2 votes

Filtre Ansibe Jinja2

Je veux appliquer un filtre au fichier journal suivant. Mais il me manque toujours quelque chose

task.yml

-   ansible_loop_var: item
    changed: false
    failed: true
    invocation:
        module_args:
            policy_package: Package1
            version: null
            wait_for_task: true
            wait_for_task_timeout: 30
    item: PackageItem1
    msg: Task Verify policy operation with task id 01234567-89ab-cdef-a422-xxxxxxxxx
        failed. Look at the logs for more details
-   ansible_loop_var: item
    changed: false
    failed: true
    invocation:
        module_args:
            policy_package: Package2
            version: null
            wait_for_task: true
            wait_for_task_timeout: 30
    item: PackageItem2
    msg: Task Verify policy operation with task id 01234567-89ab-cdef-a6c4-xxxxxxxx
        failed. Look at the logs for more details

Voici mon guide de jeu filter.yml

---
- name: sftp-domain
  hosts: check_point
  connection: httpapi
  gather_facts: False
  vars_files:
    - 'credentials/my_var.yml'
    - 'credentials/login.yml'

  tasks:
  - name: set-details
    set_fact:
      filter: "{{ lookup('file', 'tmp/task.yml') }}"

  - name: create list to loop through
    set_fact:
      new_list: "{{ filter | map(attribute='msg') | flatten }}"

  - name: copy-file-to-log
    local_action:
      module: copy
      content: "{{  new_list | to_nice_yaml }}"
      dest: tmp/task2.yml

Je reçois un message d'erreur disant

PLAY [sftp-domain] *******************************************************************************************************************************************

TASK [set-details] *******************************************************************************************************************************************
ok: [checkpoint]

TASK [create list to loop through] ***************************************************************************************************************************
fatal: [checkpoint]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'unicode object' has no attribute 'msg'\n\nThe error appears to be in '/home/tdeveu0/project/fwp_automation/filter.yml': line 15, column 5, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n  - name: create list to loop through\n    ^ here\n"}

Voici en fait le résultat que je veux après avoir appliqué le filtre

- msg: Task Verify policy operation with task id 01234567-89ab-cdef-a6c4-xxxxxxxx
        failed. Look at the logs for more details

- msg: Task Verify policy operation with task id 01234567-89ab-cdef-a422-xxxxxxxxx
        failed. Look at the logs for more details

Je veux obtenir seulement la liste de tous les 'msg'.

4voto

Vladimir Botka Points 10170

Utilisez le filtre de_yaml

  - name: set-details
    set_fact:
      filter: "{{ lookup('file', 'tmp/task.yml')|from_yaml }}"

Prenons un fichier simplifié pour montrer le problème, par ex.

shell> cat task.yml
- a: 1
  b: 2
- a: 3
  b: 4

Lorsque vous lisez le fichier dans la variable, le résultat est AnsibleUnsafeText, pas une liste.

    - set_fact:
        filter: "{{ lookup('file', 'task.yml') }}"
    - debug:
        msg: "{{ filter|type_debug }}"
    - debug:
        var: filter.0

donne

  msg: AnsibleUnsafeText
  filter.0: '-'

Le premier élément du texte est le tiret '-'.


Utiliser un filtre de_yaml pour obtenir la liste

    - set_fact:
        filter: "{{ lookup('file', 'task.yml')|from_yaml }}"
    - debug:
        msg: "{{ filter|type_debug }}"
    - debug:
        var: filter.0

donne

  msg: list
  filter.0:
    a: 1
    b: 2

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X