介绍
如今,服务器需要非常频繁地创建和销毁。这是因为,有时服务器会承受很大的执行负载,而其他时候负载会减少,从而浪费系统资源。一个常见的例子是电子商务网站在节日期间吸引了大量的流量。当应用程序的性质是可扩展的时,总是需要配置管理工具来使创建服务器的整个过程更加容易。Ansible 是一个出色的配置管理工具,它使用标准程序自动创建服务器,从而减少人为错误。
Ansible 不需要在此服务器节点上安装特殊的软件。它拥有编写、构建和促进脚本自动化所需的所有工具。本教程详细阐述了如何使用 Ansible 来自动执行我们如何设置您的 Ubuntu 服务器 教程中的步骤.
前提条件
为了完成本指南,我们将使用 Ubuntu 20.04。此外,您还需要:
-
一个 Ansible 控制节点:一台运行最新 Ubuntu 版本的 Ubuntu 机器。Ansible 的主二进制文件必须在这台机器上安装并运行。这台机器应该能够连接到 Ansible 节点。对于这些连接,您需要使用 SSH 密钥。为了避免连接时出现问题,请确保您的 Ansible 控制节点已启用防火墙。如果您需要帮助,请查看我们的 在 Ubuntu 20.04 上安装和配置 Ansible 博客。
-
Ansible 主机:需要连接的一个或多个主机。这些主机本质上是 Ansible 中的受管节点。这些必须是 Ubuntu 服务器。
Ansible Playbook 的功能
您可以手动设置以下所有步骤。但是,我们将自动执行此操作。当您运行此 playbook 时,它将在您的机器上执行以下操作:
-
它将安装 aptitude,这是 Ansible 首选的包管理器。
-
它将创建一个管理组 wheel,具有免密码的 sudo 权限。
-
它将创建一个新的 sudo 用户。
-
它将复制一个本地 SSH 密钥到 authorized_keys。这用于远程主机上的新管理用户。
-
它将禁用 root 用户的密码身份验证。
-
它将安装必要的软件包。
-
它将配置 UFW 防火墙 以仅允许 SSH 连接。任何其他连接都将被阻止。
一旦 Playbook 执行完毕,一个新用户将可用。您可以使用此用户登录系统。
使用 Ansible Playbook
要设置服务器,您将需要初始服务器设置 playbook 及其依赖项。如果您是第一次使用它,则需要使用下面的链接克隆该仓库:
|
1 |
cd ~ |
|
1 |
git clone https://github.com/do-community/ansible-playbooks.git |
|
1 |
cd ansible-playbooks |
如果您的系统中已经存在该仓库,请运行以下命令以获取最新更新:
|
1 |
cd ~/ansible-playbooks |
|
1 |
git pull |
您将在机器上获得以下文件结构:
|
1 2 3 4 |
setup |-- playbook.yml |__vars |-- default,yml |
以下是这些文件的说明:
-
vars/default.yml:此文件包含用于配置 Ansible 节点的变量。
-
playbook.yml:此文件包含要在服务器上执行的任务。
文件 vars/default.yml 看起来像这样:
|
1 2 3 4 |
--- create_user: my_user copy_local_key: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}" sys_packages: [ 'curl', 'vim', 'git', 'ufw'] |
以下是这些变量的说明。如果您希望编辑它们,可以用您自己的值替换它们的值:
-
create_user:这是创建的用户。该用户具有 sudo 权限。
-
copy_local_key: 这包含本地 SSH 公钥的路径。它将被复制到远程服务器,保存为 authorized_key.
-
sys_packages: 如果您想在服务器上安装一个或多个软件包,请在此处以数组形式列出。
编辑完此文件后,保存内容。然后,在 nano 中,按 CTRL+X , Y. 然后, ENTER 以保存文件内容。
现在您已准备好在多台服务器上运行此 playbook。默认情况下,Playbook 已准备好在您的清单(inventory)中的服务器上执行。如果您想在某些特定的服务器上使用该 Playbook,可以使用 -l 标志。现在假设远程服务器有多个用户,您可以使用 -u 标志来指定要连接的用户。
如果您的服务器名称是 my_server 且用户名是 my_user,然后运行以下命令在 Ansible 节点上执行:
|
1 |
ansible-playbook playbook.yml -l my_server -u my_user |
您将获得类似以下内容的输出:
|
1 2 3 4 5 6 7 8 9 |
PLAY [all] ***************************************************************************************************************************** TASK [Gathering Facts] ***************************************************************************************************************** ok: [my_server] TASK [Install Prerequisites] *********************************************************************************************************** changed: [my_server] TASK [Make sure we have a 'wheel' group] *********************************************************************************************** changed: [my_server] TASK [Allow 'wheel' group to have passwordless sudo] *********************************************************************************** changed: [my_server] |
执行完成后,您可以使用以下命令进行连接:
|
1 |
ssh my_user@server_host_or_IP |
请记住, my_user 是我们在 vars/default.yml 文件中使用的名称。您还需要在上述命令中将服务器 IP 更改为您服务器的 IP。如果您提供了 copy_local_key 变量以指向某个自定义 SSH 密钥,请使用 -i 参数指定位置:
|
1 |
ssh my_user@server_host_or_IP -i ~/.ssh/ansible_controller_key |
接下来,登录到您的服务器以检查 UFW 防火墙的规则:
|
1 |
sudo ufw status |
您将获得如下输出:
|
1 2 3 4 5 |
状态: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) |
上述输出确认 UFW 防火墙已成功配置完成。这是我们 playbook 中的最后一步。如果执行正确,这意味着执行已成功。
Ansible Playbook 内容
我们在本教程中使用的 Playbook 文件托管在 GitHub 上的 do-community/ansible-playbooks 仓库 master 分支下的 ansible-playbooks/setup_ubuntu1804。如果您想查看每个文件的内容以进行使用或编辑,请点击每个脚本顶部的 Raw 按钮。
为了快速参考,我们将分享 Playbook 的完整内容以及相关文件:
-
vars/default.yml
此文件包含 playbook 任务将使用的值。这些值包括用户名、权限、SSH 密钥、作为初始设置的一部分要安装的软件包等等:
|
1 2 3 4 |
--- create_user: my_user copy_local_key: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}" sys_packages: [ 'curl', 'vim', 'git', 'ufw'] |
-
playbook.yml
该 playbook.yml 文件包含要执行的任务。首先,该文件列出了所有要作为目标的主机。如果您想指定所有服务器,请将此键的值设为 all。接下来,如果您想指定使用 sudo 权限执行的任务,可以将变量的值设置为 become: true。最后,此文件需要包含上述 vars/default.yml 文件。我们接下来包含这些内容,以便从该文件中加载设置:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
--- - hosts: all become: true vars_files: - vars/default.yml tasks: - name: 安装 先决条件 apt: name=aptitude update_cache=yes state=latest force_apt_get=yes # Sudo 组设置 - name: 确保 sure 我们 有 一个 'wheel' 组 group: name: wheel state: present - name: 允许 'wheel' 组 拥有 无密码 sudo 权限 lineinfile: path: /etc/sudoers state: present regexp: '^%wheel' line: '%wheel ALL=(ALL) NOPASSWD: ALL' validate: '/usr/sbin/visudo -cf %s' # 用户 + 密钥设置 - name: 创建 一个 新 普通 用户 具有 sudo 权限 user: name: "{{ create_user }}" state: present groups: wheel append: true create_home: true shell: /bin/bash - name: 设置 授权 密钥 给 远程 用户 authorized_key: user: "{{ create_user }}" state: present key: "{{ copy_local_key }}" - name: 禁用 密码 身份验证 针对 root lineinfile: path: /etc/ssh/sshd_config state: present regexp: '^#?PermitRootLogin' line: 'PermitRootLogin prohibit-password' # 安装软件包 - name: 更新 apt apt: update_cache=yes - name: 安装 所需的 系统 软件包 apt: name={{ sys_packages }} state=latest # UFW 设置 - name: UFW - 允许 SSH 连接 ufw: rule: allow name: OpenSSH - name: UFW - 拒绝 所有 其他 传入 流量 默认地 ufw: state: enabled policy: deny direction: incoming |
结论
自动化是 IT 的关键,它能确保所有流程都准确无误,并遵循标准实践和程序。由于当今大多数软件都是通过网络交付且具有分布式特性,因此创建新服务器已成为一项日常任务,例如针对不同的环境(如测试或生产环境),甚至是演示环境。
在本教程中,我们演示了如何使用 Ansible 实现服务器自动化,这是一个功能强大且易于使用的工具,可以为您节省大量时间。
祝您计算愉快!
评论
暂无评论。发表第一条评论吧。