借助Salt Cloud配置AWS EC2实例
SaltStack(http://www.saltstack.com/community/)是系统管理员们在工具箱中不可或缺的下一批基础架构管理工具之一,可以用来配置和管理数量日益庞大的服务器。
SaltStack项目于2011年启动。我们在2013年8月首次刊文介绍SaltStack;就在同一年,在拥有最多“关闭的问题” (issues closed)和“合并拉拽请求”(merged pull request)类别的所有公共软件库当中,GitHub的Octoverse在saltstack/salt软件库中名列第三。
2013年11月8日,Salt Cloud被并入到主Salt软件库,成为SaltStack 2014.1.0 Hydrogen版本的一部分。
Salt Cloud这款工具可以用来配置和管理得到支持的云服务提供商内部和之间的云服务器。比如说,系统管理员通过使用Salt Cloud配置的单个节点,就可以配置位于亚马逊网络服务(AWS)美国西海岸地区的五台新的Web服务器,配置位于Rackspace伦敦地区的三台新 的应用服务器。
本文介绍了如何借助Salt Cloud配置亚马逊弹性计算云(EC2)实例;文章还介绍了如何使用Salt Cloud的地图(Map)功能,借助单单一个命令,配置几个并行的实例。
不过本文中所用的发行版是CentOS;除了安装方面的一些微小细节外,本文探讨的详细步骤适用于EC2上、可以运行最新版SaltStack的任何发行版。
除了AWS EC2外,SaltStack还支持其他的云服务提供商,比如Digital Ocean、GoGrid、谷歌计算引擎(Google Compute Engine)、OpenStack和Rackspace。功能矩阵(http://docs.saltstack.com/en/latest /topics/cloud/features.html)列出了一张表,显示了针对每家云服务提供商的支持功能。
来自运行salt-cloud的实例、Salt Cloud命令行工具以及所配置实例的所有交互都通过SSH协议来实现。Salt Cloud不需要Salt Master守护进程。如果你想要使用Salt状态和模块来管理所配置实例,就需要设置Salt Master,这不在本文的探讨范围之内。
安装
salt-cloud命令行工具随作为EPEL一部分的salt-master 2014.1.0 RPM程序包一同发行。它应该可以安装在EC2里面的实例上。
- $ yum install salt-master
“SaltStack”团队管理Ubuntu个人软件包存档(PPA),它含有所有最新版本的Ubuntu。Salt还出现在标准的 openSUSE 13.1版本中。docs.saltstack.com提供了详尽具体的说明文档,含有说明步骤,介绍了如何针对其他发行版和平台安装Salt。
salt-cloud确实依赖Apache libcloud,这是一种可与30多家云服务提供商兼容的python库。可以使用pip命令,安装稳定版本的apache-libcloud。
- $ pip install apache-libcloud
要是没有pip命令,你可能需要先安装python-pip程序包。如果你想把apache-libcloud安装在孤立的Python环境中,首先要检查virtualenv(虚拟环境)。
EC2安全组
salt-cloud配置的每个实例都需要属于至少一个AWS EC2安全组(Security Group),该安全组允许来自端口22/tcp、始发于运行salt-cloud的实例的入站流量。我在之前的一篇文章中已介绍了如何使用awscli 工具创建安全组,详见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节点通过端口22/tcp,访问MySecurityGroupSaltCloudInstances里面的其他任何EC2节点。在我的安装环境 中,运行salt-cloud的实例属于MySecurityGroupSaltCloud安全组。你需要创建一个安全组,运行salt-cloud的实 例将属于该安全组。
EC2密钥对
salt-cloud依赖SSH协议上传和运用salt-bootstrap自动安装脚本。需要针对运行salt-cloud的实例生成SSH公钥和私钥。公钥同样需要上传到AWS EC2,成为密钥对。我在前一篇文章中也介绍了如何实现这一步。
想创建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文件里面,我已创建了一个配置文件,名为base_ec2_private;该配置文件 使用我将在接下来定义的my_ec2_ap_southeast_2_private_ips提供商。我需要指定的另外唯一一个选项是minion将运行 的那个映像的亚马逊机器映像(AMI) ID。ami-e7138ddd是CentOS.org发行、在AWS ap-southeast-2区域里面可用的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应连接到的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
我定义了用@符号封装的几个属性,它们需要上传,以适合你的环境。
@AWS_ACCESS_KEY_ID@:AWS Access Key ID属于拥有足够EC2权限以配置新实例的IAM帐户。虽然salt-cloud确实支持AWS身份与访问管理(IAM)角色,但它们只适用于所配置的 EC2 minion。静态的AWS访问密钥和秘密密钥仍被salt-cloud用来部署minion。
@AWS_SECRET_ACCESS_KEY@:属于AWS Access Key ID的AWS秘密密钥。
创建第一个salt-cloud minion
首先,你可能需要在SSH代理里面设置SSH密钥。
- $ eval `ssh-agent`
- $ ssh-add /etc/salt/my_salt_cloud_key
下一步,调用传递配置文件名称的salt-cloud,其名称与你在/etc/salt/cloud.profiles里面配置的相一致,最后一个参数是新minion的名称。
- $ salt-cloud –profile=base_ec2_private my_first_minion
salt-cloud使用SSH代理获取salt-bootstrap自动安装脚本,该脚本会安全地检测minion发行版,安装salt-minion程序包,如果你已设置好salt-master,还可以预先为salt-master提供minion的密钥。
如果成功,我们可以使用salt-cloud查询实例:
- $ salt-cloud –action=show_instance my_first_minion
salt-cloud还支持其他操作,比如查询和设定AWS EC2标记:
- $ 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
如果你已设置好了salt-master,应该能够通过salt命令行,运行标准的salt模块:
- $ salt my_first_minion cmd.run ‘/sbin/ip address show’
当然了,如果salt-master状态已设置好,你可以运用state.highstate。
- $ salt my_first_minion state.highstate
最后,我们可以使用–destroy选项销毁实例:
- $ salt-cloud –destroy my_first_minion
Salt Cloud地图
我们前面已探讨了借助salt-cloud配置单个的EC2实例。现在,我们可以延伸开来,使用Slat Cloud地图(Maps),借助单单一个salt-cloud命令,创建多个实例。
在/etc/salt/cloud.map文件里面,我定义了三台都继承base_ec2_private配置文件的Web服务器。
- 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
想终止地图里面的所有服务器,我们只要传递–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