如何在Ubuntu14.04上使用Ansible部署多个PHP应用程序

来自菜鸟教程
跳转至:导航、​搜索

介绍

本教程是关于在 Ubuntu 14.04 上使用 Ansible 部署 PHP 应用程序的系列教程的第三篇。 第一篇教程涵盖了部署应用程序的基本步骤; 第二篇教程 涵盖了更高级的主题,例如数据库、队列守护进程和任务调度程序 (crons)。

在本教程中,我们将通过将我们的单应用程序 Ansible playbook 转换为支持在一个或多个服务器上部署多个 PHP 应用程序的 playbook 来构建我们在之前的教程中学到的内容。 这是使用 Ansible 轻松部署应用程序的最后一块拼图。

我们将使用几个简单的 Lumen 应用程序作为示例的一部分。 但是,如果您已经拥有自己的框架和应用程序,可以轻松修改这些说明以支持其他框架和应用程序。 建议您使用示例应用程序,直到您可以对剧本进行更改。

先决条件

要遵循本教程,您将需要:

  • 按照本系列中的 firstsecond 教程设置两个 Droplet。
  • 一个新的(第三个)Ubuntu 14.04 Droplet 设置类似于 第一个教程 中的原始 PHP Droplet,具有 sudo 非 root 用户和 SSH 密钥。 这个 Droplet 将用于展示如何使用一个 Ansible playbook 将多个应用程序部署到多个服务器。 我们将原始 PHP Droplet 和这个新 PHP Droplet 的 IP 地址分别称为 your_first_server_ipyour_second_server_ip
  • 本地计算机上更新的 /etc/hosts 文件,添加了以下行。 您可以在本教程 步骤 6 中了解有关此文件的更多信息。

在 /etc/hosts 中的任意位置添加的行

your_first_server_ip laravel.example.com one.example.com two.example.com
your_second_server_ip laravel.example2.com two.example2.com

我们将在本教程中使用的示例网站是 laravel.example.comone.example.comtwo.example.com。 如果您想使用自己的域,则需要更新您的 活动 DNS 记录

第 1 步 — 设置剧本变量

在这一步中,我们将设置剧本变量来定义我们的新应用程序。

在之前的教程中,我们对所有配置细节进行了硬编码,这对于许多为特定应用程序执行特定任务的 playbook 来说是正常的。 但是,当您希望支持多个应用程序或扩大剧本的范围时,对所有内容进行硬编码不再有意义。

正如我们之前看到的,Ansible 提供了可以在任务定义和文件模板中使用的变量。 我们还没有看到如何手动设置变量。 在剧本的顶部,除了 hoststasks 参数,您可以定义 vars 参数,并在那里设置变量。

如果您还没有这样做,请将目录更改为前面教程中的 ansible-php

cd ~/ansible-php/

打开我们现有的剧本进行编辑。

nano php.yml

文件的顶部应如下所示:

原始 php.yml 的顶部

---
- hosts: php
  sudo: yes

  tasks:
. . .

要定义变量,我们可以在 hostssudotasks 旁边添加一个 vars 部分。 为简单起见,我们将从 www-data 用户名的一个非常基本的变量开始,如下所示:

更新了 php.yml 中的变量

---
- hosts: php
  sudo: yes

  vars:
    wwwuser: www-data

  tasks:
. . .

接下来,使用新变量 模板:Wwwuser 更新所有出现的 www-data 用户。 这种格式应该很熟悉,因为我们已经在查找和查找中使用了它。

要使用 nano 查找和替换,请按 CTRL+\。 你会看到一个提示,上面写着 Search (to replace):。 输入 www-data ,然后按 ENTER。 提示将更改为 替换为:。 在这里,输入 模板:Wwwuser 并再次按 ENTER。 Nano 将带您浏览 www-data 的每个实例并询问 替换这个实例?。 您可以按y逐个替换,或按a全部替换。

注意:确保我们刚刚在顶部添加的变量声明也没有改变。 应该有 11 个 www-data 实例需要替换。

