Как обернуть длинную линию повторного паттерна в Ansible playbook? - PullRequest
1 голос
/ 25 марта 2020

Написание кода для проверки ipaddress, поскольку ipaddr зависит от python -netaddr, мы не можем гарантировать, что целевой ansible сервер установил его. Это из "поваренной книги регулярных выражений", длинная, но хорошо работающая.

- name: validate cluster -> topology_source_ip
  fail:
    msg: "topology_source ({{topology_source_ip}}) is not a valid IP address."
  when:
    - topology_source_ip is not regex('(?i)^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}?(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$')
    - topology_source_ip is not regex('(?i)^(?:(?:[A-F0-9]{1,4}:){7}[A-F0-9]{1,4}|(?=(?:[A-F0-9]{0,4}:){0,7}?[A-F0-9]{0,4}$)(([0-9A-F]{1,4}:){1,7}|:)((:[0-9A-F]{1,4}){1,7}|:)?|(?:[A-F0-9]{1,4}:){7}:|:(:[A-F0-9]{1,4}){7})$')

Я хочу разбить длинные строки на "стандартные" строки (<= 80 символов). Я гуглил, но не могу найти решение для упаковки длинных повторных паттернов в ansible playbook. Любая идея? </p>

В Python это может быть:

r=re.compile(
    r'^(?:(?:[A-F0-9]{1,4}:){7}[A-F0-9]{1,4}|(?=(?:[A-F0-9]{0,4}:){0,7}?'
    r'[A-F0-9]{0,4}$)(([0-9A-F]{1,4}:){1,7}|:)((:[0-9A-F]{1,4}){1,7}|:)?'
    r'|(?:[A-F0-9]{1,4}:){7}:|:(:[A-F0-9]{1,4}){7})$'
    ,re.IGNORECASE
)
r.match("c10d:100::24")

1 Ответ

0 голосов
/ 25 марта 2020

Q: "Решение для обертывания длинного повторного шаблона."

A: Попробуйте объединить строки. Например,

  vars:
    regex1: '{{ "(?i)^(?:(?:25[0-5]|" +
                "2[0-4][0-9]|" +
                "[01]?[0-9][0-9]?)\.){3}?(?:25[0-5]|"  +
                "2[0-4][0-9]|" +
                "[01]?[0-9][0-9]?)$" }}'
    regex2: '{{ "(?i)^(?:(?:[A-F0-9]{1,4}:){7}[A-F0-9]{1,4}|" +
                "(?=(?:[A-F0-9]{0,4}:){0,7}?[A-F0-9]{0,4}$)(([0-9A-F]{1,4}:){1,7}|" +
                ":)((:[0-9A-F]{1,4}){1,7}|" +
                ":)?|(?:[A-F0-9]{1,4}:){7}:|" +
                ":(:[A-F0-9]{1,4}){7})$" }}'
  tasks:
    - name: validate cluster -> topology_source_ip
      fail:
        msg: "topology_source ({{topology_source_ip}}) is not a valid IP address."
      when:
        - topology_source_ip is not regex(regex1)
        - topology_source_ip is not regex(regex2)

Q: "ipaddr зависит от python -netaddr, мы не можем гарантировать, что целевой ansible сервер установил его."

A: ipaddr требует python-netaddr на контроллере, а не на удаленном хосте. Задание ниже дает тот же результат

  tasks:
    - name: validate cluster -> topology_source_ip
      fail:
        msg: "topology_source ({{topology_source_ip}}) is not a valid IP address."
      when: not topology_source_ip|ipaddr
...