如何使用Ansible部署网站

时间:2020-01-09 10:34:22  来源:igfitidea点击:

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