使用Packer&Ansible进行配置和变更管理

本文介绍了使用Packer构建机器映像并使用Ansible作为Packer脚本的预配置程序来自动执行配置和变更管理的过程。 该映像将在Amazon AWS上构建,随后用于为React应用程序预配置Amazon EC2实例。

配置和变更管理:
软件开发需要持续不断的功能更新或添加新功能的周期,这通常会转化为DevOps工程师对产品基础架构的扩展,以确保产品的正确部署和功能。
配置和变更管理是两个不同但互补的概念。 配置管理 用作产品,流程,计划,基准的版本控制系统,并负责在按比例放大或缩小时应如何处理更改。 所做的更改包括已应用于已安装的软件包的版本和更新,以及硬件设备的位置和网络地址。 变更管理着重于如何对流程或控制进行变更。

服务器配置和变更管理的优点:
可靠性:它确保系统的配置得到良好定义,而不是依靠DevOps工程师或团队的模糊想法。 该系统确保了处理变更所需的需求的明确性,从而避免了问题。 发生故障时,由于适当的文档记录和流程自动化,可以快速恢复系统。
组织:有了文档化的系统,就可以轻松连接过去的基础架构记录并做出明智的决定以应对未来的变化。
降低成本和风险:系统配置的大量知识基础可确保系统的有效维护,并避免浪费基础架构。

配置管理工具:
所要采用的配置管理工具的选择是相对于操作环境和要解决的问题而言的。 以下是一些配置管理工具:
Ansible:这是一种开源的自动化软件,基于流行的Python语言构建,用于供应,配置管理和应用程序部署。
Vagrant:这是一个开源工具,可用于创建和配置可复制的虚拟开发环境。 它基于Ruby构建,并在VirtualBox,VMware等虚拟化产品之上运行。
还有许多其他配置管理工具,此处未提及。

使用PACKER构建机器图像并在AWS上兼容
如果您在macOS上使用Homebrew,请使用以下命令安装Packer:
$ brew install packer
如果您在Windows计算机上使用Chocolatey,请使用
$ choco install packer
我们将使用从packer hashicorp网站获得并经过修改以适合本撰写中描述的应用程序的打包器模板构建AWS机器映像。
首先是创建一个.env文件,其中应包含您的AWS账户的密钥和访问ID。 请遵循以下格式:

 导出AWS_ACCESS_KEY_ID = 
导出AWS_SECRET_ACCESS_KEY =
导出AWS_REGION =

注意:创建一个.gitignore文件并向其中添加.env文件,这样它就不会被推送到Github存储库中。
下一步是创建一个名为packer的目录,并创建一个名为template.json的文件。 该文件应包含以下脚本:

  { 
“变量”:{
“ aws_access_key”:“ {{env`AWS_ACCESS_KEY_ID`}}”,
“ aws_secret_key”:“ {{env`AWS_SECRET_ACCESS_KEY`}}”
“ aws_region”:“ {{env`AWS_REGION`}}”
},
“推”: {
“ name”:“ packer-terraform / frontend
},
“建筑商”:[{
“ type”:“ amazon-ebs”,
“ access_key”:“ {{user`aws_access_key`}}”,
“ secret_key”:“ {{user`aws_secret_key`}}”,
“ region”:“ {{user`aws_region`}}”,
“ source_ami_filter”:{
“过滤器”:{
“虚拟化类型”:“ hvm”,
“名称”:“ ubuntu / images / * ubuntu-xenial-16.04-amd64-server- *”,
“根设备类型”:“ ebs”
},
“所有者”:[“ 099720109477”],
“ most_recent”:是
},
“ instance_type”:“ t2.micro”,
“ ssh_username”:“ ubuntu”,
“ ami_name”:“ frontend-app”
}],
“供应商”:[{
“ type”:“ shell”,
“脚本”:“ ../ansible/install_ansible.sh”
},{
“ type”:“ ansible”,
“ playbook_file”:“ ../ ansible / ansible_playbook.yml”
}]
}

上面的模板文件包含几个表示应用程序环境细节的键值对。 关键字在此处的打包程序文档中进行了说明。
如前所述,Ansible将与Packer一起使用以预配映像。
创建一个名为ansible的目录。 它应该包含两个文件; install_ansible.sh和ansible_playbook.yml。 顾名思义,install_ansible是一个shell脚本,可用于将ansible安装到Amazon EC2实例中,并在创建机器映像时对其进行预配置。 这使得ansible模块可以在EC2实例中使用。 install_ansible文件应包含:

  installAnsible(){ 
sudo apt-get更新-y
sudo apt-get install software-properties-common -y
须藤apt-add-repository ppa:ansible / ansible -y
sudo apt-get更新-y
sudo apt-get install ansible -y
}
  installAnsible 

使用以下脚本填充ansible_playbook:

  --- 
