如何在 Ubuntu 14.04 上使用 Ansible 配置 Apache如何在 Ubuntu 14.04 上使用 Ansible 配置 Apache如何在 Ubuntu 14.04 上使用 Ansible 配置 Apache如何在 Ubuntu 14.04 上使用 Ansible 配置 Apache
  • 文章
  • 正则表达式
    • 工具
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容
发表 admin at 2025年2月28日
类别
  • 未分类
标签

如何在 Ubuntu 14.04 上使用 Ansible 配置 Apache

介绍

Apache 是目前 Internet 上使用最流行的 Web 服务器之一。它很容易在 Ubuntu 和 Debian 等 Linux 发行版上设置和配置,因为它包含在软件包存储库中,并包含开箱即用的默认配置。

Ansible 是一种自动化工具,可让您跨大量服务器远程配置系统、安装软件和执行复杂任务,而无需手动登录到每个服务器。与其他替代方案不同,Ansible 安装在单个主机上,甚至可以是您的本地计算机,并使用 SSH 与每个远程主机进行通信。这使得它在配置新服务器时速度非常快,因为每个新服务器上都不需要安装先决条件包。它非常易于使用和理解,因为它使用基于简单模块的语法以 yaml 格式使用 playbooks。

先决条件

对于本教程,我们将在新的 Ubuntu 14.04 主 Droplet 上安装 Ansible,并使用它在第二个 Droplet 上配置 Apache。也就是说,请记住 Ansible 的好处之一是您可以将它安装在本地计算机上并管理其他主机,而无需手动 ssh 进入它们。

对于本教程,您将需要:

  • 两个 Ubuntu 14.04 Droplet:一个带有 Ansible 的主 Droplet 和一个辅助 Droplet,它将运行通过 Ansible 配置的 Apache
  • Sudo 两个 Droplet 的非根用户。
  • Ansible 安装在主 Droplet 上。按照本教程进行操作(直到设置 SSH 密钥部分)。尽管该教程是为 Ubuntu 12.04 编写的,但它仍然适用于 Ubuntu 14.04。
  • 主 Droplet 的 SSH 密钥授权登录辅助 Droplet,您可以按照本教程在主 Droplet 上执行此操作。
  • 活动 DNS 记录,或在本地计算机上手动设置本地主机文件(使用辅助 Droplet 的 IP 地址),以便设置和使用将要配置的虚拟主机。

注意:本教程遵循现有教程中解释的概念:

第 1 步 — 配置 Ansible

在本节中,我们将配置 Ansible 以能够管理您的服务器。

安装 Ansible 后,第一步是告诉 Ansible 要与哪些主机通信。为此,我们需要创建一个 Ansible 主机文件。 Ansible 主机文件包含主机组,我们在运行 Ansible 命令时会参考这些主机组。默认情况下,它位于 /etc/ansible/hosts 中。但是,这会在您的系统中全局应用,并且通常需要管理员权限。相反,为了让事情更简单,我们需要告诉 Ansible 使用本地主机文件。

Ansible 始终在运行它的本地目录中查找 ansible.cfg 文件,如果找到,将使用本地值覆盖全局配置。考虑到这一点,我们需要做的就是告诉 Ansible 我们想要使用本地目录中的主机文件,而不是全局目录。

创建一个新目录(我们将在本教程的其余部分使用它)。

mkdir ansible-apache

移动到新目录。

cd ~/ansible-apache/

创建一个名为 ansible.cfg 的新文件并打开它进行编辑。

nano ansible.cfg

在该文件中,我们要在 [defaults] 组中添加值为 hosts 的 hostfile 配置选项。将以下内容复制到 ansible.cfg 文件中,然后保存并关闭它。

[defaults]
hostfile = hosts

接下来,需要写入hosts 文件。主机文件有很多可用选项。但是,我们可以从非常简单的事情开始。

创建一个 hosts 文件并打开它进行编辑。

nano hosts

将以下内容复制到 hosts 文件中。

