[FrontPage] [TitleIndex] [WordIndex

This is a read-only archived version of wiki.centos.org

在 EC2 上利用 Ansible 部署 CentOS 映像

我會討論如何在 ECS2 上利用 Ansible 部署一些 CentOS 實例,這當然是透過一台 CentOS 機器來進行。

首先,你不需在你的管理系統上安裝 AWS 工具,這樣亦省掉安裝 Java 的需要。我們的 CentOS 管理系統需要下列元件:

你已經建立了你的 AWS 帳戶,而且取得與 EC2 溝通用的憑證密碼。由此點開始,我們需要在指令殼的環境下設定以下變數:

export EC2_ACCESS_KEY="xxxxxxxxxxxxxxxxxxxx"
export EC2_SECRET_KEY="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
export EC2_URL=https://ec2.amazonaws.com
export S3_URL=https://s3.amazonaws.com:443
export AWS_ACCESS_KEY_ID=${EC2_ACCESS_KEY}
export AWS_SECRET_ACCESS_KEY=${EC2_SECRET_KEY}

1. Ansible 清單

Ansible 採用一個清單來描述被管理的機器、它們的群組及各機器的特定變數。這個清單預設位於 /etc/ansible/hosts,但我可透過設定 $ANSIBLE_HOSTS 來更改它的路徑。信不信由你,但一個清單檔可以短至這樣,而這正是我們傳給 Ansible 來啟動 EC2 實例的清單:

[local]
127.0.0.1

我們或許需要部署在世界另一端的 ECS 實例(至少我有需要)。我們要怎樣辦?我們如何得悉它們的主機名稱?

ec2.py 是一個供 Ansible 用腳本,能列舉可存取的 EC2 實例。要是我執行這個程式,我會得到以下的 JSON 輸出,因為我已經有運行中的實例。(你可把實例編號和公用主機名稱與先前所見的作個比較。)

{
  "i-df75cea0": [
    "ec2-54-242-141-105.compute-1.amazonaws.com"
  ], 
  "key_jp1": [
    "ec2-54-242-141-105.compute-1.amazonaws.com"
  ], 
  "security_group_default": [
    "ec2-54-242-141-105.compute-1.amazonaws.com"
  ], 
  "type_m1_small": [
    "ec2-54-242-141-105.compute-1.amazonaws.com"
  ], 
  "us-east-1": [
    "ec2-54-242-141-105.compute-1.amazonaws.com"
  ], 
  "us-east-1a": [
    "ec2-54-242-141-105.compute-1.amazonaws.com"
  ]
}

雖然我們只有一台機器,但它出現於不同群組中。這些群組讓我們以 Ansible 進行部署時能針對特定的群組。(註:ec2.py 這個程式把它的輸出緩存在設定路徑內,因此該清單也許需要一分鐘才會刷新。)要是我以特定的主機來呼喚該清單程式,我會取得針對該實例的變數:(我已刪減了部份輸出)

ec2.py --host ec2-54-242-141-105.compute-1.amazonaws.com
{
  "ec2_architecture": "x86_64", 
  "ec2_dns_name": "ec2-54-242-141-105.compute-1.amazonaws.com", 
  "ec2_hypervisor": "xen", 
  "ec2_id": "i-df75cea0", 
  "ec2_image_id": "ami-8a8932e3", 
  "ec2_instance_type": "m1.small", 
  "ec2_ip_address": "54.242.141.105", 
  "ec2_key_name": "jp1", 
  "ec2_launch_time": "2012-11-18T10:57:20.000Z", 
  "ec2_monitored": false, 
  "ec2_placement": "us-east-1a", 
  "ec2_root_device_type": "ebs", 
  "ec2_security_group_ids": "sg-29652b41", 
  "ec2_security_group_names": "default", 
  "ec2_virtualization_type": "paravirtual"
}

你可利用 ec2.py 清單腳本讓 Ansible 在 EC2 上與實例溝通。你只需把該執行檔安裝在 /etc/ansible/hosts 或把 $ANSIBLE_HOSTS 指向該執行檔。

它能否 ping?

$ export ANSIBLE_HOSTS=~/ec2.py
$ ansible -u root ec2-54-242-141-105.compute-1.amazonaws.com -m ping
ec2-54-242-141-105.compute-1.amazonaws.com | success >> {
    "changed": false, 
    "ping": "pong"
}

在這裡我可以把主權移交給你,你應該能成功地利用 Ansible 來安裝及設定你的 EC2 實例。但我不會就此罷放:讓我們進行一些部署。

2. Ansible 在 EC2 上啟動一個 CentOS 實例

Ansible 的 ec2 模塊 在 EC2 上建立一個實例並選擇性地等待該實例進入可用狀態。(註:可用狀態不等同完成開機 —— 這可能需時數分鐘。)建立實例的時候,我要指定用哪對 SSH 金鑰(我們為此建立一條名叫 jp1 的金鑰)、映像名稱、及一些在模塊的文檔內已描述的參數。我想特別指出一個名為 group 的參數。這就是所謂的 _安全性群組_ ,而據我所知,它指定 AWS 的防火牆。按照預設值只有 22 號埠(SSH)可進入我的實例,但我正在建立一台網頁伺服器,因此我(至少)也想用 80 號埠。

要建立一個 EC2 安全性群組,我採用以下指令:

$ euca-add-group -d "Web Servers" webs-a
$ euca-authorize -P tcp -p 80-80 -s 0.0.0.0/0 webs-a
$ euca-authorize -P tcp -p 22-22 -s 0.0.0.0/0 webs-a

你所指定的安全性群組稍後會在 Ansible 的清單(ec2.py)內顯示為一個群組。

---
- hosts:
  - 127.0.0.1
  connection: local
  gather_facts: False
  vars:
    keypair: jp1
    instance_type: m1.small
    security_group: webs-a
    image: ami-8a8932e3
    mail_from: Ansible
    mail_to: charlie
  vars_prompt:
    shortname: "What is the shortname of this host to be?"
  tasks:
  - name: Launch new EC2 instance
    local_action: ec2
        keypair=${keypair}
        group=${security_group}
        instance_type=${instance_type}
        image=${image}
        wait=true
    register: ec2
#
  - name: Send e-mail to admins
    local_action: mail
        from=${mail_from}
        to=${mail_to}
        subject="EC2 instance  ${ec2.instances[0].id}"
        body="EC2 instance ${ec2.instances[0].id} created on ${ec2.instances[0].public_ip}"

你在註冊 ec2 模塊時所取得的變數,ec2,含有以下數值,我會在寄給官理員的電郵中加入它:

{
   "instances" : [
      {
         "public_ip" : "107.22.159.172",
         "id" : "i-3d1ba042"
      }
   ],
   "changed" : true
}

讓我在 playbook 上執行 Ansible。留意我採用只含有 localhost 的簡便清單,因為這些模塊在我的 Ansible 管理機器而非遠端上運行。

$ ansible-playbook newinstances.yml 
What is the shortname of this host to be?: : web31

PLAY [127.0.0.1] ********************* 

TASK: [Launch new EC2 instance] ********************* 
changed: [127.0.0.1]

TASK: [Send e-mail to admins] ********************* 
ok: [127.0.0.1]

PLAY RECAP ********************* 
127.0.0.1                      : ok=2    changed=1    unreachable=0    failed=0    

再覆述一遍:暫時 Ansible 利用本地的模塊(即我們的管理機器)遙距地在 EC2 上建立一個 CentOS 實例並發電郵。現在我可採用一些 euca- 工具來檢視及查閱現況。

此外:請耐心等待:該 EC2 實例也許要數分鐘才能運作起來。還有:我收到郵件:

Date: Sun, 18 Nov 2012 12:51:07 +0100 (CET)
From: Ansible@c6.ww.example.com
Subject: EC2 instance i-3d1ba042

EC2 instance i-3d1ba042 created on 107.22.159.172

3. Ansible 部署 CentOS 實例

經過數分鐘後,我利用 Ansible 來部署剛運作起來的實例。作為示範,我會安裝 Apache 網頁伺服器及一個範本,免得太複雜。

---
- hosts:
  - security_group_webs-a
  user: root
  connection: paramiko
  gather_facts: false
  tasks:
  - name: Install | Apache
    action: yum pkg=httpd state=installed
  - name: Machine | Launch Apache service
    action: service name=httpd state=started enabled=true
  - name: Machine | Disable firewall (fixme)
    action: service name=iptables state=stopped enabled=false
#
  - name: Web | Install Web templates
    action: template src=templates/index.j2 dest=/var/www/html/index.html

Ansible 所觸及的主機是用 ec2.py 所列舉的群組來指定的,而我是以 root 來連線,因為我們的 jp1 SSH 金鑰是針對該用戶植入 EC2 內。當 playbook 已經運行起來,我便可以利用瀏覽器連線到 ec2-*.compute-1.amazonaws.com 主機或它的公用 IP 位址。

該實例仍在等待我們對它有所行動。我們可告訴 Ansible 今次採用另一份清單,例如:EC2 的清單,然後啟動設定的 playbook:

ANSIBLE_HOSTS=~/ec2.py ansible-playbook apache.yml 

PLAY [security_group_webs-a] ********************* 

TASK: [Install | Apache] ********************* 
changed: [ec2-107-22-159-172.compute-1.amazonaws.com]

TASK: [Machine | Launch Apache service] ********************* 
changed: [ec2-107-22-159-172.compute-1.amazonaws.com]

TASK: [Machine | Disable firewall (fixme)] ********************* 
changed: [ec2-107-22-159-172.compute-1.amazonaws.com]

TASK: [Web | Install Web templates] ********************* 
changed: [ec2-107-22-159-172.compute-1.amazonaws.com]

PLAY RECAP ********************* 
ec2-107-22-159-172.compute-1.amazonaws.com : ok=4    changed=4    unreachable=0    failed=0    

部署完成,而長駐服務也在運行中。

4. 結論

CentOS 在 EC2 上很棒,利用 Ansible 來部署 CentOS 亦然。我相信做這些事的方法很多,而你也許會採取另一個途徑。

Translation of revision 11


2023-09-11 07:23