-主持人:全部
remote_user:ubuntu
成为方法:须藤
成为:真实
vars:
project_name:“作者避风港前端应用程序”
project_path:/ home / ubuntu / balder-ah-frontend
sites_available:/ etc / nginx / sites-available
sites_enabled:/ etc / nginx / sites-enabled”
sites_available_balder:/ etc / nginx / sites-available / balder
sites_enabled_balder:/ etc / nginx / sites-enabled / balder
PM2_PATH:$ PATH:/ usr / bin / usr / lib / node_modules / pm2 / bin / pm2启动系统d -u ubuntu --hp / home / ubuntu
任务:
-名称:重置apt列表的内容
外壳:|
须藤rm -rf / var / lib / apt / lists / *
sudo apt-get更新
-名称:获取Nodejs gpg密钥
apt_key:
网址:“ https://deb.nodesource.com/gpgkey/nodesource.gpg.key”
状态:存在
-名称:安装Nodejs版本10二进制文件
apt_repository:
回购:“ deb https://deb.nodesource.com/node_10.x {{ansible_distribution_release}}主要”
状态:存在
-名称:安装节点
易于:
名称:nodejs
状态:存在
-名称:克隆存储库
git:
回购:https://github.com/andela/balder-ah-frontend.git
目标:“ {{project_path}}”
-名称:安装节点软件包
外壳:|
npm install node-pre-gyp -ES --unsafe-perm = true
npm i -ES --unsafe-perm = true
args:
chdir:“ {{project_path}}”
-名称:构建应用
Shell:npm运行构建
args:
chdir:“ {{project_path}}”
-名称:安装Nginx
易于:
名称:nginx
状态:最新
-名称:删除Nginx默认文件
文件:
路径:“ {{sites_available}} /默认”
状态:不存在
-名称:配置Nginx服务器
外壳:|
回声“
服务器{
听80;
地点 / {
proxy_pass http://127.0.0.1:3000;
}
}
”> {{sites_available_balder}}
-名称:更新nginx符号链接
文件:
src = {{sites_available_balder}}
dest = {{sites_enabled_balder}}
状态=链接
-名称:启动nginx
服务:
名称:nginx
状态:开始
-名称:安装pm2以在后台运行应用
外壳:npm install pm2 -g
-名称:创建pm2启动脚本
外壳:|
cd / home / ubuntu / balder-ah-frontend
回声
{
“应用”: [{
“ name”:“ authors-haven”,
“ script”:“ npm”,
“ args”:“运行开始:dev”
}]
}
'> start_script.config.json
-名称:从pm2启动应用
外壳:|
cd / home / ubuntu / balder-ah-frontend
sudo pm2 start ./start_script.config.json
睡觉10
sudo pm2启动
sudo env PATH = {{PM2_PATH}}
sudo pm2保存

使用ansible剧本很容易,因为它具有内置模块,可以用一些代码来实现不同的任务。 有关模块的完整列表和说明,请参见此处。

要构建映像,请创建一个名为build.sh的文件并填充。

  。  .env 
打包器构建packer / template.json

上面的第一行将提供env文件,而第二行将构建计算机映像。 要触发构建,请使用bash运行以下命令,并在构建映像时查看终端上的输出。

  $ bash build.sh 

使用您创建的AMI设置EC2实例
构建映像后,转到您的Amazon EC2仪表板,然后单击AMI选项卡。 从这里,您可以启动映像并使用分配给EC2实例的公共IP地址访问应用程序。 请遵循以下指南:

  • 在您的AWS控制台中(确保您位于与创建映像相同的区域中),单击顶部菜单上的Services,然后选择EC2。
  • 导航到左侧菜单,在“图像”下,单击“ AMI”。
  • 从显示给您的图像列表中,识别刚刚创建的图像并选择它。 单击启动。
  • 选择一个实例类型,然后选择“下一步:配置实例详细信息”。 由于映像是使用此instance_type构建的,因此默认情况下将选择t2.micro
  • 单击下一步:添加存储
  • 单击下一步:添加标签
  • 添加标签(可选),然后继续创建安全组。
  • 在“端口范围”列中,输入应用程序运行所在的端口。
  • 将源IP设置为0.0.0.0/0,以允许来自所有源的流量。
  • 单击“查看并启动”以查看您的设置。
  • 然后单击启动。
  • 选择一个现有的密钥对或创建一个新的密钥对,选择“确认协议”框,然后选择“启动实例”。
  • 导航到EC2仪表板,然后单击实例以查看您刚刚创建的实例。
  • 从显示的列表中单击实例。
  • 复制IP地址并将其粘贴到浏览器URL中以访问该应用程序。

GitHub回购链接:https://github.com/marcdomain/Configuration-and-Change-Management-with-Packer-and-Ansible