在我们走得更远之前,在涉及变量时,我们需要注意一些事情。 通常我们可以像这样添加它们,当它们在较长的行内时:

php.yml 中的示例任务

- name: create /var/www/ directory
  file: dest=/var/www/ state=directory owner={{ wwwuser }} group={{ wwwuser }} mode=0700

但是,如果变量是字符串中的唯一值,我们需要将它用引号引起来,以便 YAML 解析器能够正确理解它:

更新了 php.yml 中的任务

- name: Run artisan migrate
  shell: php /var/www/laravel/artisan migrate --force
  sudo: yes
  sudo_user: "{{ wwwuser }}"
  when: dbpwd.changed

在您的剧本中,这需要在您拥有 sudo_user: 模板:Wwwuser 的任何时候发生。 您可以使用相同的方式使用全局查找和替换,将 sudo_user: 模板:Wwwuser 替换为 sudo_user: “模板:Wwwuser。 应该有四行需要此更改。

更改所有事件后,保存并运行 playbook:

ansible-playbook php.yml --ask-sudo-pass

应该没有更改的任务,这意味着我们的 wwwuser 变量工作正常。

第 2 步 — 为复杂配置定义嵌套变量

在本节中,我们将研究复杂配置选项的嵌套变量。

在上一步中,我们设置了一个基本变量。 但是,也可以嵌套变量并定义变量列表。 这提供了我们定义希望在服务器上设置的站点列表所需的功能。

首先,让我们考虑一下我们在剧本中设置的现有 git 存储库:

php.yml 中的现有 git 任务

- name: Clone git repository
  git: >
    dest=/var/www/laravel
    repo=https://github.com/do-community/do-ansible-adv-php.git
    update=yes
    version=example

我们可以提取以下有用的信息:名称(目录)、存储库、分支和域。 因为我们正在设置多个应用程序,所以我们还需要一个域名来响应它。 在这里,我们将使用 laravel.example.com,但如果您有自己的域,则可以替换它。

这导致我们可以为此应用程序定义以下四个变量:

应用变量

name: laravel
repository: https://github.com/do-community/do-ansible-adv-php.git
branch: example
domain: laravel.example.com

现在,打开你的剧本进行编辑:

nano php.yml

在顶部的 vars 部分,我们可以将我们的应用程序添加到一个新的应用程序列表中:

更新了 php.yml 中的应用程序变量

---
- hosts: php
  sudo: yes

  vars:
    wwwuser: www-data

    applications:
      - name: laravel
        domain: laravel.example.com
        repository: https://github.com/do-community/do-ansible-adv-php.git
        branch: example

...

如果你现在运行你的剧本(使用 ansible-playbook php.yml --ask-sudo-pass),什么都不会改变,因为我们还没有设置我们的任务来使用我们新的 applications 变量。 但是,如果您在浏览器中转到 http://laravel.example.com/,它应该会显示我们的原始应用程序。

第三步——在任务中循环变量

在本节中,我们将学习如何在任务中循环变量列表。

如前所述,变量列表需要在我们希望使用它们的每个任务中循环。 正如我们在 install packages 任务中看到的,我们需要定义一个项目循环,然后将任务应用于列表中的每个项目。

打开你的剧本进行编辑:

nano php.yml

我们将从一些简单的任务开始。 在你的剧本中间,你应该找到这两个 env 任务:

php.yml 中的现有环境任务

- name: set APP_DEBUG=false
  lineinfile: dest=/var/www/laravel/.env regexp='^APP_DEBUG=' line=APP_DEBUG=false

- name: set APP_ENV=production
  lineinfile: dest=/var/www/laravel/.env regexp='^APP_ENV=' line=APP_ENV=production

您会注意到它们当前是使用 laravel 目录进行硬编码的。 我们想更新它以对每个应用程序使用 name 属性。 为此,我们添加了 with_items 选项来循环我们的 applications 列表。 在任务本身中,我们将 laravel 引用替换为变量 模板:Item.name,这与我们之前使用的格式应该很熟悉。

