如何借助Salt Cloud配置AWS EC2實例?
譯文SaltStack(http://www.saltstack.com/community/)是系統(tǒng)管理員們在工具箱中不可或缺的下一批基礎(chǔ)架構(gòu)管理工具之一,可以用來配置和管理數(shù)量日益龐大的服務(wù)器。
SaltStack項目于2011年啟動。我們在2013年8月***刊文介紹SaltStack;就在同一年,在擁有最多“關(guān)閉的問題”(issues closed)和“合并拉拽請求”(merged pull request)類別的所有公共軟件庫當(dāng)中,GitHub的Octoverse在saltstack/salt軟件庫中名列第三。
2013年11月8日,Salt Cloud被并入到主Salt軟件庫,成為SaltStack 2014.1.0 Hydrogen版本的一部分。
Salt Cloud這款工具可以用來配置和管理得到支持的云服務(wù)提供商內(nèi)部和之間的云服務(wù)器。比如說,系統(tǒng)管理員通過使用Salt Cloud配置的單個節(jié)點,就可以配置位于亞馬遜網(wǎng)絡(luò)服務(wù)(AWS)美國西海岸地區(qū)的五臺新的Web服務(wù)器,配置位于Rackspace倫敦地區(qū)的三臺新的應(yīng)用服務(wù)器。
本文介紹了如何借助Salt Cloud配置亞馬遜彈性計算云(EC2)實例;文章還介紹了如何使用Salt Cloud的地圖(Map)功能,借助單單一個命令,配置幾個并行的實例。
不過本文中所用的發(fā)行版是CentOS;除了安裝方面的一些微小細節(jié)外,本文探討的詳細步驟適用于EC2上、可以運行***版SaltStack的任何發(fā)行版。
除了AWS EC2外,SaltStack還支持其他的云服務(wù)提供商,比如Digital Ocean、GoGrid、谷歌計算引擎(Google Compute Engine)、OpenStack和Rackspace。功能矩陣(http://docs.saltstack.com/en/latest/topics/cloud/features.html)列出了一張表,顯示了針對每家云服務(wù)提供商的支持功能。
來自運行salt-cloud的實例、Salt Cloud命令行工具以及所配置實例的所有交互都通過SSH協(xié)議來實現(xiàn)。Salt Cloud不需要Salt Master守護進程。如果你想要使用Salt狀態(tài)和模塊來管理所配置實例,就需要設(shè)置Salt Master,這不在本文的探討范圍之內(nèi)。
安裝
salt-cloud命令行工具隨作為EPEL一部分的salt-master 2014.1.0 RPM程序包一同發(fā)行。它應(yīng)該可以安裝在EC2里面的實例上。
- $ yum install salt-master
“SaltStack”團隊管理Ubuntu個人軟件包存檔(PPA),它含有所有***版本的Ubuntu。Salt還出現(xiàn)在標(biāo)準(zhǔn)的openSUSE 13.1版本中。docs.saltstack.com提供了詳盡具體的說明文檔,含有說明步驟,介紹了如何針對其他發(fā)行版和平臺安裝Salt。
salt-cloud確實依賴Apache libcloud,這是一種可與30多家云服務(wù)提供商兼容的python庫。可以使用pip命令,安裝穩(wěn)定版本的apache-libcloud。
- $ pip install apache-libcloud
要是沒有pip命令,你可能需要先安裝python-pip程序包。如果你想把apache-libcloud安裝在孤立的Python環(huán)境中,首先要檢查virtualenv(虛擬環(huán)境)。
EC2安全組
salt-cloud配置的每個實例都需要屬于至少一個AWS EC2安全組(Security Group),該安全組允許來自端口22/tcp、始發(fā)于運行salt-cloud的實例的入站流量。我在之前的一篇文章中已介紹了如何使用awscli工具創(chuàng)建安全組,詳見http://www.linux.com/learn/tutorials/761430-an-introduction-to-the-aws-command-line-tool。
- $ aws ec2 create-security-group \
- --group-name MySecurityGroupSaltCloudInstances \
- --description "The Security Group applied to all salt-cloud instances"
- $ aws ec2 authorize-security-group-ingress \
- --group-name MySecurityGroupSaltCloudInstances \
- --source-group MySecurityGroupSaltCloud \
- --protocol tcp --port 22
authorize-security-group-ingress命令允許MySecurityGroupSaltCloud安全組里面的任何EC2節(jié)點通過端口22/tcp,訪問MySecurityGroupSaltCloudInstances里面的其他任何EC2節(jié)點。在我的安裝環(huán)境中,運行salt-cloud的實例屬于MySecurityGroupSaltCloud安全組。你需要創(chuàng)建一個安全組,運行salt-cloud的實例將屬于該安全組。
EC2密鑰對
salt-cloud依賴SSH協(xié)議上傳和運用salt-bootstrap自動安裝腳本。需要針對運行salt-cloud的實例生成SSH公鑰和私鑰。公鑰同樣需要上傳到AWS EC2,成為密鑰對。我在前一篇文章中也介紹了如何實現(xiàn)這一步。
想創(chuàng)建SSH私鑰和SSH公鑰:
- $ ssh-keygen -f /etc/salt/my_salt_cloud_key -t rsa -b 4096
- $ aws ec2 import-key-pair --key-name my_salt_cloud_key \
- --public-key-material file:///etc/salt/my_salt_cloud_key.pub
Salt Cloud配置文件
Salt Cloud配置文件(Profile)為一組將由salt-cloud配置和管理的salt minion定義了一些基本的配置項。
在下面的/etc/salt/cloud.profiles文件里面,我已創(chuàng)建了一個配置文件,名為base_ec2_private;該配置文件使用我將在接下來定義的my_ec2_ap_southeast_2_private_ips提供商。我需要指定的另外唯一一個選項是minion將運行的那個映像的亞馬遜機器映像(AMI) ID。ami-e7138ddd是CentOS.org發(fā)行、在AWS ap-southeast-2區(qū)域里面可用的CentOS 6.5映像的AMI ID。
- base_ec2_private:
- provider: my_ec2_ap_southeast_2_private_ips
- image: ami-e7138ddd
Salt Cloud提供商
salt-cloud提供商定義了AWS EC2實例使用的一系列屬性。
下面是我用來定義my_ec2_ap_southeast_2_private_ips提供商的/etc/salt/cloud.providers文件。該提供商被我的my base_ec2_private配置文件所使用。
my_ec2_ap_southeast_2_private_ips:
- # salt-cloud應(yīng)連接到的IP地址
- ssh_interface: private_ips
- # AWS登錄信息
- id: @AWS_ACCESS_KEY_ID@
- key: '@AWS_SECRET_ACCESS_KEY@'
- # SSH密鑰
- keyname: my_salt_cloud_key
- private_key: /etc/salt/my_salt_cloud_key
- # AWS位置
- location: ap-southeast-2
- availability_zone: ap-southeast-2a
- # AWS安全組
- securitygroup: MySecurityGroupSaltCloudInstances
- # AWS AMI
- size: Micro Instance
- # minion被銷毀后,刪除AWS根卷
- del_root_vol_on_destroy: True
- # 本地用戶
- ssh_username: root
- # 一旦銷毀,就更名
- rename_on_destroy: True
- provider: ec2
我定義了用@符號封裝的幾個屬性,它們需要上傳,以適合你的環(huán)境。
@AWS_ACCESS_KEY_ID@:AWS Access Key ID屬于擁有足夠EC2權(quán)限以配置新實例的IAM帳戶。雖然salt-cloud確實支持AWS身份與訪問管理(IAM)角色,但它們只適用于所配置的EC2 minion。靜態(tài)的AWS訪問密鑰和秘密密鑰仍被salt-cloud用來部署minion。
@AWS_SECRET_ACCESS_KEY@:屬于AWS Access Key ID的AWS秘密密鑰。
創(chuàng)建***個salt-cloud minion
首先,你可能需要在SSH代理里面設(shè)置SSH密鑰。
- $ eval `ssh-agent`
- $ ssh-add /etc/salt/my_salt_cloud_key
下一步,調(diào)用傳遞配置文件名稱的salt-cloud,其名稱與你在/etc/salt/cloud.profiles里面配置的相一致,***一個參數(shù)是新minion的名稱。
- $ salt-cloud --profile=base_ec2_private my_first_minion
salt-cloud使用SSH代理獲取salt-bootstrap自動安裝腳本,該腳本會安全地檢測minion發(fā)行版,安裝salt-minion程序包,如果你已設(shè)置好salt-master,還可以預(yù)先為salt-master提供minion的密鑰。
如果成功,我們可以使用salt-cloud查詢實例:
- $ salt-cloud --action=show_instance my_first_minion
salt-cloud還支持其他操作,比如查詢和設(shè)定AWS EC2標(biāo)記:
- $ salt-cloud --action=get_tags my_first_minion
- $ salt-cloud --action=set_tags my_first_minion environment=devel \
- role=webserver
我們可以啟用和禁用EC2終止保護(Termination Protection):
- $ salt-cloud --action=show_term_protect my_first_minion
- $ salt-cloud --action=enable_term_protect my_first_minion
- $ salt-cloud --action=disable_term_protect my_first_minion
我們還可以重啟minion:
- $ salt-cloud --action=reboot my_first_minion
如果你已設(shè)置好了salt-master,應(yīng)該能夠通過salt命令行,運行標(biāo)準(zhǔn)的salt模塊:
- $ salt my_first_minion cmd.run '/sbin/ip address show'
當(dāng)然了,如果salt-master狀態(tài)已設(shè)置好,你可以運用state.highstate。
- $ salt my_first_minion state.highstate
***,我們可以使用--destroy選項銷毀實例:
- $ salt-cloud --destroy my_first_minion
Salt Cloud地圖
我們前面已探討了借助salt-cloud配置單個的EC2實例?,F(xiàn)在,我們可以延伸開來,使用Slat Cloud地圖(Maps),借助單單一個salt-cloud命令,創(chuàng)建多個實例。
在/etc/salt/cloud.map文件里面,我定義了三臺都繼承base_ec2_private配置文件的Web服務(wù)器。
- base_ec2_private:
- - web1_prod
- - web2_prod
- - web3_prod
想配置所有三個實例,我只需要傳遞--map選項連同地圖文件的位置。另外包括--parallel,地圖里面的所有實例將同時被配置。
- $ salt-cloud --map=/etc/salt/cloud.map --parallel
一旦配置完畢,我們就可以借助salt-cloud,查詢地圖里面的所有實例。
- $ salt-cloud --map=/etc/salt/cloud.map --query
想終止地圖里面的所有服務(wù)器,我們只要傳遞--destroy選項。
- $ salt-cloud --map=/etc/salt/cloud.map –destroy
英文:http://www.linux.com/learn/tutorials/772719-how-to-provision-aws-ec2-instances-with-salt-cloud