雲端環境中的基礎設施管理往往需要反覆進行許多設定工作,而自動化這些流程不僅能提高效率,還能減少人為錯誤。在與 AWS 互動時,Ansible 憑藉其簡單易用的特性成為一個理想的自動化工具。本文將探討如何使用 Ansible 在 AWS 環境中設定和管理基礎設施,特別是 VPC 環境和安全遠端存取。

在跳板機上安裝 Ansible

在雲端環境中,跳板機(Jump Box)是管理其他節點的重要工具。首先,讓我們建立 Ansible 角色來安裝 Ansible 在跳板機上:

---
- name: upgrade all packages
  yum: name=* state=latest
  
- name: install the 'Development tools' package group
  yum: name="@Development tools" state=present
  
- name: install required packages
  yum: name={{ item }} state=present
  with_items:
    - epel-release.noarch
    - python-pip
    - python-devel
    
- name: install setuptools
  pip: name=setuptools extra_args='--upgrade'
  
- name: install ansible
  pip: name=ansible

這段 Ansible playbook 任務實作了幾個關鍵功能:首先更新所有套件,確保系統處於最新狀態;接著安裝「Development tools」套件組,這是編譯和開發所需的基本工具集;然後安裝 epel-release(提供額外套件)、python-pip(Python 套件管理工具)和 python-devel(Python 開發函式庫最後升級 setuptools 並安裝 Ansible。這個順序很重要,因為後續步驟依賴於前面步驟安裝的元件。

接下來,我們需要建立一個 playbook 來執行這個角色:

---
- hosts: tag_class_jumpbox
  become: yes
  roles:
    - ansible

執行此 playbook:

ansible-playbook -i ec2.py install_ansible.yml

這個 playbook 針對所有帶有 tag_class_jumpbox 標籤的 EC2 例項執行操作,become: yes 表示使用提升許可權(相當於 sudo)執行命令,這對於安裝套件是必要的。透過 -i ec2.py 引數,Ansible 使用動態清單指令碼從 AWS 取得例項訊息,無需手動維護主機列表。

設定安全群組規則

在 AWS 中,安全群組(Security Group)控制著流量的進出。當你想從跳板機管理私有子網中的資源時,需要修改相應的安全群組規則:

- name: modify sg_database rules
  ec2_group:
    region: "{{ region }}"
    vpc_id: "{{ vpc_id }}"
    name: "{{ prefix }}_sg_database"
    description: security group for databases
    rules:
      # allow ssh from the jump box
      - proto: tcp
        from_port: 22
        to_port: 22
        group_name: "{{ prefix }}_sg_jumpbox"
      # allow mysql access from web servers
      - proto: tcp
        from_port: 3306
        to_port: 3306
        group_name: "{{ prefix }}_sg_web"
    rules_egress:
      - proto: tcp
        from_port: 80
        to_port: 80
        cidr_ip: 0.0.0.0/0
      - proto: tcp
        from_port: 443
        to_port: 443
        cidr_ip: 0.0.0.0/0

這段設定為資料函式庫群組定義了入站和出站規則。入站規則允許來自跳板機的 SSH 連線(連線埠 22)和來自網頁伺服器的 MySQL 連線(連線埠 3306)。出站規則允許資料函式庫器存取外部的 HTTP(連線埠 80)和 HTTPS(連線埠 443)服務。這種設定遵循最小許可權原則,只允許必要的流量透過,增強了安全性。

佈署 Open虛擬私人網路 伺服器實作安全遠端存取

在企業環境中,安全地存取私有資源是一個常見需求。Open虛擬私人網路 Access Server 提供了一個全功能的 SSL 虛擬私人網路 解決方案,支援各種設定和精細的存取控制。

建立 Open虛擬私人網路 安全群組

首先,我們需要建立一個適合 Open虛擬私人網路 伺服器的安全群組:

---
- hosts: localhost
  connection: local
  gather_facts: no
  vars_files:
    - staging_vpc_info
  vars:
    region: ap-southeast-2
    allowed_ip: 123.xxx.xxx.xxx/32
    prefix: staging
    vpc_id: "{{ staging_vpc }}"
  tasks:
    - name: create security group for openvpn instance
      ec2_group:
        region: "{{ region }}"
        vpc_id: "{{ vpc_id }}"
        name: "{{ prefix }}_sg_openvpn"
        description: security group for openvpn
        rules:
          - proto: tcp
            from_port: 22
            to_port: 22
            cidr_ip: "{{ allowed_ip }}"
          - proto: tcp
            from_port: 443
            to_port: 443
            cidr_ip: 0.0.0.0/0
          - proto: tcp
            from_port: 943
            to_port: 943
            cidr_ip: 0.0.0.0/0
          - proto: udp
            from_port: 1194
            to_port: 1194
            cidr_ip: 0.0.0.0/0
        rules_egress:
          - proto: all
            cidr_ip: 0.0.0.0/0

這個安全群組設定專為 Open虛擬私人網路 伺服器設計,開放了幾個關鍵連線埠:

  • 連線埠 22 (SSH):僅允許從特定 IP 地址存取,提高安全性
  • 連線埠 443 (HTTPS):Open虛擬私人網路 主要服務連線埠,允許全球存取
  • 連線埠 943:Open虛擬私人網路 Web 介面連線埠,用於管理
  • 連線埠 1194 (UDP):Open虛擬私人網路 的標準 UDP 通訊連線埠

出站規則允許所有流量,使 虛擬私人網路 伺服器可以連線到任何目標。這種設定為 Open虛擬私人網路 提供了必要的連通性,同時限制了管理存取。

啟動 Open虛擬私人網路 例項

接下來,我們將在公共子網中啟動 Open虛擬私人網路 伺服器例項:

---
- hosts: localhost
  connection: local
  gather_facts: no
  vars_files:
    - staging_vpc_info
  vars:
    region: ap-southeast-2
    key: yan-key-pair-apsydney
    instance_type: t2.micro
    image: ami-a17f199b
    prefix: staging
    vpc_subnet_id: "{{ staging_subnet_public_0 }}"
  tasks:
    - name: openvpn server instance provisioning
      ec2:
        region: "{{ region }}"
        key_name: "{{ key }}"
        instance_type: "{{ instance_type }}"
        image: "{{ image }}"
        source_dest_check: no
        wait: yes
        group: "{{ prefix }}_sg_openvpn"
        instance_tags:
          Name: "{{ prefix }}_openvpn"
          class: openvpn
          environment: "{{ prefix }}"
        id: openvpn_launch_01
        vpc_subnet_id: "{{ vpc_subnet_id }}"
      register: ec2
      
    - name: associate new EIP for the instance
      ec2_eip:
        region: "{{ region }}"
        instance_id: "{{ item.id }}"
      with_items: ec2.instances