【问题标题】:How to add a temporary rule to an EC2 security group with Ansible如何使用 Ansible 向 EC2 安全组添加临时规则
【发布时间】:2018-01-01 03:35:06
【问题描述】:

我有一个 Ansible 角色来处理 RDS 实例和该实例上的数据库的创建。该角色允许为数据库指定安全组。我希望能够在角色开始时向安全组添加一条规则,允许从当前主机访问,以便 Ansible 可以运行一些数据库创建/维护任务。然后,我想从安全组中删除此规则,同时保留现有组。

到目前为止,我所做的是使用ec2_group_facts 模块来获取有关我保存在security_group 变量中的给定安全组的信息。然后我添加了一个类似于以下任务的规则:

- name: Add hole to security group
  local_action:
    module: ec2_group
    name: "{{ security_group.group_name }}"
    purge_rules: no
    rules:
      - proto: tcp
        from_port: "{{ db_port }}"
        to_port: "{{ db_port }}"
        cidr_ip: 0.0.0.0/0

这一切正常。问题是在角色结束时,当我想恢复现有规则时,ec2_group_facts 返回的规则格式不被ec2_group 模块接受。保存的关于security_group的信息格式如下:

{
  "group_id": "sg-1234abcd", 
  "group_name": "security-group", 
  "ip_permissions": [
    {
      "from_port": 1234, 
      "ip_protocol": "tcp", 
      "ip_ranges": [
        {
          "cidr_ip": "0.0.0.0/0"
        }
      ], 
      "ipv6_ranges": [], 
      "prefix_list_ids": [], 
      "to_port": 1234, 
      "user_id_group_pairs": []
    }
  ], 
  "ip_permissions_egress": [], 
  "owner_id": "123456789012", 
  "tags": {
    "Name": ""
  }, 
  "vpc_id": "vpc-1234abcd"
}

ec2_group 模块的rules 参数需要具有protofrom_portto_portcidr_ip 属性的对象列表,那么我如何将上面的数据映射到所需的格式?

编辑:我想一种解决方案是添加一个允许从当前主机访问的临时安全组。如果我对 EC2 安全组的理解是正确的,那么将应用与实例关联的安全组的最宽松规则,这样就可以实现我想要的。但是,这需要编辑附加到现有 RDS 实例的安全组,因此我希望尽可能编辑现有安全组的规则。

编辑 2: Travis CI publishes the IP addresses 用于运行构建。我可以将这些永久添加到安全组中,尽管我不确定这会带来什么安全隐患。

ec2_group docs
ec2_group_facts docs

【问题讨论】:

    标签: amazon-ec2 ansible


    【解决方案1】:

    在运行 playbook 时,您需要一个一致的状态,而在整个游戏过程中,从事物的声音来看,您并没有一致的状态。

    我建议您希望在数据库上执行的附加任务可以从更受信任的其他实例运行(可能是您运行 ansible 的地方?)。

    考虑如果一个剧本同时运行两次会发生什么。也许这不是您的工作流程所允许的,但您仍然应该考虑这种情况。

    如果这不是一个选项,或者您不想更改您的实现,那么您的编辑建议听起来更合适。应用您的标准规则并在需要时添加到您的规则(或为此目的创建一个新的安全组),然后在不再需要时销毁或修改。

    【讨论】:

    • 感谢您的回复。此角色将主要在 CI/CD 设置中运行,很可能来自 Travis CI。这意味着我不能只添加一个规则来允许主机访问数据库,因为我无法控制作业在哪台机器(和关联的 IP)上运行。另外,我没有考虑同时运行 playbook 的可能性,因此感谢您指出这一点。
    • 您是否考虑过通过delegate_to docs.ansible.com/ansible/latest/… 更改特定任务的目标主机。这样,您将永远不会要求应用程序主机拥有该访问/特权。
    • 我不确定delegate_to 在这种情况下会有什么用处。老实说,我不太了解它的用途,虽然我会指出所有数据库任务都是使用local_action 执行的,我认为它相当于delegate_to: 127.0.0.1
    猜你喜欢
    • 2015-07-27
    • 2019-07-09
    • 2023-03-29
    • 2017-04-30
    • 1970-01-01
    • 2015-04-28
    • 2022-06-11
    • 2022-08-09
    • 1970-01-01
    相关资源
    最近更新 更多