如何使用Ansible部署网站
Ansible最著名的是配置管理。在配置新服务器时使用。我们还可以使用它来部署我们的Web应用程序。
在本教程中,我们将向我们展示如何使用Ansible部署AngularJS应用程序。我们的解决方案将利用Githib和Git标记。
身份验证和凭证
Ansible的优点在于它通过SSH起作用。我们可以提供一个简单的部署解决方案,而无需像在Puppet或者其他解决方案中那样在服务器中增加其他漏洞。
挑战在于存储凭据的位置以及如何安全地存储凭据,因为Ansible需要信息才能使连接正常工作。此外,某些任务要求使用sudo特权执行,而sudo需要另一个密码。
最简单的方法是将以下内容添加到库存文件中。
[all:vars] ansible_user=myuser ansible_pass=mypassword ansible_sudo_pass=mypassword
虽然方便,但我想我们都可以理解为什么这样做很危险。一种替代方法是将凭据放在本地计算机上的.ssh / config文件中。这可以防止它被版本控制捕获并泄露给公众。但是,此解决方案仅保护ssh登录凭据。sudo密码仍必须放在清单文件中。
保管库提供了不同的解决方案。 Ansible保管库使用SHA256进行了高度加密,如果需要共享凭据,这是一个存储凭据的好地方。由于金库可以被强行使用,因此仍然存在风险。这显然比仅提供明文凭证更好。
Ansible剧本
Ansible最简单的形式是一本剧本。剧本允许我们执行任务,这些任务可以来自内置库或者简单的shell执行。模块的一个示例是Apt,用于在Debian和Ubuntu上更新和安装软件包。
将文件部署到远程主机
在此示例中,我们将本地文件直接复制到远程主机。这是使用Ansible部署文件的最简单方法。
Ansible使用清单文件来管理和组织服务器。在执行任何操作之前,我们需要创建一个清单文件。我们将其称为文件清单。
[appserver] 192.168.57.102
每当要对一台服务器或者一组服务器运行剧本时,我们都会引用Appserver(方括号中的名称)。在其下将是应该分组在该名称下的任何服务器的IP地址或者主机名的列表。
让我们执行一个命令将静态应用程序文件复制到Apache Web服务器的/ var / www / html目录中。
ansible -v webapp -m copy -a "src=dist/ dest=/var/www/html mode=0755 owner=www-data group=www-data" -i inventory -b
这要记住很多,随着我们在部署中添加其他任务,它很快就会变得不受欢迎。相反,让我们创建一个Ansible剧本文件来为我们执行所有操作。
创建一个名为simple-deploy.yaml的新文件。向其添加以下行。
--- - host: appserver task: - name: Copy files to remote host copy: src: dist/ dest: /var/www/html owner: www-data group: www-data mode: 0755
Ansible或者其他任何配置管理工具的妙处在于,我们可以将每个步骤进行编纂,包括确保目录具有适当的特权。
让我们在剧本中添加一个额外的步骤,该步骤将创建应用程序的安装目录。
--- - host: appservers task: - name: Create install directory file: state: directory path: /var/www/html owner: www-data group: www-data mode: 0755 - name: Copy files to remote host copy: src: files/my-application dest: /opt/my-application owner: appuser group: appuser mode: 0755
为了使用我们的剧本来部署我们的应用程序,我们执行以下Ansible命令。
ansible-playbook -i inventory simple-deploy.yml
从Git存储库部署到远程主机
一种更传统的方法是从中央存储库部署代码。这可能是一个版本控制系统,例如Github或者Bitbucket,我们将在示例中使用它。它也可能来自工件库服务器,我们在其中预编译了二进制文件或者打包的tar。
该示例将从远程Github存储库的master分支中提取最新提交。
--- - host: appservers task: - name: Pull file from source git: repo: 'https://foosball.example.org/path/to/repo.git' dest: /var/www/html
将特定版本部署到远程主机
标记使我们能够从提交历史中快速识别发行版本。在此示例中,我们将从远程Git存储库中部署特定版本。
Git标签
我们应该已经知道,Git提供了一种标记特定提交的机制。这些是特定提交的人类可读描述。我们通常会标记应用程序的发行版,这就是我们在示例中所做的。
如果我们不熟悉Git,则标记与提交没有太大不同。提交更改后,这是一个添加步骤。
要标记名称为" 1.0.0"和描述为" Release 1.0.0"的最新提交,可以执行以下命令。
git tag -a "1.0.0" -m "Release 1.0.0"
标签只会在本地存储库中。为了将标签推送到远程存储库,我们需要进行推送。要执行标签推送,我们将运行以下命令。
git push --tags
--- - host: appservers task: - name: Pull file from source git: repo: 'https://foosball.example.org/path/to/repo.git' dest: /var/www/html version: 1.0.0
角色扮演
上面的示例被视为简单的部署脚本。在配置应用程序服务器的新实例时,将该部署脚本转换为Ansible角色将使我们自动完成配置应用程序服务器的整个过程。
以下是典型的Ansible角色目录结构。至少,我们只需要任务目录。
\role_name \tasks main.yml other.yml \handlers main.yml \templates apache2.conf.j2 \files foo.txt bar.crt \vars main.yml \defaults main.yml \meta main.yml
在我们的示例中,我们将创建以下结构。
\myaplication \tasks main.yml \vars main.yml
角色变量
Ansible允许我们创建可以在整个角色中使用的变量。这是存储我们的Git存储库URL和应用程序发行版的好地方。
在\ vars \ main.yml文件中,添加以下行
--- gitrepo=github.com/demouser/myapplication.git release=1.0.0 deploy_dir=/var/www/html
将这些值存储为变量有两个好处:首先,它是存储动态信息的中心位置。其次,我们可以从剧本或者命令行中覆盖这些值,以便进行自定义和快速更改。
角色任务
我们的任务几乎与本教程前面部分创建的任务相同。不同之处在于将引用我们的变量来设置信息。
--- - tasks: - name: Create app directory file: state: directory path: '{{deploy_dir}}' owner: www-data group: www-data mode: 0755 - name: Deploy app git: repo: '{{gitrepo}}' dest: '{{deploy_dir}} version: '{{release}}'
使用角色
现在,通过我们的部署脚本Ansible角色,我们可以将其添加到服务器配置手册中。
用于配置我们的服务器的手册将称为app-server-01.yml。设置过程将包括三个角色:common,apache2和myapp。后者用于我们的应用程序部署。我们的Ansible目录结构如下所示。
/devops /roles /common /apache2 /myapp /inventory production app-servers.yml
我们的清单文件将是我们添加和分组服务器的位置。在此示例中,我们有将要部署我们的应用程序的三个应用程序服务器。我们的清单文件-/ inventory / production-看起来类似于以下内容。
[app-servers] 192.168.1.34 app-server-01 192.168.1.35 app-server-02 192.168.1.36 app-server-03
我们用于应用服务器的手册将类似于以下示例。我们会注意到其中包括与我们的广告资源相匹配的app-server的名称。它还包括三个角色来代替任务部分。
--- - hosts: app-servers roles: - common - apache2 - { role: myapp, version: 1.0.0 }
我们没有为前两个角色修改和变量。但是,作为示例,我们正在展示更改角色的版本变量,而不必修改角色本身。如果我们无意更改变量,则只需添加角色名称即可,就像对common和apache2所做的那样。
设置我们的服务器和
Ansible标签
我们很有可能只想部署代码,而不想重新配置服务器。使用Ansible标签,我们可以指定要执行的角色或者任务。一个任务可以具有多个标签,以便对剧本任务进行高度精细的控制。
让我们在两个myapp任务中添加标签" deploy"。我们还将标记" predeploy"添加到创建部署目录的任务中,并将标记" gitpull"添加到Git任务中。这将使我们既可以执行两个任务,也可以执行目录创建/修改,或者执行git pull。
--- - tasks: - name: Create app directory file: state: directory path: '{{deploy_dir}}' owner: www-data group: www-data mode: 0755 tags: - predeploy - deploy - name: Deploy app git: repo: '{{gitrepo}}' dest: '{{deploy_dir}}' version: '{{release}}' tags: - gitpull - deploy
要仅执行应用程序的部署任务,我们将执行以下Ansible命令。
ansible-playbook -i inventory/production --tags 'deploy' app-server.yml
另外,如果目录权限或者所有权没有变化,我们可以使用以下命令仅执行git pull。
ansible-playbook -i inventory/production --tags 'gitpull' app-server.yml