Роль дублирования и выполнения, передавая структуру с несколькими переменными для аргументов, которые могут иметь несколько записей - PullRequest
0 голосов
/ 01 ноября 2019

Я пытаюсь придумать способ передать несколько переменных в одно и то же поле в роли, но безуспешно заставить его работать, используя метод дублирования и выполнения ролей, который я использовал. В качестве примера я хочу, чтобы серверу SLB было назначено несколько портов с помощью переменной port_number. Я новичок в Ansible, поэтому я делаю некоторые ошибки новичка, такие как код ниже (port_number: "80", port_number: "8080" возвращает повторяющуюся запись, поэтому использует только первую), но я попробовал почти каждый синтаксис, для которого я нашел примеры иничего не работает правильно. Конечным результатом в основном является test3 с обоими присвоенными ему записями port_number: записи, но на данный момент я даже не уверен, что возможно сделать это таким образом, или мне нужно запустить отдельный модуль после факта, чтобы добавить записи. Любая помощь очень ценится. Спасибо.

---
- name: Deploy A10 config
  connection: local
  hosts: all
  roles:
  - role: server
    vars:
     name: "test1"
     fqdn_name: "test1.test.domain.net"
     health_check: "TCP-8080-HALFOPEN"
     port_number: "80"


  - { role: server, vars: { name: "test2", fqdn_name: "test2.test.domain.net", port_number: "8080" }}
  - { role: server, vars: { name: "test3", fqdn_name: "test3.test.domain.net", port_number: "80", port_number: "8080" }}

---
- name: Test server create
  a10_slb_server:
    a10_host: "10.1.1.1"
    a10_username: "admin"
    a10_password: "admin"
    a10_port: "443"
    a10_protocol: "https"
    state: present
    name: "{{ name }}"
    fqdn_name: "{{ fqdn_name }}"
    port_list:
      - port_number: "{{ port_number }}"

1 Ответ

0 голосов
/ 01 ноября 2019

В вашем коде переменная это словарь . Ключи в словаре должны быть уникальными.

vars:
 name: "test1"
 fqdn_name: "test1.test.domain.net"
 health_check: "TCP-8080-HALFOPEN"
 port_number: "80"

YAML устраняет дублирование ключей, просто переопределяя значение. Это выражение

vars: { name: "test3", fqdn_name: "test3.test.domain.net", port_number: "80", port_number: "8080" }

даст

"vars": {
    "fqdn_name": "test3.test.domain.net", 
    "name": "test3", 
    "port_number": "8080"
}

В вашем коде port_list есть список . Это список словарей. Кажется, это правильный способ объявить несколько номеров портов.

port_list:
  - port_number: "80"
  - port_number: "8080"

В сериализованном формате

port_list: [{port_number: "80"}, {port_number: "8080"}]

Но в вашем коде роль: сервер это не такПонятно, как эти переменные используются в роли. Необходимо изучить роль, чтобы узнать, как отправить данные.


Например:

- role: server
  vars:
    name: "test1"
    fqdn_name: "test1.test.domain.net"
    health_check: "TCP-8080-HALFOPEN"
    port_number1: "80"
    port_number2: "8080"

--
- name: Test server create
  a10_slb_server:
    a10_host: "10.1.1.1"
    a10_username: "admin"
    a10_password: "admin"
    a10_port: "443"
    a10_protocol: "https"
    state: present
    name: "{{ name }}"
    fqdn_name: "{{ fqdn_name }}"
    port_list:
      - port_number: "{{ port_number1 }}"
      - port_number: "{{ port_number2 }}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...