Ansible:如何通过与“.”连接来为 FQDN 构造变量在变量 "name" 和变量 "domain" 之间

Ansible: how to construct a variable for a FQDN by concatenated with a "." between variable "name" and variable "domain"

首先,我是 Ansible 和 DevOps 的新手。其次感谢所有为这个社区做出贡献的人,使学习和帮助变得有用。 我的目标是从两个动态变量创建一个新变量。鉴于新变量是 FQDN,我需要在两者之间加入“.”(句号/句点)。

我有以下有效负载作为 JSON

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

我希望 Ansible 获取上述信息并创建变量 objectName。 objectName 然后我们为后端系统构造一个 URL 以可能检查该 objectName 是否正在使用。

我对剧本的这个特定部分的最新变体如下:

  - 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,但我想我的帖子有点不同,因为它有两个动态变量,并通过使用句号“。 ” 字符

预期的结果是我可以为 objectName 创建“myserver.itsadomain.com”并稍后在下面的播放中使用它

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

试试这个

- 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"
    }
}

剧本

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

感谢@VladimirBotka 提供的上述内容。 我尝试了选项 1 和选项 2,但似乎“extra.vars”是不可接受的,而是一个未知变量。 但是,对选项 1 稍作修改确实有效 工作解决方案是

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