Ansible ищет в подсписках значения

#ansible

#ansible

Вопрос:

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

Моя переменная внутри vars.yaml выглядит следующим образом:

 staging_hosts:
  server1: ['service1', 'service2', 'service3']
  server2: ['service4', 'service5', 'service6']
  server3: ['service7', 'service8', 'service9']
  

Сборник пьес:

 - name: write deployment hosts
  hosts: localhost
  vars:
    deployment_hosts: absent
  vars_files:
    - ./group_vars/vars.yaml
  tasks:
    - set_fact:
        modified_repos: (small regex filter to find modified repository)
    - set_fact:
        deployment_hosts: "{{ item }}"
      when: '{{ modified_repos }} in {{ item }}'
      with_list:
        - "{{ staging_hosts }}"

- name: connect to Cluster
  hosts: "{{ hostvars['localhost']['deployment_hosts'] }}"
  

Что я могу сделать против этого предупреждения и ошибки?

 [WARNING]: conditional statements should not include jinja2 templating
delimiters such as {{ }} or {% %}. Found: {{ modified_repos }} in {{ item }}
fatal: [localhost]: FAILED! => {"msg": "The conditional check '{{ modified_repos }} in {{ item }}' failed. True {% else %} False {% endif %}): unhashable type: 'list'
  

О, я забыл упомянуть. Важно, что deployment_hosts также может содержать два хоста, если измененные репозитории включают, например, service1 и service4.

Комментарии:

1. Вам не нужны разделители шаблонов Jinja {{ }} в when: условии, как указано в ошибке. Удалите их и попробуйте.

2. Спасибо, теперь полная ошибка: ОШИБКА! => {«сообщение об ошибке»: «Не удалось выполнить условную проверку ‘modified_repos в item’. Ошибка заключалась в следующем: произошла непредвиденная ошибка типа шаблона при ({% if modified_repos в item %} True {% else %} False {% endif %}): не хэшируемый тип: ‘list’nN Ошибка, по-видимому, находится в […], но может быть в другом месте файла в зависимости от конкретной синтаксической проблемы.n N Строка-нарушитель выглядит следующим образом:n n — debug: msg=»{{ modified_repos }}»n — set_fact:n ^ здесь n»}

3. Не уверен, что там modified_repos , но должно ли это быть when: item in modified_repos ?

4. modified_repos — это массив строк в формате ‘service1’ до ‘service9’, поскольку это измененные репозитории, которые запустили веб-хук, и я хочу развернуть. поэтому я ищу, какой сервер внутри staging_hosts включает службу, изображенную в modified_repos

Ответ №1:

Вопрос: «deployment_hosts также может содержать два хоста, если измененные репозитории включают, например, service1 и service4».

A: Используйте фильтр пересечения. Например, сборник пьес

 - hosts: localhost

  vars:
    staging_hosts:
      server1: ['service1', 'service2', 'service3']
      server2: ['service4', 'service5', 'service6']
      server3: ['service7', 'service8', 'service9']
    modified_repos: ['service1', 'service4']

  tasks:
    - set_fact:
        deployment_hosts: "{{ deployment_hosts|default([])   [item.key] }}"
      loop: "{{ staging_hosts|dict2items }}"
      when: modified_repos|intersect(item.value)|length > 0
    - debug:
        var: deployment_hosts
  

дает

   deployment_hosts:
  - server1
  - server2