它应该如下所示:

更新了 php.yml 中的 .env 任务

- name: set APP_DEBUG=false
  lineinfile: dest=/var/www/{{ item.name }}/.env regexp='^APP_DEBUG=' line=APP_DEBUG=false
  with_items: applications

- name: set APP_ENV=production
  lineinfile: dest=/var/www/{{ item.name }}/.env regexp='^APP_ENV=' line=APP_ENV=production
  with_items: applications

接下来,转到两个 Laravel artisan cron 任务。 它们可以像我们刚刚对 env 任务所做的那样进行更新。 我们还将 item.name 添加到 cron 条目的 name 参数中,因为 Ansible 使用此字段来唯一标识每个 cron 条目。 如果我们保持原样,我们将无法在同一服务器上拥有多个站点,因为它们会不断覆盖每个站点,并且只会保存最后一个站点。

任务应如下所示:

更新了 php.yml 中的 cron 任务

- name: Laravel Scheduler
  cron: >
    job="run-one php /var/www/{{ item.name }}/artisan schedule:run 1>> /dev/null 2>&1"
    state=present
    user={{ wwwuser }}
    name="{{ item.name }} php artisan schedule:run"
  with_items: applications

- name: Laravel Queue Worker
  cron: >
    job="run-one php /var/www/{{ item.name }}/artisan queue:work --daemon --sleep=30 --delay=60 --tries=3 1>> /dev/null 2>&1"
    state=present
    user={{ wwwuser }}
    name="{{ item.name }} Laravel Queue Worker"
  with_items: applications

如果您现在保存并运行 playbook(使用 ansible-playbook php.yml --ask-sudo-pass),您应该只会看到两个更新的 cron 任务已更新。 这是由于 name 参数的变化。 除此之外,没有任何变化,这意味着我们的应用程序列表按预期工作,并且由于重构我们的剧本,我们还没有对我们的服务器进行任何更改。

第 4 步 — 在模板中应用循环变量

在本节中,我们将介绍如何在模板中使用循环变量。

在模板中循环变量非常容易。 它们的使用方式与它们在任务中的使用方式完全相同,就像所有其他变量一样。 当您考虑文件路径和变量时,复杂性就会出现,因为在某些用途中,我们需要考虑文件名,甚至因为新文件而运行其他命令。

对于 Nginx,我们需要为每个应用程序创建一个新的配置文件,并告诉 Nginx 应该启用它。 我们还想在这个过程中删除我们原来的 /etc/nginx/sites-available/default 配置文件。

首先,打开你的剧本进行编辑:

nano php.yml

找到 Configure Nginx 任务(靠近剧本的中间),并像我们对其他任务所做的那样更新它:

更新了 php.yml 中的 nginx 任务

- name: Configure nginx
  template: src=nginx.conf dest=/etc/nginx/sites-available/{{ item.name }}
  with_items: applications
  notify:
    - restart php5-fpm
    - restart nginx

当我们在这里时,我们还将添加上面提到的另外两个任务。 首先,我们将告诉 Nginx 我们的新站点配置文件。 这是通过 /var/nginx/ 中的 sites-availablesites-enabled 目录之间的符号链接完成的。

Configure nginx 任务之后添加此任务:

php.yml 中的新符号链接任务

- name: Configure nginx symlink
  file: src=/etc/nginx/sites-available/{{ item.name }} dest=/etc/nginx/sites-enabled/{{ item.name }} state=link
  with_items: applications
  notify:
    - restart php5-fpm
    - restart nginx

接下来,我们要删除启用了 default 的站点配置文件,这样它就不会导致我们的新站点配置文件出现问题。 这可以通过 file 模块轻松完成:

新建文件任务 php.yml

- name: Remove default nginx site
  file: path=/etc/nginx/sites-enabled/default state=absent
  notify:
    - restart php5-fpm
    - restart nginx

