Как динамически устанавливать хосты новых ролей из предыдущих ролей (set_fact) [duplicate]

\\(?\d{3}\\)?([\-\s\.])?\d{3}\1?\d{4}

Это подтвердит любой номер телефона с переменным форматом:

\\(?\d{3}\\)? находит 3 цифры, заключенные в скобки или нет.

([\-\s\.])? находит любой из этих разделителей символы или нет

\d{3} находит 3 цифры

\1 использует первый согласованный разделитель - это гарантирует, что разделители будут одинаковыми. Таким образом, (000) 999-5555 не будет проверяться здесь, потому что есть разделитель пробела и тире, поэтому просто удалите «\ 1» и замените суб-шаблон разделителя (это также будет проверять нестандартные форматы). Тем не менее, вы должны указывать формат для ввода пользователем.

\d{4} находит 4 цифры

Проверяет:

  • (000) 999 5555
  • (000) -999-5555
  • (000) .999.5555
  • (000) 999-5555
  • (000) 9995555
  • 000 999 5555
  • 000-999-5555
  • 000.999.5555
  • 0009995555

BTW это для JavaScript, следовательно, для двойного экранирования.

2
задан Shark 10 February 2015 в 21:17
поделиться

2 ответа

Это невозможно сделать в файле инвентаря. Я думаю, что set_fact - ваш лучший выбор для программной сборки инвентаря. Это просто.

---
- hosts: all
  tasks:
    - add_host:
        name: "host{{ item }}"
        ansible_ssh_host: "127.0.0.1"
        ansible_connection: "local"
        group: "new"
        id: "{{ item }}"
      with_sequence: count=3
      delegate_to: localhost
      run_once: yes
- hosts: new
  tasks:
    - debug:
        msg: "{{ id }}"

Если я правильно помню, возможности Jinja были удалены из любого места, которое они не должны были быть, то есть вне кавычек , фигурные скобки, специальные случаи, такие как when: в файлах YML.

Когда я говорю программно, мы говорим о Ansible .. одном из последних кандидатов на земле для сценариев общего назначения. Динамические сценарии инвентаризации - это лучший подход к таким проблемам, если мы не говорим о трех серверах точно.

Самый простой сценарий инвентаризации для выполнения этого будет (в вашем hosts каталоге или указанном -i:

#!/usr/bin/env python
import json
inv = {}
for i in range(3):
  inv[i] = {"hosts":["host%s" % i],"vars":{"id":i,"ansible_ssh_host":"127.0.0.1", "ansible_connection":"local"}}
print json.dumps(inv)

Опять же, я боюсь, что нет ничего «красивого», как то, что вы ищете. Если ваш прецедент становится более сложным, тогда set_fact, set_host и group_by могут пригодиться, или сценарий инвентаризации, или group_vars (в настоящее время я использую group_vars файлы для номера сервера.)

5
ответ дан nik.shornikov 15 August 2018 в 21:08
поделиться

Это лучше всего использовать с помощью функций Ansible Dynamic Inventory . См. Разработка динамических источников ресурсов .

Это означает запись сценария, который возвращает ваше имя хоста в формате JSON.

1
ответ дан David Roussel 15 August 2018 в 21:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: