本文摘要:作者 | Stephen Mann译者 | 无明出处丨 高效开发运维服务器设置(Server Provisioning):如何在我们的情况中安装和设置软件服务器设置在开始先容现代化的工具之前,我们来看看最基本且经由实战磨练的服务器设置工具:shell 剧本。
作者 | Stephen Mann译者 | 无明出处丨 高效开发运维服务器设置(Server Provisioning):如何在我们的情况中安装和设置软件服务器设置在开始先容现代化的工具之前,我们来看看最基本且经由实战磨练的服务器设置工具:shell 剧本。在 Chef、Ansible 或 Puppet 泛起之前,许多运营团队使用 Bash 来设置服务器(在 Windows 上则使用 PowerShell 剧本)。
例如,如果想在运行 Ubuntu 的 Amazon EC2 实例上安装 Nginx,可以使用以下剧本(install-nginx.sh):#!/bin/shssh -t ubuntu@$1 sudo apt-get upgradessh -t ubuntu@$1 sudo apt-get -y install nginx我们可以使用 shell 剧本来设置服务器上的所有工具。据我所知,所有主流的设置工具都使用了基于宁静传输层(如 SSH)的 shell 下令或 PowerShell(Chef 可能是个破例)。
纵然你使用了设置工具,在某些时候也需要用到剧本。因此,当你开始使用设置工具(如 Chef 或 Ansible)时,学习如何使用基本的 shell 剧本也会为你带来许多利益。你可能会问自己,为什么在 shell 剧本已经可以完成所有事情的同时还要学习设置工具?许多情况已经使用 shell 剧本举行服务器设置,那么为什么要使用设置工具取代它们?首先,shell 剧本通常使用的是声明性语法。
shell 剧本通过运行下令序列来安装软件,而设置工具只需要指定服务器应该安装哪些软件,这样就可以使用相同的代码在差别的操作系统上、使用差别的保证理器以及指定差别的版原来安装和设置相同的软件。其次,设置工具通常会提供用于组织基础设施的方式。虽然使用 shell 剧本也可以做到这一点,但设置工具通常会提供更简练明晰的方案。
因为是行业尺度,开发人员可以更轻松地找出 QA 情况中哪些服务器运行 RabbitMQ。第三,每个主要的设置工具都有一个蓬勃生长的社区,他们构建可复用的模块来安装大多数开源软件。你可以直接在模块设置中指定内存限制,而不需要记着 Postgres 设置文件在那里,这样可以节约许多时间。
固然,原因另有许多,这里就纷歧一例举了。只管学习曲线有点陡峭,但学习设置工具仍然是值得的。与 shell 剧本相比,设置工具更容易使用,便于思考,也更容易维护。
关于命名学习使用 Chef(服务器设置工具)的前几周给我留下了深刻的印象。入门指南展示了如何建立一个“recipe”,其中包罗安装或设置软件的说明,我能够明白这种比喻背后的寄义。recipe 必须存在于“cookbook”中,这是有原理的。
然后你在“kitchen”里测试 cookbook,但我开始有点怀疑了。这种比喻有点令人感应困惑,于是我决议去看一下其他工具,如 Ansible。Ansible 文档的第一页先容了“playbook”的观点,而 playbook 包罗一系列“play”。
那么,这些问题很重要吗?固然很重要了,因为 在学习设置工具之前,你应该知道,它们很有可能会引入大量令人费解的术语。纵然是为了完成基本的任务,你也必须重新学习许多术语。如果你是刚开始学习设置工具,我强烈建议你随时写下这些术语界说,你另有许多工具要学。
每个软件开发人员都市为现有的单词建立差别的寄义,他们甚至还会发现一些单词,好比“uninitialize”和“unregister”。这已经成为软件开发的一部门。我会只管用大家熟悉的术语来解释这些工具。设置治理你决议使用花哨的设置工具在远程服务器上安装 Nginx。
在开始设置数据库备份节点前,一切都很顺利。你已经编写了 MySQL 主服务器的设置文件,可是你不太确定如何设置 MySQL 从服务器的内部 DNS 地址。这个时候设置治理就派上用场了。
在设置服务器时,最好可以将应用法式视为由两部门组成:不行变部门(通常是代码或编译的二进制文件)和可变部门(通常是设置文件或情况变量)。大部门由社区建立的模块默认情况下会安装二进制文件,并提供尽可能合理的设置,而且会为我们袒露出一些属性,利便对其举行笼罩。这些属性通常包罗特定于用户情况的值。
大多数设置工具都为用户提供了一种机制,通过模板将特定于情况的值插入到设置文件中,或直接插入到情况变量中。你可以使用设置工具提供的设置治理来设置 MySQL 主服务器的设置文件,然后在其中设置从服务器。
Secret 治理这样就可以解决上述的问题,但厥后发现,你必须上传 AWS 凭证才气让 MySQL 从服务器会见 S3。你知道不能直接将这些凭证提交到代码库中,因此这些凭证只能存在于你的机械和 NSA 服务器上。
这个时候你需要的是 Secret 治理。与自动化领域的所有工具一样,你也有许多治理秘钥的可选项。
谷歌提供了一项名为 KMS 的服务,AWS 也提供了一项名为 Secret Manager 的服务,Chef 提供了加密数据包,Hashicorp 提供了一款名为 Vault 的产物,Ansible 也有一款名为 Vault 的产物。除了 KMS 会对字符串举行加密之外,所有这些工具都提供了相同的功效:掩护对加密秘钥的会见(这些秘钥被用在设置治理中)。有好频频,我不小心将秘钥提交到了代码库。这类事情一直在发生,而且很是危险。
切勿以明文形式存储 API 密钥或凭证。可以使用 Secret 治理解决方案来存储这些数据,然后将其绑定到设置工具中。一个简朴的例子:Chef首先需要安装 Chef Development Kit(ChefDK)。
如前所述,我们需要一个 recipe 来安装 Nginx。出于教学的目的,我们将重新开始建立它,而不是从社区的 cookbook 中捞一个出来。我们需要建立一个 cookbook。cookbook 通常存在于cookbooks目录中,在项目的根目录运行以下下令:mkdir cookbooks现在让我们建立一个 cookbook,用于放置我们的新 recipe:chef generate cookbook cookbooks/application这个下令在cookbooks/application目录中建立了许多文件,我们体贴的是cookbooks/application/recipes/default.rb这个文件。
这个文件包罗了默认的 recipe,我们将安装 Nginx 的下令放到这个文件中。apt_updatepackage ‘nginx’cookbook_file ‘/var/www/html/index.html’ do source ‘index.html’ owner ‘www-data’ group ‘www-data’ mode ‘0755’ action :createend这个文件中的前两个下令将执行你期望的操作:apt_update更新你的 aptitude 包。
package ‘nginx’使用操作系统默认保证理器安装nginx包(在这个示例中,它使用的是 aptitude)。最后一个下令将cookbooks/application/files/index.html拷贝成远程服务器上的/var/www/html/index.html,并设置文件的权限,让 Nginx 服务器可以会见它。
这个文件还不存在,所以需要建立它。首先要建立文件目录:mkdir cookbooks/application/files然后建立文件cookbooks/application/files/index.html,其中包罗以下内容:<html lang=”en-us”> <head> <title>Hello, World!</title> </head> <body> Chef has landed. </body></html>更新packer.json,加入 Chef 相关设置:{ “builders”: [{ “type”: “amazon-ebs”, “region”: “us-east-1”, “source_ami”: “ami-04169656fea786776”, “instance_type”: “t2.small”, “ssh_username”: “ubuntu”, “ami_name”: “Ubuntu 16.04 Nginx – {{timestamp}}”, “tags”: { “Image”: “application” } }], “provisioners”: [{ “type”: “chef-solo”, “cookbook_paths”: [“cookbooks”], “run_list”: [“recipe[application]”] }]}我们对之前的packer.json举行了两处更改。
首先,我们为 AMI 添加了一个Image标签。我们之前从 Packer 的输出中复制 AMI ID,并粘贴到 Terraform 代码中。
这不是一个可维护的解决方案,因为 AMI ID 会经常发生变化,而且我们不应该在每次发生变化时都要将更改推送到存储库中。相反,我们使用 Terraform 的data资源来动态读取 AMI ID(使用Image=application查询最新的 AMI)。其次,我们使用chef-solo替换了shell。
我们告诉它在那里可以找到 cookbooks 目录,以及要运行哪个 recipe。默认情况下,run_list中的recipe[COOKBOOK]条目将执行recipes/default.rb。我们也可以显式指定 explicity:recipe [COOKBOOK::RECIPE]来笼罩默认行为。
由于我们的 recipe 生存在recipes/default.rb中,所以将使用默认行为。现在开始构建我们的 AMI:packer build packer.json我们的新 AMI 有一个Image标签,现在修改terraform.tf中硬编码的 AMI,让它通过标签来查找 AMI。将以下内容添加到terraform.tf中:data “aws_ami” “web” { most_recent = true owners = [“self”] filter { name = “tag:Image” values = [“application”] } }现在使用aws_ami.web resource输出的 ID 替换aws_instance.web1和aws_instance.web2resource 中的 AMI ID:resource “aws_instance” “web1” { ami = “${data.aws_ami.web.id}” availability_zone = “us-east-1a” instance_type = “t2.small” vpc_security_group_ids = [“${aws_security_group.application.id}”] subnet_id = “${aws_subnet.private1.id}”}resource “aws_instance” “web2” { ami = “${data.aws_ami.web.id}” availability_zone = “us-east-1b” instance_type = “t2.small” vpc_security_group_ids = [“${aws_security_group.application.id}”] subnet_id = “${aws_subnet.private2.id}”}运行下面的下令建立 Chef 设置的服务器,然后启动浏览器,打开地址为负载平衡器的域名:terraform plan -out terraform.planterraform apply “terraform.plan”open “http://$(terraform output dns)”你应该能够在打开的浏览器页面上看到:Chef has landed!一个简朴的例子:Ansible让我们使用 Ansible 来构建这个相同的示例。
首先需要安装 Ansible(https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html#installing-the-control-machine)。Ansible 将安装和设置说明组织到tasks中,然后将tasks组织到playbook中。
让我们为 playbook 建立一个目录结构。mkdir playbookmkdir playbook/files这并不是组织 Ansible playbook 的最佳实践。因为我们的用例很简朴,所以使用了简化版本。
如果你对 Ansible 感兴趣,应该凭据官方提供的建议来构建 playbook(https://docs.ansible.com/ansible/latest/user_guide/playbooks_best_practices.html)。在playbook/application.yml中建立 playbook,内容如下:—- hosts: all gather_facts: False become: yes pre_tasks: – name: Install Python 2.7 raw: test -e /usr/bin/python || (apt -y update && apt install -y python-minimal)- hosts: applications become: yes tasks: – name: Install Nginx apt: name: nginx state: present update_cache: yes – name: Update contents of index.html copy: src: index.html dest: /var/www/html/index.html owner: www-data group: www-data mode: 0755这个 playbook 文件包罗设置我们的服务器所需的所有信息。
现在让我们来讨论一下它的结构。每个 playbook 包罗一个“play”列表,每个 play 包罗一个“tasks”列表,task 用于安装和设置软件。
我们的 playbook 包罗两个 play。第一个 play 在 Ubuntu 上安装 Python 2.7(用于运行 Ansible)。第二个 play 安装和设置 Nginx。
我们在每个 play 的根节点设置了两个参数:hosts和become。hosts参数告诉 Ansible 应该在哪台机械上运行 playbook(“all”表现在所有机械上运行)。
become:yes表现 Ansible 将通过 sudo 运行所有下令,否则将会泛起许多权限错误。play 的第一个 task 卖力安装和设置 Nginx,它将更新 aptitude 缓存,并确保nginx包存在。如果已经安装了nginx包,这个下令将不执行任何操作。第二个 task 将files/index.html拷贝到远程服务器上,并为其分配正确的权限。
这个文件还不存在,所以让我们建立它。将以下内容加入到playbook/files/index.html中:<html lang=”en-us”> <head> <title>Hello, World!</title> </head> <body> Ansible has landed. </body></html>这就是我们设置 Ansible 所需的全部内容。现在让 Packer 使用这个设置。
使用以下内容更新packer.json:{ “builders”: [{ “type”: “amazon-ebs”, “region”: “us-east-1”, “source_ami”: “ami-04169656fea786776”, “instance_type”: “t2.small”, “ssh_username”: “ubuntu”, “ami_name”: “Ubuntu 16.04 Nginx – {{timestamp}}”, “tags”: { “Image”: “application” } }], “provisioners”: [{ “type”: “ansible”, “playbook_file”: “./playbook/application.yml”, “host_alias”: “applications” }]}我们只修改了使用 Ansible 作为设置器,需要提供一个指向 playbook 文件的路径,我们将其设置为./playbook/application.yml。我们可以看到用于安装 Nginx 的 play 顶部有一行:hosts: applications。
这是我们用来告诉 Ansible 需要安装应用法式的主机别名。我们需要告诉 Packer 我们正在为其中一个主机构建映像,所以我们将host_alias属性设置为applications。运行下面的下令来建立 Ansible 设置的服务器,然后启动浏览器,打开地址为负载平衡器的域名:packer build packer.jsonterraform plan -out terraform.planterraform apply “terraform.plan”open “http://$(terraform output dns)”你应该可以在打开的浏览器页面上看到:Ansible has landed!英文原文:http://stephenmann.io/post/a-brief-introduction-to-provisioning/。
本文关键词:华体育官网app
本文来源:华体育官网app-www.fairypays.com