2017-07-26 79 views
0

我有一個Ansible角色來處理創建RDS實例和該實例上的數據庫。該角色允許爲數據庫指定安全組。我希望能夠在允許從當前主機訪問的角色開始時將安全組添加到安全組,以便Ansible可以運行一些數據庫創建/維護任務。然後我想在保持現有組的同時從安全組中刪除此規則。如何使用Ansible向EC2安全組添加臨時規則

我到目前爲止所做的工作是使用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參數需要的對象與proto列表,from_portto_portcidr_ip屬性,所以我會如何將數據映射以上所需的格式?

編輯:我想一個解決方案是添加一個臨時安全組,允許從當前主機訪問。如果我對EC2安全組的理解是正確的,那麼應用與實例關聯的安全組最爲寬鬆的規則,這樣可以實現我想要的。但是,這需要編輯附加到現有RDS實例的安全組,因此如果可能,我寧願編輯現有安全組的規則。

編輯2: Travis CI publishes the IP addresses用於運行構建。我可以將這些永久添加到安全組,但我不確定這是什麼安全隱患。

ec2_group docs
ec2_group_facts docs

回答

1

當運行劇本你想有一個一致的狀態,並從事物的聲音,你不必在你的打法一致的狀態。

我會建議您想要在數據庫上執行的額外任務可以從更可信的其他實例運行(也許是您正在運行的位置?)。

請考慮如果劇本同時運行兩次會發生什麼情況。也許這不是你的工作流程允許的,但你仍應該考慮這種情況。

如果這不是一個選項,或者你不想改變你的實現,那麼你的編輯建議聽起來更合適。應用您的標準規則,並在需要時添加到您的規則(或爲此創建一個新的安全組),然後在不再需要時刪除或修改。

+0

感謝您的迴應。這個角色將主要在CI/CD設置中運行,最有可能來自Travis CI。這意味着我不能僅僅添加一條規則來允許主機訪問數據庫,因爲我無法控制作業運行在哪臺機器(以及相關的IP)上。另外,我還沒有考慮過劇本可能同時運行,所以我很感謝你指出了這一點。 –

+0

您是否考慮通過'delegate_to' http://docs.ansible.com/ansible/latest/playbooks_delegation.html#delegation更改特定任務的目標主機。這樣你永遠不會要求應用程序主機擁有該訪問權限。 – Hammett

+0

我不確定'delegate_to'在這種情況下會有用。說實話,雖然我會指出所有的數據庫任務都是用'local_action'執行的,我認爲它相當於'delegate_to:127.0.0.1',但我並沒有真正理解它的用途。 –