[apache]
secondary_server_ip ansible_ssh_user=username

这指定了一个名为 apache 的主机组,其中包含一个主机。将 secondary_server_ip 替换为辅助服务器的主机名或 IP 地址,并将 username 替换为您的 SSH 用户名。现在 Ansible 应该能够连接到您的服务器。

注意:如果您以与目标主机相同的用户身份运行 Ansible,则 ansible_ssh_user=username 组件是可选的。

要测试 Ansible 是否正常工作并且可以与您的主机通信,您可以运行基本的 ansible 命令。 Ansible 自带了很多 ping 模块。它检查它是否可以连接到每个主机,这使得检查 hosts 文件的正确性变得容易。

ansible 命令的基本用法接受主机组和模块名称:ansible -m 。要运行 ping 命令,请输入以下命令。

ansible apache -m ping

输出应如下所示:

111.111.111.111 | success >> {
    "changed": false,
    "ping": "pong"
}

另一个对测试有用的 Ansible 模块是命令模块。它在主机上运行自定义命令并返回结果。要使用 echo(一种将字符串回显到终端的 Unix 命令)运行 command 命令,请输入以下命令。

ansible apache -m command -a "/bin/echo hello sammy"

输出应如下所示:

111.111.111.111 | success | rc=0 >>
hello sammy

这是 Ansible 的基本用法。真正的力量来自创建包含多个 Ansible 任务的剧本。接下来我们将介绍这些内容。

第 2 步 — 创建剧本

在本节中,我们将创建一个基本的 Ansible 剧本,让您轻松运行更复杂的模块。

一个非常基本的 Ansible 剧本是一个单独的 yaml 文件,它指定主机组和一个或多个要在指定组内的主机上运行的任务。它们非常简单易读,这也是 Ansible 如此强大的原因之一。

让我们为上面的 hello sammy 命令创建一个基本的 playbook 版本。

创建一个名为 apache.yml 的文件并打开它进行编辑。

nano apache.yml

将以下文本复制到文件中,然后保存并关闭它。

---
- hosts: apache
  tasks:
    - name: run echo command
      command: /bin/echo hello sammy

hosts: apache 声明位于顶部,它告诉 Ansible 我们正在使用 apache 主机组。这相当于通过 ansible 命令传递它。接下来是任务列表。在此示例中,我们有一个名为 run echo command 的任务。这只是一个描述,旨在让用户了解任务在做什么。最后,command: /bin/echo hello sammy 行使用参数 /bin/echo hello sammy 运行 command 模块。

ansible-playbook命令用于运行playbook,最简单的用法是:ansible-playbook your-playbook.yml。我们可以使用以下命令运行我们刚刚创建的剧本。

ansible-playbook apache.yml

输出应如下所示。

PLAY [apache] *****************************************************************

GATHERING FACTS ***************************************************************
ok: [111.111.111.111]

TASK: [run echo command] ******************************************************
changed: [111.111.111.111]

PLAY RECAP ********************************************************************
111.111.111.111            : ok=2    changed=1    unreachable=0    failed=0

这里需要注意的最重要的事情是剧本不会返回模块的输出,因此与我们在第 1 步中使用的直接命令不同,我们无法看到是否实际打印了 hello sammy。这意味着 playbook 更适合不需要查看输出的任务。 Ansible 会告诉您模块执行过程中是否出现错误,因此您通常只需要依靠它来了解是否出现问题。

第 3 步 — 安装 Apache

现在我们已经介绍了剧本,我们将编写安装 Apache Web 服务器的任务。

通常在 Ubuntu 上,安装 Apache 很简单,就是通过 apt-get 安装 apache2 包。要通过 Ansible 做到这一点,我们使用 Ansible 的 apt 模块。 apt 模块包含许多用于专用 apt-get 功能的选项。我们感兴趣的选项是:

  • name:要安装的包的名称,可以是单个包名,也可以是包列表。
  • state:接受latest、absent 或present。 Latest 确保安装了最新版本,present 只是检查它是否已安装,而 absent 则在安装时将其删除。
  • update_cache:更新缓存(通过 apt-get update)(如果启用),以确保它是最新的。

