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

介绍

服务器自动化现在在系统管理中起着至关重要的作用,因为现代应用环境的可调用性质。 配置管理 工具如 Ansible 通常用于通过为新服务器建立标准程序来简化服务器设置的自动化过程,同时也减少了与手动设置相关的人为错误。

Ansible提供了一个简单的架构,不需要在节点上安装特殊软件,它还提供了一组强大的功能和内置模块,可方便编写自动化脚本。

本指南解释了如何使用 Ansible 来自动化我们 Ubuntu 18.04 服务器的初始服务器设置指南中的步骤。

前提条件

为了执行我们在本指南中讨论的播放簿提供的自动设置,您将需要:

  • One Ansible 控制节点:安装并配置为使用 SSH 键连接您的 Ansible 主机的 Ubuntu 18.04 机器,请确保控制节点具有有 sudo 权限的常规用户和启用防火墙,如我们在 初始服务器设置指南中所解释的那样。

<$>[注] 在继续之前,您需要先确保您的 Ansible 控制节点能够在您的 Ansible 主机(s)上连接和执行命令。

这个 Playbook 能做什么?

此 Ansible 播放本提供了通过 Ubuntu 18.04 初始服务器设置指南Ubuntu 18.04 上设置 SSH 密钥的指南中描述的手动运行方法的替代方案。

运行此播放簿将在您的 Ansible 主机上执行以下操作:

安装aptitude,这是Ansible选择的apt包管理器的替代方案 。2创建管理组 wheels并将其配置为 passwordless sudo 。3创建一个新的 sudo 用户 。4复制本地 SSH 公共密钥并将其列入远程主机上的新管理用户的authorized_keys文件 。5禁用对 root用户的基于密码的身份验证 6.安装系统包 7.配置 UFW firewall 仅允许 SSH 连接并拒绝任何其他请求

一旦播放簿完成运行,您将有一个新的用户,您可以使用它来登录服务器。

如何使用这个 Playbook

您需要做的第一件事是从 do-community/ansible-playbooks 存储库中获取初始的服务器设置播放簿及其依赖。

如果这是你第一次使用Do-community/ansible-playbooks存储库,你应该开始将存储库克隆到你的控制器节点:

1[environment local]
2cd ~
3git clone https://github.com/do-community/ansible-playbooks.git
4cd ansible-playbooks

如果您之前在遵循不同的指南时克隆了此存储库,请访问现有的ansible-playbooks副本并运行一个git pull命令,以确保您更新了内容:

1[environment local]
2cd ~/ansible-playbooks
3git pull

我们感兴趣的文件位于 setup_ubuntu1804 文件夹中,其结构如下:

1[environment local]
2setup_ubuntu1804
3├── playbook.yml
4└── vars
5    └── default.yml

以下是这些文件中的每一个是什么:

●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●

我们将编辑播放簿的变量文件以定制其值。 访问 setup_ubuntu1804 目录,并使用您所选择的命令行编辑器打开 vars/default.yml 文件:

1[environment local]
2cd setup_ubuntu1804
3nano vars/default.yml

此文件包含一些需要您的注意的变量:

1[label vars/default.yml]
2[environment local]
3---
4create_user: sammy
5copy_local_key: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}"
6sys_packages: [ 'curl', 'vim', 'git', 'ufw']

下列列表包含每个变量的简要解释,以及您可能想要如何更改它们:

  • create_user: 将创建的 sudo 用户的名称. 在本示例中,我们将使用 sammy.
  • copy_local_key: 要复制到远程服务器的本地 SSH 公钥文件的路径,并为新 sudo 用户添加为 authorized_key。 默认值使用了 lookup插件,以获取当前系统用户在 Ansible 控制节点
  • sys_packages: 包含您希望在您的主机上作为初始服务器设置的一部分安装的软件包列表的路径。

一旦您完成了vars/default.yml中的变量更新,请保存并关闭此文件. 如果您使用了nano,请按CTRL + X,Y,然后按ENTER

您现在已经准备好在一个或多个服务器上运行此播放簿. 大多数播放簿已配置为在您的库存中的每个服务器上执行,默认情况下. 我们可以使用 -l 旗帜来确保只有一个服务器子集或单个服务器受到播放簿的影响。

若要只在「server1」上執行播放簿,以「root」方式連接,您可以使用下列命令:

1[environment local]
2ansible-playbook playbook.yml -l server1 -u root

你会得到类似于此的输出:

 1[secondary_label Output]
 2
 3PLAY [all] *****************************************************************************************************************************
 4
 5TASK [Gathering Facts] *****************************************************************************************************************
 6ok: [server1]
 7
 8TASK [Install Prerequisites] ***********************************************************************************************************
 9changed: [server1]
