Ansible with_subelements (Списки) - PullRequest
       1

Ansible with_subelements (Списки)

1 голос
/ 05 ноября 2019

Я пытаюсь использовать Ansible для настройки виртуальных хостов Apache вместе с базами данных, но не у всех Vhosts будут базы данных (1 или более).

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

Мой host_vars (отрывок):

web_vhosts:
  - vhost:
      name: domain1.tld
      enabled: true
      serveradmin_email: info@example.org
      https: true
      redirect_to_https: true
      dns_a_record: 1.2.3.4
      update_dns: false
  - vhost:
      name: domain2.tld
      enabled: true
      serveradmin_email: info@example.org
      https: true
      redirect_to_https: true
      dns_a_record: 1.2.3.4
      update_dns: false
      mysql:
        - name: wordpress1
          user: myuser
          password: secret

Вот как далеко я нахожусь:

- name: Ensure databases
  mysql_db:
    name: "{{ item.1.name }}"
    state: present
    login_unix_socket: /var/run/mysqld/mysqld.sock
  when: item.0.mysql is defined
  with_subelements:
    - "{{ web_vhosts }}"
    - "mysql"

Какие ошибки в:

fatal: [examplehost]: FAILED! => {"msg": "could not find 'mysql' key in iterated item '{'vhost': {'name': 'domain1.tld', 'enabled': True, 'serveradmin_email': 'info@example.org', 'https': True, 'redirect_to_https': True, 'dns_a_record': '1.2.3.4', 'update_dns': False}}'"}

Может кто-нибудь помочь мне понять, что не так?

Ответы [ 2 ]

1 голос
/ 05 ноября 2019

Ваша переменная web_vhosts - это список, составленный из словарей, где первый элемент - vhost. Вам нужно найти подэлемент vhost.mysql вместо mysql. Это должно исправить вашу проблему:

- name: Ensure databases
  mysql_db:
    name: "{{ item.1.name }}"
    state: present
    login_unix_socket: /var/run/mysqld/mysqld.sock
  loop: "{{ web_vhosts | subelements('vhost.mysql', skip_missing=True) }}"
0 голосов
/ 05 ноября 2019

В первом элементе списка нет ключа mysql web_vhosts

{"msg": "не удалось найти ключ 'mysql'в повторяющемся элементе '{' vhost ': {' name ': domain1.tld' ...

Set {'skip_missing': True} . Например

- name: Ensure databases
  mysql_db:
    name: "{{ item.1.name }}"
    state: present
    login_unix_socket: /var/run/mysqld/mysqld.sock
  loop: "{{ lookup('subelements', web_vhosts, 'mysql', {'skip_missing': True}) }}"

Хорошей идеей будет сначала проверить цикл

- name: Debug
  debug:
    var: item
  loop: "{{ lookup('subelements', web_vhosts, 'mysql', {'skip_missing': True}) }}"

В качестве альтернативы можно использовать подэлементов в качестве фильтр

  loop: "{{ web_vhosts | subelements('mysql', skip_missing=True) }}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...