请注意,我们不需要循环 applications,因为我们正在寻找单个文件。

你的剧本中的 Nginx 块现在应该如下所示:

更新了 php.yml 中的 nginx 任务

- name: Configure nginx
  template: src=nginx.conf dest=/etc/nginx/sites-available/{{ item.name }}
  with_items: applications
  notify:
    - restart php5-fpm
    - restart nginx

- name: Configure nginx symlink
  file: src=/etc/nginx/sites-available/{{ item.name }} dest=/etc/nginx/sites-enabled/{{ item.name }} state=link
  with_items: applications
  notify:
    - restart php5-fpm
    - restart nginx

- name: Remove default nginx site
  file: path=/etc/nginx/sites-enabled/default state=absent
  notify:
    - restart php5-fpm
    - restart nginx

保存您的剧本并打开 nginx.conf 文件进行编辑:

nano nginx.conf

更新配置文件,使其使用我们的变量:

更新了 nginx.conf

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    root /var/www/{{ item.name }}/public;
    index index.php index.html index.htm;

    server_name {{ item.domain }};

    location / {
        try_files $uri $uri/ =404;
    }

    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /var/www/{{ item.name }}/public;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

然而,我们还没有完成。 注意到顶部的 default_server 了吗? 我们只想为 laravel 应用程序包括它,使其成为默认值。 为此,我们可以使用基本的 IF 语句来检查 item.name 是否等于 laravel,如果是,则显示 default_server

它看起来像这样:

使用条件更新了 nginx.conf

