имя_группы и вложенные переменные - PullRequest
0 голосов
/ 14 мая 2019

Мне нужно сделать несколько изменений в моей сети за относительно короткий промежуток времени, поэтому, чтобы сэкономить время, я решил использовать Ansible.

У меня есть несколько типов серверов в разных средах, поэтому нужно перебиратьв каждой среде и на каждом типе сервера и установите новый IP-адрес, подсеть и т. д.

Например, в ENV1 у меня может быть Web & DB, например, с ENV1 на 192.168.64, а Web - .10, а DB - .20.

Поэтому, используя Ansible и определяя два списка и используя их во вложенном цикле, я ожидал, что смогу сделать это в зависимости от среды и типа сервера.

Я мог бы использоватьпеременную командной строки и установите подсеть среды для каждой из них, но если я могу избежать этого, я бы хотел.

Playbook.

---
- hosts: web:db
  become: yes
  vars_files: 
    - vars/network-vars.yaml
  tasks:
    - name: Update the ifcfg-eth0 file
      template:
        src: templates/ifcfg-template.yaml
        dest: /etc/sysconfig/network-scripts/ifcfg-eth0.new
        owner: root
        group: root
        mode: 0644

      when: item.type in group_names and item.env in group_names
      with_items: 
          - "{{ ips }}"
          - "{{ subnets }}"

Файл Vars:

---
- netmask: 255.255.255.0
- network: 192.168.64
- dns1: 192.168.64.254
- search: lab.int

- subnets:
    - { env: "env1", net: "192.168.64.2" }

- ips:
    - { type: "web", ip: "10" }
    - { type: "db", ip: "20" }

СБОЙ!=> {"msg": "Ошибка условной проверки" item.type в group_names и "{{env}}" в group_names ". Ошибка: ошибка при вычислении условия (item.type в group_names и '{{env})} 'in group_names):' env 'не определено

Я пробовал with_nested, но получаю похожую ошибку. Я почти исчерпал чтение страниц руководства и поиск решения, поэтому я и решилЯ здесь.

TIA.

Ответы [ 3 ]

0 голосов
/ 14 мая 2019

Относительно ошибки:

'item.type in group_names and '{{env}}' in group_names

Вы видите это из-за вложенного {{env}} в середине.

  • Содержимое оператора when неявно находится внутри контекста jinja {{...}}, а
  • Вы никогда не вкладываете {{...}} маркеры.

Вы бы написали эти выражения как:

when: item.type in group_names and env in group_names

Но это, вероятно, не лучший способ решения вашей проблемы.

0 голосов
/ 16 июля 2019

Думаю, я поделюсь с вами, как это работает, не зацикливаясь, и не уверен, почему я вообще об этом не задумывался.Я установил факт в каждой системе, чтобы сначала объявить сеть.Простые решения иногда легче всего пропустить.

    - name: set the network
      set_fact: net="{{ item.net }}"
      when: item.env in group_names
      with_items:
        - "{{ subnets }}"
0 голосов
/ 14 мая 2019

Для этого вы можете использовать product filter.

Дополнительную документацию по конструкциям анциклических циклов можно найти в официальной документации на странице Loops .

#!/usr/bin/env ansible-playbook
- name: Lets do some loops
  hosts: localhost
  gather_facts: false
  become: false
  vars:
    arr_one:
    - env: dev
    - env: prod
    arr_two:
    - type: web
    - type: db
  tasks:
  - name: Only print when env=dev and type=db
    debug:
      msg: "{{ item.0.env }} {{ item.1.type }}"
    when: (item.0.env == 'dev') and
          (item.1.type == 'db')
    loop: "{{ arr_one
            | product(arr_two)
            | list }}"

PLAY [Lets do some loops] ***************************************************************************************************************************************************************************************************************************************************************************************************************************************************

TASK [Only print when for env=dev and type=db] *****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
skipping: [localhost] => (item=[{'env': 'dev'}, {'type': 'web'}]) 
ok: [localhost] => (item=[{'env': 'dev'}, {'type': 'db'}]) => {
    "msg": "dev db"
}
skipping: [localhost] => (item=[{'env': 'prod'}, {'type': 'web'}]) 
skipping: [localhost] => (item=[{'env': 'prod'}, {'type': 'db'}]) 

PLAY RECAP ******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0  
...