注意:apt 以外的包管理器也有模块。每个模块页面都有示例,通常涵盖所有主要用例,让您很容易了解如何使用每个模块。很少需要到别处寻找使用说明。

现在让我们用 apt 模块而不是 command 模块更新我们的 apache.yml 剧本。再次打开 apache.yml 文件进行编辑。

nano apache.yml

删除当前存在的文本并将以下文本复制到其中。

---
- hosts: apache
  sudo: yes
  tasks:
    - name: install apache2
      apt: name=apache2 update_cache=yes state=latest

apt 行安装 apache2 包 (name=apache2) 并确保我们已更新缓存 (update_cache=yes).尽管它是可选的,但包括 state=latest 以明确应该安装它是一个好主意。

除非您的 Playbook 在每台主机上以 root 身份运行,否则将需要 sudo 来确保正确的权限。 Ansible 支持 sudo 作为 Playbook 中简单选项的一部分。它还可以通过 ansible-playbook 命令在每个任务级别应用。

现在运行剧本。

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

--ask-sudo-pass 标志将提示您输入辅助 Droplet 上的 sudo 密码。这是必要的,因为安装需要 root 权限;到目前为止我们运行的其他命令没有。

输出应如下所示。

PLAY [apache] *****************************************************************

GATHERING FACTS ***************************************************************
ok: [111.111.111.111]

TASK: [install apache2] *******************************************************
changed: [111.111.111.111]

PLAY RECAP ********************************************************************
111.111.111.111            : ok=2    changed=1    unreachable=0    failed=0

如果您在浏览器中访问辅助服务器的主机名或 IP 地址,您现在应该会看到一个 Apache2 Ubuntu 默认页面来迎接您。这意味着您的服务器上安装了一个可用的 Apache,并且您还没有手动连接到它来运行命令。

此时要注意的一个重要概念是幂等性,它是 Ansible 模块应该如何运行的基础。这个想法是你可以重复运行相同的命令,但如果所有的东西都是在第一次运行时配置的,那么所有后续的运行都不会改变。几乎所有 Ansible 模块都支持它,包括 apt 模块。

例如,再次运行相同的 playbook 命令。

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

输出应如下所示。请注意 changed=0 部分。

PLAY [apache] *****************************************************************

GATHERING FACTS ***************************************************************
ok: [111.111.111.111]

TASK: [install apache2] *******************************************************
ok: [111.111.111.111]

PLAY RECAP ********************************************************************
111.111.111.111            : ok=2    changed=0    unreachable=0    failed=0

这告诉您 apache2 包已经安装,所以没有任何改变。在处理跨多个主机的复杂 playbook 时,能够识别不同的主机变得非常有用。例如,如果您注意到主机总是需要更新特定配置,则该主机上可能有用户或进程正在更改它。如果没有幂等性,这可能永远不会被注意到。

第 4 步 — 配置 Apache 模块

现在安装了 Apache,我们需要启用 Apache 使用的模块。

让我们确保为 Apache 启用了 mod_rewrite 模块。通过 SSH,这可以通过使用 a2enmod 并重新启动 Apache 轻松完成。但是,我们也可以通过 Ansible 使用 apache2_module 模块和任务处理程序来重新启动 apache2 来非常轻松地完成此操作。

apache2_module 模块有两个选项:

  • name – 要启用的模块的名称,例如 rewrite。
  • state – present 或 absent,具体取决于模块是需要启用还是禁用。

打开 apache.yml 进行编辑。

nano apache.yml

更新文件以包含此任务。该文件现在应如下所示:

---
- hosts: apache
  sudo: yes
  tasks:
    - name: install apache2
      apt: name=apache2 update_cache=yes state=latest

    - name: enabled mod_rewrite
      apache2_module: name=rewrite state=present

