Ansible: Как найти вхождение слова в переменную? - PullRequest
1 голос
/ 22 апреля 2020

Я искал везде, как найти вхождение слова в переменную для Ansible, но не нашел. Самым близким способом, который я нашел, является поиск любого «слова» в переменной, но он не учитывает количество слов и возвращает только логическое значение. Вот моя пьеса:

---

- hosts: localhost
  name: Test Variable Manipulation and Searching
  gather_facts: false
  tasks:
    - name: read the Output File
      set_fact: 
        output: "{{lookup('file', 'inputFile.txt') }}"

    - name: debug the input file
      debug:
        msg: "{{output.stdout}}"

    - name: find word 'down'
      debug:
        msg: "Found the word 'down' in the Variables/Output"
      when: output.stdout is search('down')  

Это содержимое inputFile.txt:

{"failed": false, "changed": false, "ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "stdout_lines": [["Gi1/0/14                       down           down"]], "stdout": ["Gi1/0/14                       down           down"]}

Это результат вышеприведенной пьесы: The playbook result

Можно ли каким-то образом настроить этот сценарий для достижения моих целей? Мне нужно посчитать, сколько слов «вниз» из переменной.

Я попытался использовать regex_findall, как показано ниже:

      - name: check the down Status if EQUAL to 2
      block:
        - name: check the down Status if EQUAL to 2
          debug:
            msg: "Both Status is down. Check is clear"
          when: (output.stdout|regex_findall('down')|length) == 2
      rescue:
        - debug:
            msg: "Unable to use the regex_findall to desResult" 

Это нормально, если использовать в отношении нормальной строки, но я получу ошибку шаблонов для этого случая, и я не знаю, почему:

fatal: [localhost]: FAILED! => {"msg": "The conditional check '(output.stdout|regex_findall('down')|length) == 2' failed. The error was: Unexpected templating type error occurred on ({% if (output.stdout|regex_findall('down')|length) == 2 %} True {% else %} False {% endif %}): expected string or bytes-like object\n\nThe error appears to be in 'switchCheck.yml': line 17, column 11, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n      block:\n        - name: check the down Status if EQUAL to 2\n          ^ here\n"}

1 Ответ

1 голос
/ 22 апреля 2020
$ cat test.yml
- hosts: localhost
  name: Test Variable Manipulation and Searching
  gather_facts: false
  tasks:
    - name: read the Output File
      set_fact:
        output: "{{lookup('file', 'inputFile.txt') }}"

    - name: debug the input file
      debug:
        msg: "{{ output | regex_findall('down') | length }}"
      when: (output | regex_findall('down') | length) == 3

$ cat inputFile.txt
Gi1/0/14 down down go down

output - переменная, у нее нет атрибута stdout, поэтому просто {{output}}, если у вас есть дополнительные вопросы, пожалуйста, дайте мне знать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...