#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