但是,我们需要在启用模块后重新启动apache2。一种选择是添加一个任务来重启 apache2,但我们不希望每次应用我们的 playbook 时都运行它。为了解决这个问题,我们需要使用一个任务处理程序。处理程序的工作方式是可以告诉任务在更改时通知处理程序,并且处理程序仅在任务更改时运行。

为此,我们需要将 notify 选项添加到 apache2_module 任务中,然后我们可以使用服务模块在处理程序中重启 apache2 .

这导致了一个看起来像这样的剧本:

---
- hosts: apache
  sudo: yes
  tasks:
    - name: install apache2
      apt: name=apache2 update_cache=yes state=latest

    - name: enabled mod_rewrite
      apache2_module: name=rewrite state=present
      notify:
        - restart apache2

  handlers:
    - name: restart apache2
      service: name=apache2 state=restarted

现在,重新运行剧本。

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

输出应如下所示:

PLAY [apache] *****************************************************************

GATHERING FACTS ***************************************************************
ok: [111.111.111.111]

TASK: [install apache2] *******************************************************
ok: [111.111.111.111]

TASK: [enabled mod_rewrite] ***************************************************
changed: [111.111.111.111]

NOTIFIED: [restart apache2] ***************************************************
changed: [111.111.111.111]

PLAY RECAP ********************************************************************
111.111.111.111            : ok=4    changed=2    unreachable=0    failed=0

到目前为止看起来不错。现在,再次运行命令,应该没有任何变化,并且不会列出重启任务。

第 5 步 — 配置 Apache 选项

现在我们已经安装了一个可用的 Apache,并打开了我们所需的模块,我们需要配置 Apache。

默认情况下,Apache 在端口 80 上侦听所有 HTTP 流量。为了本教程,让我们假设我们希望 Apache 改为侦听端口 8081。使用 Ubuntu 14.04 x64 上的默认 Apache 配置,有两个文件需要更新:

/etc/apache2/ports.conf
    Listen 80

/etc/apache2/sites-available/000-default.conf
    <VirtualHost *:80>

为此,我们可以使用 lineinfile 模块。这个模块非常强大,通过使用它的许多不同的配置选项,它允许您对主机上的现有文件执行各种更改。对于此示例,我们将使用以下选项:

  • dest – 作为命令的一部分要更新的文件。
  • regexp – 用于匹配要替换的现有行的正则表达式。
  • line – 要插入文件的行,替换 regexp 行或作为末尾的新行。
  • 状态 – 存在或不存在。

注意:如果 lineinfile 模块与 regexp 中的现有行不匹配,模块将在文件末尾附加该行。如果需要,选项 insertbefore 和 insertafter 可以指定在之前或之后而不是最后添加的行。

将端口从 80 更新为 8081 需要做的是查找定义端口 80 的现有行,并将它们更改为定义端口 <代码>8081。

打开 apache.yml 文件进行编辑。

nano apache.yml

修改附加行,使文件如下所示:

---
- hosts: apache
  sudo: yes
  tasks:
    - name: install apache2
      apt: name=apache2 update_cache=yes state=latest

    - name: enabled mod_rewrite
      apache2_module: name=rewrite state=present
      notify:
        - restart apache2

    - name: apache2 listen on port 8081
      lineinfile: dest=/etc/apache2/ports.conf regexp="^Listen 80" line="Listen 8081" state=present
      notify:
        - restart apache2

    - name: apache2 virtualhost on port 8081
      lineinfile: dest=/etc/apache2/sites-available/000-default.conf regexp="^<VirtualHost \*:80>" line="<VirtualHost *:8081>" state=present
      notify:
        - restart apache2

  handlers:
    - name: restart apache2
      service: name=apache2 state=restarted

重要的是要注意,作为此过程的一部分,我们还需要重新启动 apache2,并且我们可以重新使用相同的处理程序,但尽管有多个更改的任务,但 hanlder 只会被触发一次。

