在Ubuntu 18.04上使用Ansible自动执行初始服务器设置

当您第一次创建新的Ubuntu 18.04服务器时,您应该尽早采取一些配置步骤作为基本设置的一部分。本指南介绍了如何使用Ansible(一种现代配置管理工具)来自动执行初始服务器设置指南的步骤。虽然您可以手动完成这些步骤,但可以更方便地自动执行该过程,以节省时间并减少人为错误。

介绍

当您第一次创建新的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的组,其中包含三个不同的服务器,每个服务器由一个自定义别名标识: server1server2server3

的/ etc / ansible /主机
[servers]
server1 ansible_host=203.0.113.111
server2 ansible_host=203.0.113.112
server3 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将导致执行以下操作:

  1. 创建管理组 ,然后配置为无密码sudo
  2. 使用create_user变量指定的名称在该组中创建新的管理用户。
  3. 从变量copy_local_key定义的位置复制公共SSH密钥,并将其添加到上一步中创建的用户的authorized_keys文件中。
  4. root用户禁用基于密码的身份验证。
  5. 更新本地apt包索引,并安装由变量sys_packages定义的基本包。
  6. 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: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                  
OpenSSH (v6)               ALLOW       Anywhere (v6)             

这意味着已成功启用UFW防火墙。 由于这是剧本中的最后一项任务,因此确认该剧本在该服务器上完全执行。

Playbook内容

您可以在DigitalOcean 社区GitHub组织ansible-playbooks存储库中找到初始服务器设置手册。 要直接复制或下载脚本内容,请单击脚本顶部的“ 原始”按钮,或单击此处直接查看原始内容

为方便起见,此处还包括完整内容:

initial_server_setup.yml
---
- 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


分享按钮