Ansible: как создать переменную для полного доменного имени путем объединения с "." между переменной "имя" и переменной "домен" - PullRequest
1 голос
/ 13 июля 2020

Во-первых, я новичок от ie до Ansible и DevOps в целом. Во-вторых, спасибо всем тем, кто внес свой вклад в это сообщество, делая его полезным для обучения и помощи. Моя цель - создать новую переменную из двух переменных Dynami c. Учитывая, что новая переменная представляет собой полное доменное имя, мне нужно объединить эти две с помощью «.» (Точка / период) между ними.

У меня есть следующие полезные данные, входящие как JSON

{
    "extra_vars": {
        "operation": "add",
        "target_subnet": "172.16.10.0",
        "dns_name": "myserver",
        "dns_domain": "itsadomain.com"
    }
}

Я хочу, чтобы Ansible взял вышеуказанную информацию и создал переменную objectName. Затем objectName используется для создания URL-адреса серверной системы, чтобы, возможно, проверить, используется ли это objectName.

Мой последний вариант для этого конкретного раздела playbook выглядит следующим образом:

  - set_fact: objectName = {{[dns_name].[dns_domain]}}
  - name: show objectName
    debug: msg={{ objectName }

И я получаю следующий ответ:

}
    TASK [set_fact] ****************************************************************
task path: /var/lib/awx/projects/myproject/myplaybook.yml:42
fatal: [ipamapp.mydomain]: FAILED! => {
    "msg": "template error while templating string: expected name or number. String: objectName = {{[dns_name].[dns_domain]}}"
}

Обратите внимание, что я взял две входящие переменные, поместив между ними «.». Я просмотрел и другие сообщения, такие как - 29276198, но я думаю, что мой немного отличается, поскольку у него две переменные Dynami c, соединенные с помощью точки «. ”Символ

Ожидаемый результат состоит в том, что я могу затем создать« myserver.itsadomain.com »для objectName и использовать его позже в следующей игре

  - name: "Build my hostname search URL"
    set_fact:
     search_url_name: "https://ipamapp.mydomain/search.json?name={{objectName}}"
    when:
     - operation_converted == "add"
     - process_request

Ответы [ 2 ]

0 голосов
/ 14 июля 2020

Спасибо @VladimirBotka за сказанное выше. Я пробовал вариант 1 и вариант 2, но мне показалось, что "extra.vars" неприемлемы, это скорее неизвестная переменная. Однако небольшая модификация варианта 1 сработала. Рабочее решение:

- set_fact:
    objectName: "{{ dns_name ~ '.' ~ dns_domain }}"
0 голосов
/ 13 июля 2020

Попробуйте это

- set_fact:
    objectName: "{{ extra_vars.dns_name ~ '.' ~ extra_vars.dns_domain }}"

Следующий вариант:

- set_fact:
    objectName: "{{ extra_vars.dns_name }}.{{ extra_vars.dns_domain }}"

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

    - set_fact:
        objectName: "{{ fqdn|join('.') }}"
      vars:
        fqdn:
          - myserver
          - itsadomain
          - com

Пример. Учитывая полезную нагрузку

shell> cat extra-vars.json
{
    "extra_vars": {
    "operation": "add",
    "target_subnet": "172.16.10.0",
    "dns_name": "myserver",
    "dns_domain": "itsadomain.com"
    }
}

Playbook

shell> cat playbook.yml
- hosts: localhost
  vars_files:
    extra-vars.json
  tasks:
    - set_fact:
        objectName: "{{ extra_vars.dns_name ~ '.' ~ extra_vars.dns_domain }}"
    - debug:
        var: objectName
    - set_fact:
        objectName: "{{ extra_vars.dns_name }}.{{ extra_vars.dns_domain }}"
    - debug:
        var: objectName

дать (сокращенно)

  objectName: myserver.itsadomain.com

  objectName: myserver.itsadomain.com
...