SaltStack(http://www.saltstack.com/community/)是系统管理员必须在其工具箱中配置和管理越来越多的服务器的下一批基础设施管理工具之一。SaltStack项目始于2011年,我们在2013年8月首次发表了一篇关于SaltStack的文章;同年,在所有“关闭的问题”和“合并的拉取请求”类别最多的公共存储库中,GitHub的Octoverse在saltstack/salt软件存储库中排名第三。2013年11月8日,SaltCloud作为SaltStack2014.1.0Hydrogen版本的一部分合并到主Salt存储库中。SaltCloud是一种工具,可用于在支持的云服务提供商内部和之间配置和管理云服务器。例如,系统管理员可以使用SaltCloud配置的单个节点配置位于AmazonWebServices(AWS)美国西海岸区域的五个新Web服务器和位于RackspaceLondon区域的三个新应用程序服务器。本文介绍如何使用SaltCloud配置AmazonElasticComputeCloud(EC2)实例;文章还介绍了如何使用SaltCloud的映射(Map)功能通过一条命令配置多个并行实例。不过本文使用的发行版是CentOS;除了一些次要的安装细节外,本文中讨论的详细步骤适用于EC2上可以运行最新版本SaltStack的任何发行版。除了AWSEC2,SaltStack还支持其他云服务提供商,如DigitalOcean、GoGrid、谷歌计算引擎(GoogleComputeEngine)、OpenStack和Rackspace。功能矩阵(http://docs.saltstack.com/en/latest/topics/cloud/features.html)列出了一个表格,其中显示了每个云服务提供商支持的功能。来自运行salt-cloud的实例、SaltCloud命令行工具和配置的实例的所有交互都是通过SSH协议进行的。SaltCloud不需要SaltMaster守护进程。如果你想使用Salt状态和模块来管理配置的实例,你需要设置一个SaltMaster,这超出了本文的范围。安装salt-cloud命令行工具附带作为EPEL的一部分分发的salt-master2014.1.0RPM包。它应该可以安装在EC2内的实例上。$yuminstallsalt-master“SaltStack”团队管理着Ubuntu个人包存档(PPA),其中包含所有最新版本的Ubuntu。Salt也存在于标准的openSUSE13.1版本中。docs.saltstack.com提供了详细的文档,其中包含有关如何为其他发行版和平台安装Salt的分步说明。salt-cloud确实依赖于Apachelibcloud,这是一个与30多个云服务提供商兼容的python库。您可以使用pip命令安装稳定版本的apache-libcloud。$pipinstallapache-libcloud如果没有pip命令,可能需要先安装python-pip包。如果要在隔离的Python环境中安装apache-libcloud,首先检查virtualenv(虚拟环境)。EC2安全组salt-cloud配置的每个实例都需要属于至少一个AWSEC2安全组(安全组),该安全组允许来自端口22/tcp的入站流量源自运行salt-cloud的实例。我在之前的文章中介绍过如何使用awscli工具创建安全组,参见http://www.linux.com/learn/tutorials/761430-an-introduction-to-the-aws-command-line-工具。$awsec2create-security-group\--group-nameMySecurityGroupSaltCloudInstances\--description"TheSecurityGroupappliedtoallsalt-cloudinstances"$awsec2authorize-security-group-ingress\--group-nameMySecurityGroupSaltCloudInstances\--source-groupMySecurityGroupSaltCloud--port2-group-ingress命令允许MySecurityGroupSaltCloud安全组中的任何EC2节点通过端口22/tcp访问MySecurityGroupSaltCloudInstances中的任何其他EC2节点。在我的安装中,运行salt-cloud的实例属于MySecurityGroupSaltCloud安全组。您需要创建一个安全组,运行salt-cloud的实例将属于该安全组。EC2密钥对salt-cloud依赖SSH协议上传使用salt-bootstrap自动安装脚本。运行salt-cloud的实例需要生成SSH公钥和私钥。公钥也需要作为密钥对上传到AWSEC2。我还在上一篇文章中描述了如何实现这一步。想要创建SSH私钥和SSH公钥:$ssh-keygen-f/etc/salt/my_salt_cloud_key-trsa-b4096$awsec2import-key-pair--key-namemy_salt_cloud_key\--public-key-materialfile:///etc/salt/my_salt_cloud_key.pubSaltCloudProfileSaltCloud配置文件(Profile)为一组将由salt-cloud配置和管理的saltminions定义了一些基本配置项。在下面的/etc/salt/cloud.profiles文件中,我创建了一个名为base_ec2_private的配置文件;此配置文件使用我接下来将定义的my_ec2_ap_southeast_2_private_ips提供程序。我需要指定的唯一其他选项是minion将在其上运行的映像的Amazon系统映像(AMI)ID。ami-e7138ddd是由CentOS.org发布并在AWSap-southeast-2区域可用的CentOS6.5映像的AMIID。base_ec2_private:provider:my_ec2_ap_southeast_2_private_ipsimage:ami-e7138dddSaltCloudprovidersalt-cloudprovider定义了AWSEC2实例使用的一组属性。下面是我用来定义my_ec2_ap_southeast_2_private_ips提供商的/etc/salt/cloud.providers文件。我的base_ec2_private配置文件使用此提供程序。my_ec2_ap_southeast_2_private_ips:#salt-cloud应该连接到ssh_interface:private_ips的IP地址southeast-2availability_zone:ap-southeast-2a#AWS安全组securitygroup:MySecurityGroupSaltCloudInstances#AWSAMIsize:MicroInstance#minion销毁后,删除AWS根卷del_root_vol_on_destroy:True#Localuserssh_username:root#一旦销毁,rename_on_destroy:Trueprovider:ec2我定义了一些包含在@符号中的属性,需要上传这些属性以适应您的环境。@AWS_ACCESS_KEY_ID@:属于IAM账户的AWS访问密钥ID,该账户具有足够的EC2权限来配置新实例。虽然salt-cloud确实支持AWSIdentityandAccessManagement(IAM)角色,但它们仅适用于已配置的EC2minions。salt-cloud仍然使用静态AWS访问密钥和秘密密钥来部署minions。@AWS_SECRET_ACCESS_KEY@:属于AWSAccessKeyID的AWS秘钥。创建第一个salt-cloudminion首先,您可能需要在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_privatemy_first_minionssalt-cloud使用SSH代理获取salt-bootstrap自动安装脚本,它将安全地检测minion分布并安装salt-minion包。如果设置了salt-master,也可以提前将minion的key提供给salt-master。如果成功,我们可以使用salt-cloud来查询实例:$salt-cloud--action=show_instancemy_first_minionssalt-cloud还支持其他操作,比如查询和设置AWSEC2标签:$salt-cloud--action=get_tagsmy_first_minion$salt-cloud--action=set_tagsmy_first_minionenvironment=devel\role=webserver我们可以启用和禁用EC2终止保护:disable_term_protectmy_first_minion我们也可以重启minion:$salt-cloud--action=rebootmy_first_minion如果你设置了salt-master,你应该可以通过salt命令行运行标准的salt模块:$saltmy_first_minioncmd.run'/sbin/ipaddressshow'当然现在,如果设置了salt-master状态,您可以使用state.highstate。$saltmy_first_minionstate.highstate***,我们可以使用--destroy选项来销毁实例:$salt-cloud--destroymy_first_minionSaltCloudmap我们之前已经讨论过使用salt-cloud配置单个EC2实例。现在,我们可以扩展它并使用SlatCloudMaps(地图)通过单个salt-cloud命令创建多个实例。在/etc/salt/cloud.map文件中,我定义了三个Web服务器,它们都继承了base_ec2_private配置文件。base_ec2_private:-web1_prod-web2_prod-web3_prod要配置所有三个实例,我只需要传递--map选项以及地图文件的位置。还包括--parallel,地图中的所有实例将同时配置。$salt-cloud--map=/etc/salt/cloud.map--parallel配置好后,我们就可以使用salt-cloud查询map中的所有实例了。$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-盐云
