介绍
当您第一次创建新的Ubuntu 18.04服务器时,您应该尽早采取一些配置步骤作为基本设置的一部分。 这将提高服务器的安全性和可用性,为后续操作奠定坚实的基础。
虽然您可以手动完成这些步骤,但自动化过程将节省您的时间并消除人为错误。 随着容器化应用和微服务的普及,服务器自动化现在在系统管理中发挥着至关重要的作用。 它也是为新服务器建立标准过程的一种方法。
本指南介绍如何使用Ansible自动执行“ 初始服务器设置指南”中包含的步骤。 Ansible是一种现代配置管理工具,可用于自动化远程系统的配置和配置。
飞行前检查
为了执行我们在本指南中讨论的剧本提供的自动设置,您需要:
- Ansible安装在本地计算机上或安装在Ansible Control Node上的远程服务器上。 您可以按照教程如何在Ubuntu 18.04上安装和配置Ansible的第1步进行设置。
- 对将由Ansible管理的一个或多个Ubuntu 18.04服务器的Root访问权限。
在运行Playbook之前,确保Ansible能够通过SSH连接到您的服务器并使用Python运行Ansible模块非常重要 。 接下来的两节将介绍如何设置Ansible清单以包含服务器以及如何运行ad-hoc Ansible命令来测试连接和有效凭据。
库存文件
清单文件包含有关使用Ansible管理的主机的信息。 您可以在清单文件中包含一到几百台服务器,并且可以将主机组织到组和子组中。 清单文件还经常用于设置仅对某些主机和组有效的变量,以便在playbooks和模板中使用。 一些变量也会影响playbook的运行方式,比如我们稍后会看到的ansible_python_interpreter
变量。
要检查默认Ansible清单的内容,请在本地计算机或Ansible Control节点上使用您选择的命令行编辑器打开/etc/ansible/hosts
文件:
sudo nano /etc/ansible/hosts
注意 :某些Ansible安装不会创建默认库存文件。 如果系统中不存在该文件,则可以在/etc/ansible/hosts
创建新文件,或者在运行命令和playbooks时使用-i参数提供自定义库存路径。
Ansible安装提供的默认清单文件包含许多示例,您可以将这些示例用作设置清单的参考。 以下示例定义了一个名为servers的组,其中包含三个不同的服务器,每个服务器由一个自定义别名标识: server1 , server2和server3 :
[servers]server1 ansible_host=203.0.113.111server2 ansible_host=203.0.113.112server3 ansible_host=203.0.113.113[servers:vars]ansible_python_interpreter=/usr/bin/python3
server:vars
子组设置ansible_python_interpreter
主机参数,该参数对servers
组中包含的所有主机都有效。 此参数确保远程服务器使用/usr/bin/python3
Python 3可执行文件而不是/usr/bin/python
(Python 2.7),这在最近的Ubuntu版本中不存在。
要完成设置清单文件,请将突出显示的IP替换为服务器的IP地址。 完成后,按CTRL+X
保存并关闭文件,然后按y
确认更改,然后按ENTER
。
现在您的库存文件已准备就绪,是时候测试与节点的连接
测试连通性
在设置库存文件以包含您的服务器之后,是时候检查Ansible是否能够连接到这些服务器并通过SSH运行命令。 对于本指南,我们将使用Ubuntu root帐户,因为这通常是新创建的服务器上默认的唯一帐户。 此playbook将创建一个具有sudo
权限的新非root用户,您应该在后续与远程服务器的交互中使用该权限。
从本地计算机或Ansible Control节点,运行:
ansible -m ping all -u root
此命令将使用内置的ping
Ansible模块在默认库存的所有节点上运行连接测试,以root身份连接。 ping
模块将测试:
如果主机可以访问;
如果您有有效的SSH凭据;
如果主机能够使用Python运行Ansible模块。
如果您使用基于密码的身份验证来连接到远程服务器而不是基于密钥的身份验证,则应该向Ansible命令提供附加参数-k
,以便它提示您输入连接用户的密码。
ansible -m ping all -u root -k
注意:请记住,某些服务器可能具有针对基于用户的基于密码的身份验证的其他安全措施,并且在某些情况下,您可能需要手动登录到服务器以更改初始root密码。
您应该获得类似于此的输出:
server1 | SUCCESS => { "changed": false, "ping": "pong"}server2 | SUCCESS => { "changed": false, "ping": "pong"}server3 | SUCCESS => { "changed": false, "ping": "pong"}
如果这是您第一次通过SSH连接到这些服务器,则会要求您通过Ansible确认您要连接的主机的真实性。 出现提示时,键入yes
,然后Enter
确认。
一旦您从主机获得“pong”回复,这意味着您已准备好在该服务器上运行Ansible命令和playbooks。
这本剧本有什么作用?
这个Ansible手册提供了另一种方法,可以手动运行Ubuntu 18.04初始服务器设置指南和Ubuntu 18.04上设置SSH密钥的指南中概述的过程。
运行此playbook将导致执行以下操作:
- 创建管理组轮 ,然后配置为无密码sudo 。
- 使用
create_user
变量指定的名称在该组中创建新的管理用户。 - 从变量
copy_local_key
定义的位置复制公共SSH密钥,并将其添加到上一步中创建的用户的authorized_keys
文件中。 - 对root用户禁用基于密码的身份验证。
- 更新本地
apt
包索引,并安装由变量sys_packages
定义的基本包。 - UFW防火墙配置为仅允许SSH连接并拒绝任何其他请求。
有关本剧集中包含的每个步骤的更多信息,请参阅我们的Ubuntu 18.04初始服务器设置指南 。
Playbook运行完毕后,您将能够使用新创建的sudo
帐户登录服务器。
如何使用本手册
首先,我们将把Playbook的内容下载到Ansible Control Node。 这可以是您的本地计算机,也可以是安装了Ansible并设置了库存的远程服务器。
要从命令行下载此playbook,您可以使用curl
:
curl -L https://raw.githubusercontent.com/do-community/ansible-playbooks/master/initial_server_setup/ubuntu1804.yml -o initial_server_setup.yml
这会将playbook的内容下载到当前本地路径上名为initial_server_setup.yml
的文件中。 您可以使用您选择的命令行编辑器打开文件来检查playbook的内容:
sudo nano initial_server_setup.yml
打开playbook文件后,您应该注意到一个名为vars的部分,其中包含三个需要您注意的不同变量:
- create_user :要创建和授予sudo权限的非root用户帐户的名称。 我们的示例使用sammy ,但您可以使用您想要的任何用户名。
- copy_local_key :有效SSH公钥的本地路径,用于设置新的非root
sudo
帐户的授权密钥。 默认值指向位于~/.ssh/id_rsa.pub
的当前本地用户的~/.ssh/id_rsa.pub
。 - sys_packages :将使用包管理器工具
apt
安装的基本系统包的列表。
完成更新initial_server_setup.yml
的变量后,保存并关闭文件。
您现在已准备好在一台或多台服务器上运行此剧本。 默认情况下,大多数手册都配置为在您的广告资源中的all
服务器上执行。 我们可以使用-l
标志来确保只有一部分服务器或单个服务器受到该剧本的影响。 要仅在server1
上执行playbook,可以使用以下命令:
ansible-playbook initial_server_setup.yml -l server1
您将获得类似于此的输出:
PLAY [all] ***************************************************************************************************************************************TASK [Make sure we have a 'wheel' group] *********************************************************************************************************changed: [server1]TASK [Allow 'wheel' group to have passwordless sudo] *********************************************************************************************changed: [server1]TASK [Create a new regular user with sudo privileges] ********************************************************************************************changed: [server1]TASK [Set authorized key for remote user] ********************************************************************************************************changed: [server1]TASK [Disable password authentication for root] **************************************************************************************************changed: [server1]TASK [Update apt] ********************************************************************************************************************************changed: [server1]TASK [Install required system packages] **********************************************************************************************************ok: [server1]TASK [UFW - Allow SSH connections] ***************************************************************************************************************changed: [server1]TASK [UFW - Deny all other incoming traffic by default] ******************************************************************************************changed: [server1]PLAY RECAP ***************************************************************************************************************************************server1 : ok=9 changed=8 unreachable=0 failed=0
Playbook执行完成后,您将能够使用以下命令登录服务器:
ssh sammy@server_domain_or_IP
请记住使用create_user
变量定义的用户替换sammy ,并使用服务器的主机名或IP地址替换server_domain_or_IP 。
如果您使用copy_local_key
变量设置了自定义公钥,则需要提供一个额外的参数来指定其私钥对应的位置:
ssh sammy@server_domain_or_IP -i ~/.ssh/ansible_controller_key
登录到服务器后,您可以检查UFW防火墙的活动规则以确认它已正确配置:
sudo ufw status
您应该获得类似于此的输出:
Status: activeTo Action From-- ------ ----OpenSSH ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6)
这意味着已成功启用UFW防火墙。 由于这是剧本中的最后一项任务,因此确认该剧本在该服务器上完全执行。
Playbook内容
您可以在DigitalOcean 社区GitHub组织的ansible-playbooks存储库中找到初始服务器设置手册。 要直接复制或下载脚本内容,请单击脚本顶部的“ 原始”按钮,或单击此处直接查看原始内容 。
为方便起见,此处还包括完整内容:
---- hosts: all remote_user: root gather_facts: false vars: create_user: sammy copy_local_key: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}" sys_packages: [ 'curl', 'vim', 'git', 'ufw' ] tasks: - name: Make sure we have a 'wheel' group group: name: wheel state: present - name: Allow 'wheel' group to have passwordless sudo lineinfile: path: /etc/sudoers state: present regexp: '^%wheel' line: '%wheel ALL=(ALL) NOPASSWD: ALL' validate: '/usr/sbin/visudo -cf %s' - name: Create a new regular user with sudo privileges user: name: "{{ create_user }}" groups: wheel shell: /bin/bash - name: Set authorized key for remote user authorized_key: user: "{{ create_user }}" state: present key: "{{ copy_local_key }}" - name: Disable password authentication for root lineinfile: path: /etc/ssh/sshd_config state: present regexp: '^PermitRootLogin' line: 'PermitRootLogin prohibit-password' - name: Update apt apt: update_cache=yes - name: Install required system packages apt: name={{ sys_packages }} state=latest - name: UFW - Allow SSH connections ufw: rule: allow name: OpenSSH - name: UFW - Deny all other incoming traffic by default ufw: state: enabled policy: deny direction: incoming
您可以随意修改此剧本,或在您自己的工作流程中包含最适合您个人需求的新任务。
结论
自动化初始服务器设置可以节省您的时间,同时还确保您的服务器遵循可以根据您的需求进行改进和定制的标准配置。 由于现代应用程序的分布式特性以及不同临时环境之间需要更加一致,因此这种自动化变得必不可少。
在本指南中,我们演示了如何使用Ansible自动执行应在新服务器上执行的初始任务,例如创建具有sudo访问权限的非root用户,启用UFW并禁用远程root登录。
如果您想在此剧集中包含新任务以进一步自定义初始服务器设置,请参阅我们的安装指南配置管理101:编写Ansible Playbooks 。