server {
    listen 80{% if item.name == "laravel" %} default_server{% endif %};
    listen [::]:80{% if item.name == "laravel" %} default_server ipv6only=on{% endif %};

相应地更新您的 nginx.conf 并保存。

现在是时候运行我们的剧本了:

ansible-playbook php.yml --ask-sudo-pass

您应该注意到 Nginx 任务已被标记为已更改。 完成运行后,在浏览器中刷新站点,它应该显示与上一个教程结束时相同的显示:

Queue: YES
Cron: YES

第 5 步 — 将多个变量循环在一起

在这一步中,我们将在任务中将多个变量循环在一起。

现在是时候处理一个更复杂的循环示例了,特别是注册变量。 为了支持不同的状态,防止任务不必要的运行,你会记得我们在 Clone git repository 任务中使用 register: cloned 将变量 cloned 注册到状态的任务。 然后我们在以下任务中使用when: cloned|changed有条件地触发任务。 现在我们需要更新这些引用以支持应用程序循环。

首先,打开你的剧本进行编辑:

nano php.yml

向下查找 Clone git repository 任务:

php.yml 中的现有 git 任务

- name: Clone git repository
  git: >
    dest=/var/www/laravel
    repo=https://github.com/do-community/do-ansible-adv-php.git
    update=yes
    version=example
  sudo: yes
  sudo_user: "{{ wwwuser }}"
  register: cloned

当我们在这个任务中注册变量时,我们不需要做任何我们还没有做的事情:

更新了 php.yml 中的 git 任务

- name: Clone git repository
  git: >
    dest=/var/www/{{ item.name }}
    repo={{ item.repository }}
    update=yes
    version={{ item.branch }}
  sudo: yes
  sudo_user: "{{ wwwuser }}"
  with_items: applications
  register: cloned

现在,向下移动你的剧本,直到找到 composer create-project 任务:

php.yml 中的原始作曲家任务

- name: composer create-project
  composer: command=create-project working_dir=/var/www/laravel optimize_autoloader=no
  sudo: yes
  sudo_user: "{{ wwwuser }}"
  when: cloned|changed

现在我们需要更新它以循环通过 ' applicationscloned。 这是使用 with_together 选项完成的,并传入 applicationscloned。 由于 with_together 循环通过两个变量,因此使用 item.# 访问项目,其中 # 是定义的变量的索引。 例如:

with_together:
- list_one
- list_two

item.0 将引用 list_oneitem.1 将引用 list_two

这意味着对于 applications,我们可以通过以下方式访问属性:item.0.name。 对于 cloned,我们需要传入任务的结果,可以通过 cloned.results 访问,然后我们可以通过 item.1.changed 检查它是否被更改。

这意味着任务变为:

更新了 php.yml 中的作曲家任务

- name: composer create-project
  composer: command=create-project working_dir=/var/www/{{ item.0.name }} optimize_autoloader=no
  sudo: yes
  sudo_user: "{{ wwwuser }}"
  when: item.1.changed
  with_together:
    - applications
    - cloned.results

现在保存并运行您的剧本:

ansible-playbook php.yml --ask-sudo-pass

这次运行应该没有任何变化。 然而,我们现在有一个注册变量在循环中工作得很好。

第 6 步 — 复杂的注册变量和循环

在本节中,我们将学习更复杂的注册变量和循环。

转换中最复杂的部分是处理我们用于为 MySQL 数据库生成密码的注册变量。 也就是说,在这一步中我们没有涉及到更多我们需要做的事情,我们只需要一次更新一些任务。

打开你的剧本进行编辑:

nano php.yml

找到 MySQL 任务,在我们的初始阶段中,我们将像之前的任务一样添加基本变量:

更新了 php.yml 中的 MySQL 任务

- name: Create MySQL DB
  mysql_db: name={{ item.name }} state=present
  with_items: applications

- name: Generate DB password
  shell: makepasswd --chars=32
  args:
    creates: /var/www/{{ item.name }}/.dbpw
  with_items: applications
  register: dbpwd

- name: Create MySQL User
  mysql_user: name={{ item.name }} password={{ dbpwd.stdout }} priv={{ item.name }}.*:ALL state=present
  when: dbpwd.changed

- name: set DB_DATABASE
  lineinfile: dest=/var/www/{{ item.name }}/.env regexp='^DB_DATABASE=' line=DB_DATABASE={{ item.name }}
  with_items: applications

- name: set DB_USERNAME
  lineinfile: dest=/var/www/{{ item.name }}/.env regexp='^DB_USERNAME=' line=DB_USERNAME={{ item.name }}
  with_items: applications

- name: set DB_PASSWORD
  lineinfile: dest=/var/www/{{ item.name }}/.env regexp='^DB_PASSWORD=' line=DB_PASSWORD={{ dbpwd.stdout }}
  when: dbpwd.changed

- name: Save dbpw file
  lineinfile: dest=/var/www/{{ item.name }}/.dbpw line="{{ dbpwd.stdout }}" create=yes state=present
  sudo: yes
  sudo_user: "{{ wwwuser }}"
  when: dbpwd.changed

- name: Run artisan migrate
  shell: php /var/www/{{ item.name }}/artisan migrate --force
  sudo: yes
  sudo_user: "{{ wwwuser }}"
  when: dbpwd.changed

接下来我们将添加 with_together 以便我们可以使用我们的数据库密码。 对于我们的密码生成,我们需要循环 dbpwd.results,并且将能够从 item.1.stdout 访问密码,因为 applications 将通过 item.0 访问.

我们可以相应地更新我们的剧本:

更新了 php.yml 中的 MySQL 任务

- name: Create MySQL DB
  mysql_db: name={{ item.name }} state=present
  with_items: applications

- name: Generate DB password
  shell: makepasswd --chars=32
  args:
    creates: /var/www/{{ item.name }}/.dbpw
  with_items: applications
  register: dbpwd

- name: Create MySQL User
  mysql_user: name={{ item.0.name }} password={{ item.1.stdout }} priv={{ item.0.name }}.*:ALL state=present
  when: item.1.changed
  with_together:
  - applications
  - dbpwd.results

- name: set DB_DATABASE
  lineinfile: dest=/var/www/{{ item.name }}/.env regexp='^DB_DATABASE=' line=DB_DATABASE={{ item.name }}
  with_items: applications

- name: set DB_USERNAME
  lineinfile: dest=/var/www/{{ item.name }}/.env regexp='^DB_USERNAME=' line=DB_USERNAME={{ item.name }}
  with_items: applications

- name: set DB_PASSWORD
  lineinfile: dest=/var/www/{{ item.0.name }}/.env regexp='^DB_PASSWORD=' line=DB_PASSWORD={{ item.1.stdout }}
  when: item.1.changed
  with_together:
  - applications
  - dbpwd.results

- name: Save dbpw file
  lineinfile: dest=/var/www/{{ item.0.name }}/.dbpw line="{{ item.1.stdout }}" create=yes state=present
  sudo: yes
  sudo_user: "{{ wwwuser }}"
  when: item.1.changed
  with_together:
  - applications
  - dbpwd.results

- name: Run artisan migrate
  shell: php /var/www/{{ item.0.name }}/artisan migrate --force
  sudo: yes
  sudo_user: "{{ wwwuser }}"
  when: item.1.changed
  with_together:
  - applications
  - dbpwd.results

更新剧本后,保存并运行它:

ansible-playbook php.yml --ask-sudo-pass

尽管我们对剧本进行了所有更改,但数据库任务应该没有更改。 通过这一步的更改,我们应该已经完成了从单应用程序手册到多应用程序手册的转换。

第 7 步 — 添加更多应用程序

在这一步中,我们将在 playbook 中配置另外两个应用程序。

现在我们已经重构了我们的剧本以使用变量来定义应用程序,将新应用程序添加到我们的服务器的过程非常容易。 只需将它们添加到 applications 变量列表中。 这就是 Ansible 变量真正发挥作用的地方。

打开你的剧本进行编辑:

nano php.yml

在顶部的 vars 部分,找到 applications 块:

php.yml 中的现有应用程序变量

applications:
  - name: laravel
    domain: laravel.example.com
    repository: https://github.com/do-community/do-ansible-adv-php.git
    branch: example

现在再添加两个应用程序:

更新了 php.yml 中的应用程序变量

applications:
  - name: laravel
    domain: laravel.example.com
    repository: https://github.com/do-community/do-ansible-adv-php.git
    branch: example

  - name: one
    domain: one.example.com
    repository: https://github.com/do-community/do-ansible-php-example-one.git
    
    branch: master

  - name: two
    domain: two.example.com
    repository: https://github.com/do-community/do-ansible-php-example-two.git
    branch: master

保存你的剧本。

现在是时候运行你的剧本了:

ansible-playbook php.yml --ask-sudo-pass

随着 composer 设置新应用程序,此步骤可能需要一段时间。 完成后,您会注意到许多任务发生了变化,如果您仔细观察,您会发现每个循环项目都将被列出。 首先,我们的原始应用程序应该说 okskipped,而新的两个应用程序应该说 changed

更重要的是,如果您在 Web 浏览器中访问您配置的站点的所有三个域,您应该会注意到三个不同的网站。

第一个应该看起来很熟悉。 另外两个应该显示:

This is example app one!

This is example app two!

有了这个,我们刚刚通过简单地更新我们的应用程序列表部署了两个新的 Web 应用程序。

第 8 步 — 使用主机变量

在这一步中,我们将把变量提取到主机变量中。

退一步说,playbook 变量很好,但是如果我们想使用同一个 playbook 将不同的应用程序部署到不同的服务器上怎么办? 我们可以对每个任务进行条件检查以确定哪个服务器正在运行该任务,或者我们可以使用主机变量。 主机变量就像它们听起来的样子:适用于特定主机的变量,而不是剧本中的所有主机。

主机变量可以在 hosts 文件中内联定义,就像我们对 ansible_ssh_user 变量所做的那样,或者它们可以在 host_vars 中的每个主机的专用文件中定义] 目录。

