2016-03-22 2 views
2

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

hosts: local 

vars: 
    data_vlan: 10 
    voice_vlan: 20 

    sites: 
    - site1: 
     routers: 
     - hostname: router1 
      loopback0: 192.168.1.1 
      wan_ip: 10.0.0.2 
      lan_ip: 172.16.1.1 

    - site2: 
     routers: 
     - hostname: router1 
      loopback0: 192.168.2.1 
      wan_ip: 10.0.0.4 
      lan_ip: 172.16.2.1 

tasks: 

    - name: Generate router configs 
    template: src=templates/router.j2 dest=scripts/{{ item [1] }}/{{ item[1] }}-{{ item[1] }}.txt 
    with_nested: 
     - "{{ sites }}" 

На данный момент у меня есть пункт [1], что в третий раз в разделе Dest, но в конце концов, я хочу, чтобы быть имя хоста. Итак, scripts/site1/site1-router1.txt и так далее. С помощью этого кода он корректно обрабатывает site1 и site2, но я не могу понять, как добраться до vhost хостов.

Я попытался использовать несколько переменных под with_nested, но просто не могу их получить. Окончательный результат будет:

сайт1, маршрутизатор 1

сайт1, переключатель 1

site1, переключатель г N

site2, маршрутизатор 1

сайт2, переключатель 1

site2 , переключатель N

ответ

1

Во-первых, существует либо концепция ual проблема в вашем YAML или, может быть, она сломалась при отступы от кода здесь в stackoverflow.

Выдержки:

sites: 
    - site1: 
     routers: 
     - hostname: router1 

ИМХО, что не имеет смысла. site1 - пустой ключ. Он должен быть либо один из этих вариантов:

  1. routers должен быть подэлемент Сайта 1:

     sites: 
        - site1: 
         routers: 
          - hostname: router1
  2. Сайты должны быть ДИКТ вместо списка:

     sites: 
        site1: 
         routers: 
         - hostname: router1
  3. Имя сайта должно храниться как значение, а не как ключ:

     sites: 
        - name: site1 
         routers: 
         - hostname: router1

Давайте подберем вариант 3, так как это проще всего перебрать. Кроме того, вам не требуется знать имя сайта для доступа к контенту. Доступ ко всему содержимому можно получить с помощью общих ключей (sites[0].name/sites[0].routers[0].hostname и т. Д.). Во всех других решениях вам необходимо будет узнать имя сайта, прежде чем вы сможете получить доступ к контенту.

Я считаю, что мне нужно "with_nested"

Закрыть. Я также заставляю их всегда ошибаться и их нужно искать. Правильный цикл для использования будет with_subelements:

- debug: msg="{{ item.0.name }} {{ item.1.hostname }}" 
    with_subelements: 
    - "{{ sites }}" 
    - routers 
+0

Большое вам спасибо за это.Сначала у меня были вещи, структурированные, как у вас есть в варианте 3, но пытались так много вещей, которые он укусил. Теперь посмотрим на часть Jinja2. – mikey

Смежные вопросы