簡體   English   中英

通過 ansible 在具有兩個網卡的 vpc 中創建 ec2 實例

[英]Create ec2 instance within vpc with two nics through ansible

經過一天的谷歌搜索后,我決定放棄並在這里提問:我對 ansible 和 AWS 還是很陌生,因此這個問題可能缺少背景信息,我很樂意應要求提供這些信息。

我想要實現的目標:編寫一個 Ansible 劇本,它在我的 vpc 中創建一個新的 ec2 實例。 該實例應配備兩個新網卡,eth0 和 eth1。 這些網卡應該與每個特定的安全組相關聯。

到目前為止,我的劇本是這樣構建的:

  • 創建eth0
  • 創建eth1
  • 創建 ec2 實例

我的問題:所有文檔都說我需要提供我想附加到我的實例的接口的 eni-id。 我無法提供此信息,因為 ID 尚不存在。 我唯一知道的是接口的名稱,所以我試圖分別獲取接口的 ID,但這也沒有用。 如果我嘗試在 ansible 中注冊創建 eth{0,1} 的 output,則會存儲整個 output 並在稍后調用實例創建部分中的變量時中斷驗證。 與創建過程后的額外步驟相同。

有關設置的更多信息:在 AWS 中運行 VPC,VPC 內的主機只能通過 VPN 訪問。 在 macOS 上運行 Ansible:

ansible --version

ansible [core 2.14.1]
  config file = None
  configured module search path = ['/Users/mg/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/Cellar/ansible/7.1.0/libexec/lib/python3.11/site-packages/ansible
  ansible collection location = /Users/mg/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/local/bin/ansible
  python version = 3.11.1 (main, Dec 23 2022, 09:40:27) [Clang 14.0.0 (clang-1400.0.29.202)] (/usr/local/Cellar/ansible/7.1.0/libexec/bin/python3.11)
  jinja version = 3.1.2
  libyaml = True

劇本:


---
- name: Create ec2 instances
  hosts: localhost
  gather_facts: false
  tasks:

  # Block is a Group of Tasks combined together
  - name: Get Info Block
    block: 
      - name: Get Running instance Info
        
        ec2_instance_info:
        register: ec2info 

      - name: Print info
        debug: var="ec2info.instances"
             

    # By specifying always on the tag, 
    # I let this block to run all the time by module_default
    # this is for security to net create ec2 instances accidentally
    tags: ['always', 'getinfoonly']

  - name: Create ec2 block
    block: 
    
      - amazon.aws.ec2_vpc_net_info:
          vpc_ids: vpc-XXXXXXXXXXXXXXXXX
                                 
      - name: Create ec2 network interface eth0_lan
        delegate_to: localhost
        tags: ec2-create
        amazon.aws.ec2_eni:
          name: "eth0_lan_{{ vpc_hostname }}"
          description: "eth0_lan_{{ vpc_hostname }}"
          subnet_id: "{{ vpc_subnetid }}"
          state: present
          delete_on_termination: true
          region: eu-central-1
          security_groups: "sg-XXXXXXXXXXXXXXXXX"
      
      - name: Get id of eth0
        delegate_to: localhost
        tags: ec2-create
        amazon.aws.ec2_eni:
          name: "eth0_lan_{{ vpc_hostname }}"
        register: eth0
      

      - name: Create ec2 network interface eth1_wan
        delegate_to: localhost
        tags: ec2-create
        amazon.aws.ec2_eni:
          name: "eth1_wan_{{ vpc_hostname }}"
          description: "eth1_wan_{{ vpc_hostname }}"
          subnet_id: "subnet-XXXXXXXXXXXXXXXXX"
          state: present
          delete_on_termination: true
          region: eu-central-1
          security_groups: 'sg-XXXXXXXXXXXXXXXXX'

      - name: Get id of eth1
        delegate_to: localhost
        tags: ec2-create
        amazon.aws.ec2_eni:
          name: "eth1_wan_{{ vpc_hostname }}"
        register: eth1

      - name: Launch ec2 instances
        tags: ec2-create
        amazon.aws.ec2_instance:
          name: "{{ vpc_hostname }}"
          region: "eu-central-1"
          key_name: "MyKey"
          image_id: ami-XXXXXXXXXXXXXXXXX
          vpc_subnet_id: "{{ vpc_subnetid }}"
          instance_type: "{{ instance_type }}"
          volumes:
            - device_name: /dev/sda1
              ebs:
                volume_size: 30
                delete_on_termination: true
          network:
            interfaces:
              - id: "{{ eth0 }}"
              - id: "{{ eth1 }}"
          detailed_monitoring: true
        register: ec2
        delegate_to: localhost

    # By specifying never on the tag of this block, 
    # I let this block to run only when explicitely being called
    tags: ['never', 'ec2-create']

(如果您想了解標簽內容,這來自我最初遵循的教程,學分: https://www.middlewareinventory.com/blog/ansible-aws-ec2/#How_Ansible_works_with_AWS_EC2_Setup_Boto_for_Ansible

ansible 劇本的執行因以下錯誤而中斷:

An exception occurred during task execution. To see the full traceback, use -vvv. The error was: Invalid type for parameter NetworkInterfaces[1].NetworkInterfaceId, value: {'changed': True, 'interface': {'id': 'eni-XXXXXXXXXXXXXXXXX', 'subnet_id': 'subnet-XXXXXXXXXXXXXXXXX', 'vpc_id': 'vpc-XXXXXXXXXXXXXXXXX', 'description': 'somedescription', 'owner_id': 'XXXXXXXXXXXXXXXXX', 'status': 'available', 'mac_address': 'xx:xx:xx:xx:xx:xx, 'private_ip_address': 'xx.xx.xxx.xx', 'source_dest_check': True, 'groups': {'sg-XXXXXXXXXXXXXXXXX': 'SGNAME'}, 'private_ip_addresses': [{'private_ip_address': 'xx.xx.xxx.xx', 'primary_address': True}], 'name': 'eth1_wan_<fqdn>', 'tags': {'Name': 'eth1_wan_<fqdn>'}}, 'failed': False}, type: <class 'dict'>, valid types: <class 'str'>

所以,我和我的同事設法解決了這個問題:改用“{{ eth0.interface.id }}”。 然而,所有實例在創建時繼續自行終止。 在 AWS 控制台中:Client.InternalError。 這與我今天默認打開的 kms/ebs 加密有關。 事實證明,我嘗試使用非對稱客戶管理密鑰進行默認 ebs 加密。 一旦我用一個對稱的替換它,它就起作用了,實例就會開始。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM