【问题标题】:Using Ansible to create AWS Application Load Balancer rules使用 Ansible 创建 AWS Application Load Balancer 规则
【发布时间】:2018-02-01 15:59:48
【问题描述】:

我正在尝试使用 Ansible 在我现有的 ALB 上为未配置的 HTTP 侦听器创建规则。我通过检索 alb 的事实来开始事情,然后使用这些事实来定义 Ansible ALB 资源,添加我想要的规则,但我遇到了一个问题。

我希望 Ansible 循环遍历我的 group_vars 文件(它已经成功完成了其他任务)来创建这些多个规则。但是,在循环时,它不会将规则附加到侦听器,而是销毁/创建它们。因此,当剧本完成时,您只剩下一个规则来引用 vars 文件末尾定义的任何项目(在我的例子中是萨里)。

我的代码如下(为简洁起见,我排除了获取和设置事实的部分):

- name: Add HTTP listener rules
  elb_application_lb:
    state: present
    name: "{{ albinfo.load_balancer_name }}"
    subnets:
      - "{{ albinfo.availability_zones[0].subnet_id }}"
      - "{{ albinfo.availability_zones[1].subnet_id }}"
      - "{{ albinfo.availability_zones[2].subnet_id }}"
    security_groups:
      - "{{ albinfo.security_groups[0] }}"
    listeners:
      - Protocol: HTTP
        Port: 80
        DefaultActions:
          - Type: forward
            TargetGroupName: default
        Rules:
          - Conditions:
              - Field: host-header
                Values: "{{ item.url }}"
            Priority: "{{ item.priority }}"
            Actions:
              - TargetGroupName: "{{ item.name }}"
                Type: forward
    purge_listeners: no
  with_items: "{{ regions }}"

我的“区域”变量文件如下所示:

regions:
  - name: manchester
    priority: 1
    url:
      - manchester.example.com

  - name: surrey
    priority: 2
    url:
      - surrey.example.com

【问题讨论】:

  • 问题是什么?
  • 如何让它按预期工作,所以当剧本完成时,我对听众有两条规则,一条适用于曼彻斯特,一条适用于萨里。谢谢。

标签: amazon-web-services ansible


【解决方案1】:

您使用 with_items 迭代 elb_application_lb 模块的方式不会像您发现的那样工作。执行多个命令将产生最后一个“获胜”的效果,因为它会覆盖现有的 elb 规则集。

您需要做的是在一次调用 elb_application_lb 时定义每个规则,而不是在多次调用此模块时对规则进行分层。您也许可以像这样创建一个定义所有规则的字典:

- name: Add HTTP listener rules
  elb_application_lb:
    state: present
    name: "{{ albinfo.load_balancer_name }}"
    subnets:
      - "{{ albinfo.availability_zones[0].subnet_id }}"
      - "{{ albinfo.availability_zones[1].subnet_id }}"
      - "{{ albinfo.availability_zones[2].subnet_id }}"
    security_groups:
      - "{{ albinfo.security_groups[0] }}"
    listeners:
      - Protocol: HTTP
        Port: 80
        DefaultActions:
          - Type: forward
            TargetGroupName: default
        Rules:
          - "{{ region_rules }}"
    purge_listeners: no

区域规则变量如下所示:

    region_rules:
      - Conditions:
          - Field: host-header
            Values: manchester.example.com
        Priority: 1
        Actions:
          - TargetGroupName: manchester
            Type: forward

      - Conditions:
          - Field: host-header
            Values: surrey.example.com
        Priority: 2
        Actions:
          - TargetGroupName: surrey
            Type: forward

【讨论】:

  • TJ - 太棒了,解决了我的问题。注意我必须对其进行一些小的格式更改才能使其正常工作:“{{ region_rules}}”应该在任务中定义为字符串而不是列表。非常感谢!
猜你喜欢
  • 2021-01-21
  • 1970-01-01
  • 1970-01-01
  • 2017-11-23
  • 2020-08-03
  • 2017-07-30
  • 2020-08-27
  • 2018-03-08
  • 1970-01-01
相关资源
最近更新 更多