如何在 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
。要运行 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 的其他功能。