首先,在我们的 hosts 文件和我们的剧本旁边创建一个新目录。 调用目录host_vars

mkdir host_vars

接下来我们需要为我们的主机创建一个文件。 Ansible 使用的约定是文件名与 hosts 文件中的主机名匹配。 因此,例如,如果您的 hosts 文件如下所示:

Ansible 主机文件

[php]
your_first_server_ip ansible_ssh_user=sammy

然后您应该创建一个名为 host_vars/your_first_server_ip 的文件。 现在让我们创建它:

nano host_vars/your_first_server_ip

与我们的剧本一样,主机文件使用 YAML 进行格式化。 这意味着我们可以将我们的 applications 列表复制到我们的新主机文件中,所以它看起来像这样:

新的 host_vars/your_first_server_ip 文件

---
applications:
  - name: laravel
    domain: laravel.example.com
    repository: https://github.com/do-community/do-ansible-adv-php.git
    branch: example

  - name: one
    domain: one.example.com
    repository: https://github.com/do-community/do-ansible-php-example-one.git
    branch: master

  - name: two
    domain: two.example.com
    repository: https://github.com/do-community/do-ansible-php-example-two.git
    branch: master

保存新的 hosts 文件,然后打开 playbook 进行编辑:

nano php.yml

更新顶部以删除整个 applications 部分:

