如何在Ubuntu14.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 和一个将运行通过 Ansible 配置的 Apache 的辅助 Droplet
- Sudo 非 root 用户 用于两个 Droplet。
- Ansible 安装在主 Droplet 上。 按照本教程(直到设置SSH密钥部分)。 尽管该教程是为 Ubuntu 12.04 编写的,但它仍然与 Ubuntu 14.04 相关。
- 主Droplet 的SSH 密钥授权在辅助Droplet 上登录,您可以按照本教程 在主Droplet 上执行此操作。
- 活动 DNS 记录,或 在本地计算机上手动设置本地主机文件 (使用辅助 Droplet 的 IP 地址),以便设置和使用将配置的虚拟主机。
注意:本教程遵循现有教程中解释的概念:如何在 Ubuntu 或 Debian VPS 上配置 Apache Web 服务器。 如果您想了解更多信息,或者想查看 Ansible 流程旁边的手动流程,请查看该教程。
第 1 步 — 配置 Ansible
在本节中,我们将配置 Ansible 以便能够管理您的服务器。
安装 Ansible 后,第一步是告诉 Ansible 与哪些主机通信。 为此,我们需要创建一个 Ansible 主机文件。 Ansible hosts 文件包含主机组,我们在运行 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 文件有很多可用的选项。 但是,我们可以从非常简单的事情开始。
创建一个 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 <group> -m <module>
。 要运行 ping
命令,请输入以下命令。
ansible apache -m ping
输出应如下所示:
111.111.111.111 | success >> { "changed": false, "ping": "pong" }
另一个对测试有用的 Ansible 模块是 command 模块。 它在主机上运行自定义命令并返回结果。 要使用 echo
运行 command
命令,这是一个向终端回显字符串的 Unix 命令,请输入以下命令。
ansible apache -m command -a "/bin/echo hello sammy"
输出应如下所示:
111.111.111.111 | success | rc=0 >> hello sammy
这是 Ansible 的基本用法。 真正的力量来自创建包含多个 Ansible 任务的剧本。 我们将在接下来介绍这些内容。
第 2 步 — 创建剧本
在本节中,我们将创建一个基本的 Ansible playbook,让您可以轻松地运行更复杂的模块。
一个非常基本的 Ansible playbook 是一个 yaml
文件,它指定主机组以及要在指定组内的主机上运行的一个或多个任务。 它们非常简单易读,这也是 Ansible 如此强大的原因之一。
让我们为上面的 hello sammy
命令创建一个基本的剧本版本。
创建一个名为 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
。 我们可以使用以下命令运行我们刚刚创建的 playbook。
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
这里需要注意的最重要的一点是 playbook 不返回模块的输出,因此与我们在步骤 1 中使用的直接命令不同,我们看不到 hello sammy
是否实际打印。 这意味着剧本更适合您不需要查看输出的任务。 Ansible 会告诉您在执行模块期间是否出现错误,因此您通常只需要依靠它就可以知道是否有任何问题。
第 3 步 — 安装 Apache
现在我们已经介绍了剧本,我们将编写安装 Apache Web 服务器的任务。
通常在 Ubuntu 上,安装 Apache 是通过 apt-get
安装 apache2
包的简单案例。 为了通过 Ansible 做到这一点,我们使用 Ansible 的 apt 模块。 apt
模块包含许多用于专用 apt-get
功能的选项。 我们感兴趣的选项是:
- name:要安装的包名,可以是单个包名,也可以是包列表。
- state:接受
latest
、absent
或present
。 latest 确保安装了最新版本,present 只是检查它是否已安装,如果已安装,则将其删除。 - 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,并且您还没有手动连接到它来运行命令。
此时需要注意的一个重要概念是 idempotence,它是 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
软件包已经安装,所以没有任何改变。 在处理跨多个主机的复杂剧本时,能够识别不同的主机变得非常有用。 例如,如果您注意到主机 总是 需要更新特定的配置,那么该主机上的用户或进程可能正在更改它。 如果没有幂等性,这可能永远不会被注意到。
第 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
,但我们不希望每次应用我们的剧本时都运行它。 为了解决这个问题,我们需要使用 任务处理程序 。 处理程序的工作方式是,可以告诉任务在更改时通知处理程序,并且处理程序仅在任务更改时运行。
为此,我们需要将 notify
选项添加到 apache2_module
任务中,然后我们可以使用 service 模块在处理程序中重新启动 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
行或作为末尾的新行。 - state –
present
或absent
。
注意:如果 lineinfile
模块与 regexp
的现有行不匹配,则该模块将在文件末尾追加该行。 如果需要,选项 insertbefore
和 insertafter
可以指定将其添加到之前或之后而不是末尾的行。
将端口从 80
更新到 8081
我们需要做的是查找定义端口 80
的现有行,并将它们更改为定义端口 [X161X ]。
打开 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
作为此过程的一部分,并且我们可以重复使用相同的处理程序,但尽管有多个更改的任务,但该处理程序只会被触发一次。
现在运行剧本。
ansible-playbook apache.yml --ask-sudo-pass
Ansible 完成后,您应该能够在浏览器中访问您的主机,它将响应端口 8081
,而不是端口 80
。 在大多数 Web 浏览器中,这可以通过在 URL 的末尾添加 :port
来轻松实现:http://111.111.111.111:8081/
。
lineinfile
模块非常强大,可以很容易地修改现有配置。 唯一需要注意的是,您需要知道您正在使用它更改的文件中会发生什么,但它支持支持大多数简单用例的各种选项。
第 6 步 — 配置虚拟主机
Ansible 具有几个模块,可以将本地(到 Ansible)模板文件复制到主机上。 为此目的最常用的两个模块是 copy 模块和 template 模块。 copy
模块按原样复制文件并且不对其进行任何更改,而更强大的 template
模块跨模板复制并通过使用双花括号 ( IE 模板:Variable
)。
在本节中,我们将使用 template 模块在您的服务器上配置一个新的虚拟主机。 会有很多变化,所以我们将逐个解释它们,并在这一步的末尾包含整个更新的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
保存并关闭文件,然后运行 playbook。
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 的其他功能。