Ansible 角色复制和执行,为可以有多个条目的参数传递多变量结构

Ansible 角色复制和执行,为可以有多个条目的参数传递多变量结构,ansible,Ansible,我试图想出一种方法,将多个变量传递给角色中的同一个字段,但使用我一直使用的角色复制和执行方法却没有成功。例如,我希望使用port_number变量为SLB服务器分配多个端口。我是Ansible的新手,所以犯了一些新手错误,比如下面的代码(port_编号:“80”,port_编号:“8080”返回重复条目,所以只使用第一个),但我尝试了我找到的示例中的几乎所有语法,但没有一个是正确的。最终的结果基本上是test3具有两个端口号:分配给它的条目,但在这一点上,我甚至不确定是否可以这样做,或者是否必须

我试图想出一种方法,将多个变量传递给角色中的同一个字段,但使用我一直使用的角色复制和执行方法却没有成功。例如,我希望使用port_number变量为SLB服务器分配多个端口。我是Ansible的新手,所以犯了一些新手错误,比如下面的代码(port_编号:“80”,port_编号:“8080”返回重复条目,所以只使用第一个),但我尝试了我找到的示例中的几乎所有语法,但没有一个是正确的。最终的结果基本上是test3具有两个端口号:分配给它的条目,但在这一点上,我甚至不确定是否可以这样做,或者是否必须在添加条目后运行单独的模块。非常感谢您的帮助。谢谢

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

在您的代码中,变量是。字典中的键必须是唯一的

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

感谢您的回复和对初学者的耐心。角色:服务器只需在负载平衡器上添加一个新的服务器条目,并为其分配任意数量的端口(我们有一个条目分配了15个端口!)。输入实际上只是名称、fqdn_名称和分配的端口,然后在LB上创建一个服务器条目。不过,看看您的示例确实会提出一个有趣的观点。并不是说这是一种干净的方法,但从概念上讲,我可以在剧本中创建多达15个以上的端口号条目,然后在主剧本中使用我需要的变量。这不是最优雅的方式,但在我更好地掌握Ansible之前,它很可能会奏效。我会让你知道并再次感谢你的。我应该知道,当我打字的时候,这是行不通的,但是在这个问题上,我有点反复无常了。我想知道这是否只是一个运行初始服务器模块的问题,需要一个参数,需要添加的任何其他条目都需要针对现在创建的服务器条目运行一个单独的模块。这类似于从模板创建VM需要运行额外的任务才能向服务器添加另一个磁盘。我几乎肯定多个变量可以被传递,但我一生都无法理解。我撤销了我的答案,因为我不知道你在使用角色。我不建议将“with_items”与角色一起使用,而是将其作为一项单独的任务。感谢您的帮助,尽管我确实花了一些时间跟踪它不起作用的原因,但在我的Ansible旅程中,我学到了一些东西,这就是黄金!:)