现在运行剧本。

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

Ansible 完成后,您应该能够在浏览器中访问您的主机,它将在端口 8081 上响应,而不是端口 80。在大多数网络浏览器中,这可以通过在 URL 末尾添加 :port 轻松实现:http://111.111.111.111:8081/。

lineinfile 模块非常强大,可以轻松修改现有配置。唯一的问题是您需要知道您正在使用它更改的文件中会发生什么,但它支持支持大多数简单用例的各种选项。

第 6 步 — 配置虚拟主机

Ansible 具有几个模块,可以将本地(到 Ansible)模板文件复制到主机上。用于此目的的两个最常用的模块是模板模块。 copy 模块按原样复制文件并且不对其进行任何更改,而更强大的 template 模块复制整个模板并将变量替换应用于您指定的区域双大括号(即 {{ variable }})。

在本节中,我们将使用模板模块在您的服务器上配置一个新的虚拟主机。会有很多变化,所以我们将逐个解释它们,并在这一步结束时包含整个更新的 apache.yml 文件。

创建虚拟主机配置

第一步是创建一个新的虚拟主机配置。我们将在主 Droplet 上创建虚拟主机配置文件,并使用 Ansible 将其上传到辅助 Droplet。

这是一个基本虚拟主机配置的示例,我们可以将其用作我们自己配置的起点。请注意,下面突出显示的端口号和域名都硬编码到配置中。

<VirtualHost *:8081>
    ServerAdmin webmaster@example.com
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/example.com
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

创建一个名为 virtualhost.conf 的新文件。

nano virtualhost.conf

将以下内容粘贴到 virtualhost.conf 中。因为我们使用的是模板,所以将上面的硬编码值更改为变量是个好主意,以便将来更改它们。

<VirtualHost *:{{ http_port }}>
    ServerAdmin webmaster@{{ domain }}
    ServerName {{ domain }}
    ServerAlias www.{{ domain }}
    DocumentRoot /var/www/{{ domain }}
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

使用模板变量

接下来,我们需要更新我们的剧本以推出模板并使用变量。

第一步是在变量的剧本中添加一个部分。它称为 vars,与 hosts、sudo、tasks 和 handlers 处于同一级别。我们需要放入上面模板中使用的两个变量,我们将在此过程中将端口更改回 80。

---
- hosts: apache
  sudo: yes
  vars:
    http_port: 80
    domain: example.com
  tasks:
    - name: install apache2
...

变量可以在任务和模板中使用,因此我们可以更新现有的 lineinfile 模块以使用指定的 http_port,而不是硬编码的 8081我们之前指定。需要将变量添加到行中,并且需要更新 regexp 选项,这样它就不会寻找特定的端口。更改将如下所示:

lineinfile: dest=/etc/apache2/ports.conf regexp="^Listen " line="Listen {{ http_port }}" state=present
lineinfile: dest=/etc/apache2/sites-available/000-default.conf regexp="^<VirtualHost \*:" line="<VirtualHost *:{{ http_port }}>"

添加模板模块

下一步是添加模板模块以将配置文件推送到主机上。我们将使用这些选项来实现它:

  • dest – 在主机上保存更新模板的目标文件路径,即 /etc/apache2/sites-available/{{ domain }}.conf。
  • src – 源模板文件,即 virtualhost.conf。

将这些应用到您的剧本中将产生如下所示的任务:

- name: create virtual host file
  template: src=virtualhost.conf dest=/etc/apache2/sites-available/{{ domain }}.conf

启用虚拟主机

快完成了!我们现在需要做的是在 Apache 中启用虚拟主机。这可以通过两种方式完成:通过运行 sudo a2ensite example.com 命令或手动将配置文件符号链接到 /etc/apache2/sites-enabled/。前一个选项更安全,因为它允许 Apache 控制进程。为此,command 模块再次派上用场。

正如我们在上面发现的那样,用法非常简单:

- name: a2ensite {{ domain }}
  command: a2ensite {{ domain }}
  notify:
  - restart apache2

防止额外工作

最后,command 模块需要知道它什么时候应该运行,什么时候不应该运行,所以如果 playbook 多次运行,模块不会不必要地运行。在我们的例子中,只有在 .conf 文件尚未在主机上创建时才需要运行。

这是使用 creates 选项完成的,它允许您告诉模块在模块执行期间正在创建什么文件。如果文件存在,模块将不会运行。因为 Apache 在站点启用时创建了一个符号链接,所以检查它可以解决问题。

更改将如下所示:

- name: a2ensite {{ domain }}
  command: a2ensite {{ domain }}
  args:
    creates: /etc/apache2/sites-enabled/{{ domain }}.conf
  notify:
  - restart apache2

请务必注意任务中 args 部分的使用。这是列出模块选项的一种可选方式,在这种情况下,消除了模块选项和命令本身之间的任何混淆。

最终的 apache.yml 剧本

现在让我们应用这些更改。打开 apache.yml。

nano apache.yml

通过上述所有更改,将您的 apache.yml 剧本更改为如下所示。

---
- hosts: apache
  sudo: yes
  vars:
    http_port: 80
    domain: example.com
  tasks:
    - name: install apache2
      apt: name=apache2 update_cache=yes state=latest

    - name: enabled mod_rewrite
      apache2_module: name=rewrite state=present
      notify:
        - restart apache2

    - name: apache2 listen on port {{ http_port }}
      lineinfile: dest=/etc/apache2/ports.conf regexp="^Listen " line="Listen {{ http_port }}" state=present
      notify:
        - restart apache2

    - name: apache2 virtualhost on port {{ http_port }}
      lineinfile: dest=/etc/apache2/sites-available/000-default.conf regexp="^<VirtualHost \*:" line="<VirtualHost *:{{ http_port }}>"
      notify:
        - restart apache2

    - name: create virtual host file
      template: src=virtualhost.conf dest=/etc/apache2/sites-available/{{ domain }}.conf

    - name: a2ensite {{ domain }}
      command: a2ensite {{ domain }}
      args:
        creates: /etc/apache2/sites-enabled/{{ domain }}.conf
      notify:
        - restart apache2

  handlers:
    - name: restart apache2
      service: name=apache2 state=restarted

保存并关闭文件,然后运行剧本。

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

如果您现在在浏览器中访问您的辅助 Droplet 的主机名或 IP 地址,您将看到它再次在端口 80 上响应,而不是端口 8081。接下来,访问我们为新虚拟主机指定的域(即 example.com)。因为我们还没有添加任何文件,它应该显示 Apache 404 错误页面而不是 Apache 欢迎页面。如果是这样,你的虚拟主机工作正常,你仍然没有通过 SSH 进入你的辅助 Droplet 来运行单个命令。

第 7 步 — 为您的网站使用 Git 存储库

在本节中,我们将使用 Ansible 克隆 Git 存储库以设置您的网站内容。

每个网站都需要内容,虽然通过 SSH 登录并手动克隆 Git 存储库来建立新网站是很正常的,但 Ansible 为我们提供了自动执行此操作所需的工具。对于此示例,git 模块将执行所需的操作。

git 模块有很多选项,与本教程相关的是:

  • dest – 存储库将检出到的主机上的路径。
  • repo – 将被克隆的存储库 url。主机必须可以访问它。
  • update – 当设置为 no 时,这会阻止 Ansible 在存储库已经存在时更新它。
  • accept_hostkey – 告诉 SSH 在通过 SSH 连接时接受任何未知的主机密钥。这非常有用,因为它不需要通过 SSH 登录来接受第一次登录尝试,但它确实删除了手动检查主机签名的能力。根据您的存储库,您可能需要此选项。

出于本教程的目的,有一个简单的 Git 存储库,其中包含一个可以克隆到您的主机上的 index.html 页面。如果您已经有另一个包含类似内容的公共存储库,请随时替换它。考虑到这一点,git 任务将如下所示:

- name: clone basic html template
  git: repo=https://github.com/do-community/ansible-apache-tutorial.git dest=/var/www/example.com update=no

但是,如果您现在运行 Playbook,您可能会遇到错误。我们首先需要安装 git 包,以便 Ansible 可以使用它来克隆存储库。 apt 任务需要更新以安装 apache2 包和 git 包。查看 apt 文档告诉我们,name 选项只需要一个包,所以这无济于事。相反,我们需要使用一个项目列表。

Ansible 提供了指定要循环遍历的项目列表并将任务应用于每个项目的能力。它们是使用 with_items 选项作为任务的一部分指定的,我们的 apt 任务将更新为如下所示:

- name: install packages
  apt: name={{ item }} update_cache=yes state=latest
  with_items:
    - apache2
    - git

项目列表使用 item 变量并将为列表中的每个项目执行任务。

再次打开 apache.yml。

nano apache.yml

更新剧本以匹配以下内容:

---
- hosts: apache
  sudo: yes

  vars:
    http_port: 80
    domain: example.com

  tasks:

    - name: install packages
      apt: name={{ item }} update_cache=yes state=latest
      with_items:
        - apache2
        - git

    - name: enabled mod_rewrite
      apache2_module: name=rewrite state=present
      notify:
        - restart apache2

    - name: apache2 listen on port {{ http_port }}
      lineinfile: dest=/etc/apache2/ports.conf regexp="^Listen " line="Listen {{ http_port }}" state=present
      notify:
        - restart apache2

    - name: apache2 virtualhost on port {{ http_port }}
      lineinfile: dest=/etc/apache2/sites-available/000-default.conf regexp="^<VirtualHost \*:" line="<VirtualHost *:{{ http_port }}>"
      notify:
        - restart apache2

    - name: create virtual host file
      template: src=virtualhost.conf dest=/etc/apache2/sites-available/{{ domain }}.conf

    - name: a2ensite {{ domain }}
      command: a2ensite {{ domain }}
      args:
        creates: /etc/apache2/sites-enabled/{{ domain }}.conf
      notify:
        - restart apache2

    - name: clone basic html template
      git: repo=https://github.com/do-community/ansible-apache-tutorial.git dest=/var/www/example.com update=no

  handlers:
    - name: restart apache2
      service: name=apache2 state=restarted

保存文件并运行剧本。

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

它应该安装 git 并成功克隆存储库。当您从第 6 步访问虚拟主机时,您现在应该看到 404 错误以外的其他内容。不要忘记检查非虚拟主机是否仍在返回默认页面。

总之,您现在已经安装了 Git,并且已经通过 Git 将一个基本的 HTML 页面克隆到您的新虚拟主机上。仍然不需要手动 SSH 命令。如果您只是想要一个基本的 HTML 网站,并且它位于公共 Git 存储库中,那么您就完成了!

结论

我们刚刚创建了一个 Ansible Playbook 来自动化配置主机以运行 Apache Web 服务器、虚拟主机和 Git 存储库的整个过程。所有这些都是在不需要直接登录服务器的情况下实现的,最好的部分是你可以在大多数 Ubuntu 服务器上运行你的新 Playbook 来获得相同的结果。

注意:如果您的主机已经安装并修改了 Apache,您很可能需要处理每项修改以使其恢复到所需状态。从积极的方面来说,Ansible 只会修复这些修改(如果它们存在),所以将它们放在主 Playbook 中是安全的!

Ansible 非常强大,而且学习曲线非常简单。您可以从使用本教程中涵盖的基本概念开始,要么停留在这个级别,要么学习更多内容以了解真正复杂的部分。无论哪种方式,您都可以配置和管理您的服务器,而无需手动登录大多数(如果不是全部)任务。

您可以浏览 Ansible 模块列表以查看 Ansible 的其他功能。

©2015-2025 艾丽卡 support@alaica.com