10
11TASK [Make sure we have a 'wheel' group] ***********************************************************************************************
12changed: [server1]
13
14TASK [Allow 'wheel' group to have passwordless sudo] ***********************************************************************************
15changed: [server1]
16
17TASK [Create a new regular user with sudo privileges] **********************************************************************************
18changed: [server1]
19
20TASK [Set authorized key for remote user] **********************************************************************************************
21changed: [server1]
22
23TASK [Disable password authentication for root] ****************************************************************************************
24changed: [server1]
25
26TASK [Update apt] **********************************************************************************************************************
27changed: [server1]
28
29TASK [Install required system packages] ************************************************************************************************
30ok: [server1]
31
32TASK [UFW - Allow SSH connections] *****************************************************************************************************
33changed: [server1]
34
35TASK [UFW - Deny all other incoming traffic by default] ********************************************************************************
36changed: [server1]
37
38PLAY RECAP *****************************************************************************************************************************
39server1                 : ok=11 changed=9 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

<$>[注] :有关如何运行 Ansible 播放本的更多信息,请参阅我们的 Ansible Cheat Sheet Guide

播放簿執行完成後,您將能夠登入伺服器:

1[environment local]
2ssh sammy@server_host_or_IP

请记住,用create_user变量定义的用户代替sammy,用服务器的主机名称或IP地址代替server_host_or_IP。

如果您更改了「copy_local_key」变量,以指向自定义的 SSH 密钥(而不是当前系统用户的密钥),则在通过 SSH 作为新用户连接时,您需要提供一个额外的参数,指定其私钥对象的位置:

1[environment local]
2ssh sammy@server_host_or_IP -i ~/.ssh/ansible_controller_key

在登录到服务器后,您可以检查UFW防火墙的活跃规则,以确认它是否正确配置:

1[environment second]
2sudo ufw status

你应该得到类似于此的输出:

1[secondary_label Output]
2[environment second]
3Status: active
4
5To Action From
6--                         ------      ----
7OpenSSH ALLOW Anywhere                  
8OpenSSH (v6)               ALLOW Anywhere (v6)

这意味着UFW防火墙已成功启用,因为这是播放书中的最后一项任务,它确认播放书已在这个服务器上完全执行。

剧本内容

您可以在 ansible-playbooks repository中找到本教程中介绍的初始服务器设置播放簿,在 DigitalOcean Community Playbooks中找到。

播放书的完整内容以及相关文件也包括在这里,以便您方便。

首选 / 默认.yml

Default.yml变量文件包含在播放簿任务中使用的值,例如将创建的用户名和作为初始服务器设置的一部分安装的包。

1[label vars/default.yml]
2[environment local]
3---
4create_user: sammy
5copy_local_key: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}"
6sys_packages: [ 'curl', 'vim', 'git', 'ufw']

图书馆.yml

playbook.yml文件定义了此设置中的所有任务,它从定义该设置的目标服务器组(所有)开始,然后它使用become: true来定义任务应该默认执行的特权升级(sudo)然后,它包括vars/default.yml变量文件来加载配置选项。

 1[label playbook.yml]
 2[environment local]
 3---
 4- hosts: all
 5  become: true
 6  vars_files:
 7    - vars/default.yml
 8
 9  tasks:
10    - name: Install Prerequisites
11      apt: name=aptitude update_cache=yes state=latest force_apt_get=yes
12
13  # Sudo Group Setup
14    - name: Make sure we have a 'wheel' group
15      group:
16        name: wheel
17        state: present
18
19    - name: Allow 'wheel' group to have passwordless sudo
20     lineinfile:
21        path: /etc/sudoers
22        state: present
23        regexp: '^%wheel'
24        line: '%wheel ALL=(ALL) NOPASSWD: ALL'
25        validate: '/usr/sbin/visudo -cf %s'
26
27  # User + Key Setup
28    - name: Create a new regular user with sudo privileges
29      user:
30        name: "{{ create_user }}"
31        state: present
32        groups: wheel
33        append: true
34        create_home: true
35        shell: /bin/bash
36
37    - name: Set authorized key for remote user
38      authorized_key:
39        user: "{{ create_user }}"
40        state: present
41        key: "{{ copy_local_key }}"
42
43    - name: Disable password authentication for root
44      lineinfile:
45        path: /etc/ssh/sshd_config
46        state: present
47        regexp: '^#?PermitRootLogin'
48        line: 'PermitRootLogin prohibit-password'
49
50  # Install Packages
51    - name: Update apt
52      apt: update_cache=yes
53
54    - name: Install required system packages
55      apt: name={{ sys_packages }} state=latest
56
57 # UFW Setup
58    - name: UFW - Allow SSH connections
59      ufw:
60        rule: allow
61        name: OpenSSH
62
63    - name: UFW - Deny all other incoming traffic by default
64      ufw:
65        state: enabled
66        policy: deny
67        direction: incoming

您可以自由地修改本图书或添加新的任务,以便在您自己的工作流程中最适合您的个性化需求。

结论

自动化初始服务器设置可以节省时间,同时确保您的服务器遵循标准配置,可以根据您的需求进行改进和定制。

在本指南中,我们展示了如何使用Ansible来自动化在新服务器上执行的初始任务,例如创建具有sudo访问的非根用户、启用UFW和禁用基于远程密码的根登录。

如果您想在本图书中添加新任务,以进一步定制初始服务器设置,请参阅我们介绍的 Ansible 指南 配置管理 101:编写 Ansible 图书

Published At
Categories with 技术
comments powered by Disqus