更新了 php.yml 的顶部

---
- hosts: php
  sudo: yes

  vars:
    wwwuser: www-data

  tasks:
. . .

保存剧本,然后运行它:

ansible-playbook php.yml --ask-sudo-pass

即使我们已将变量从 playbook 移动到主机文件,输出应该看起来完全一样,并且 Ansible 应该没有报告任何更改。 如您所见,host_vars 的工作方式与剧本中的 vars 完全相同; 它们只是特定于主机的。

host_vars 文件中定义的变量也可以在管理服务器的所有 playbook 中访问,这对于常用选项和设置很有用。 但是,请注意不要使用可能在不同剧本中表示不同含义的通用名称。

第 9 步 — 在另一台服务器上部署应用程序

在这一步中,我们将利用我们的新主机文件并在第二台服务器上部署应用程序。

首先,我们需要用我们的新主机更新我们的 hosts 文件。 打开它进行编辑:

nano hosts

并添加您的新主机:

Ansible 主机文件

[php]
your_first_server_ip ansible_ssh_user=sammy
your_second_server_ip ansible_ssh_user=sammy

保存并关闭文件。

接下来,我们需要创建一个新的 hosts 文件,就像我们在第一个文件中所做的那样。

nano host_vars/your_second_server_ip

您可以选择我们的一个或多个示例应用程序并将它们添加到您的主机文件中。 例如,如果您想将我们的原始示例和示例二部署到新服务器,您可以使用:

新的 host_vars/your_second_server_ip 文件

---
applications:
  - name: laravel
    domain: laravel.example2.com
    repository: https://github.com/do-community/do-ansible-adv-php.git
    branch: example

  - name: two
    domain: two.example2.com
    repository: https://github.com/do-community/do-ansible-php-example-two.git
    branch: master

保存你的剧本。

最后我们可以运行我们的剧本:

ansible-playbook php.yml --ask-sudo-pass

Ansible 需要一段时间才能运行,因为它正在您的第二台服务器上设置所有内容。 完成后,在浏览器中打开您选择的应用程序(在示例中,我们使用 laravel.example2.com two.example2.com)并确认它们已正确设置。 您应该会看到您为主机文件选择的特定应用程序,并且您的原始服务器应该没有任何更改。

结论

本教程采用了一个功能齐全的单应用程序手册并将其转换为支持跨多个服务器的多个应用程序。 结合前面教程中涵盖的主题,您应该拥有编写完整剧本以部署应用程序所需的一切。 根据前面的教程,我们还没有使用 SSH 直接登录到服务器。

一旦我们制定了剧本的结构,您就会注意到添加更多应用程序和另一台服务器是多么简单。 这就是 Ansible 的强大之处,也是它如此灵活和易于使用的原因。