如何使用Ansible在Rocky Linux 9上自动设置服务器初始化
介绍
现在,服务器自动化在系统管理中起着关键作用,这是因为现代应用环境的可丢弃特性。通常使用配置管理工具,比如Ansible,来简化服务器设置的自动化流程,通过建立新服务器的标准流程,同时减少与手动设置相关的人为错误。
Ansible提供了一种简单的架构,不需要在节点上安装特殊软件。它还提供了一系列强大的功能和内置模块,可促进编写自动化脚本。
本指南阐述了如何使用Ansible自动化我们Rocky Linux 9服务器的初始服务器设置指南中的步骤。
先决条件
要跟随这个教程,你需要:
- One Ansible control node: a Rocky Linux 9 machine with Ansible installed and configured to connect to your Ansible hosts using SSH keys. Make sure the control node has a regular user with sudo permissions and a firewall enabled, as explained in our Initial Server Setup guide. To set up Ansible, see Step 1 of our guide on How to Install and Configure Ansible on Rocky Linux 9. You don’t normally need to install from the exact same Linux version onto the same target version (for example, from Rocky Linux 9 to Rocky Linux 9 in this case), but it keeps everything consistent for demonstration purposes.
- One remote server with a clean install of Rocky Linux 9: no prior setup is required on this server, but you must have SSH access to this server from the Ansible control node mentioned above. If you do not already have SSH access to the remote server from the Ansible control node, refer to our tutorial on How to Set Up SSH Keys. This server will become an Ansible host remote server, which is targeted for automated provisioning by the Ansible control node.
这本战略手册有什么作用?
这个 Ansible Playbook 提供了一种替代方法,可以避免每次启动服务器时手动按照《Rocky Linux 9 初始服务器设置指南》和《Rocky Linux 9 SSH 密钥设置指南》的步骤进行操作。只需设置一次 Playbook,之后每次都可以使用它来设置服务器。
运行此剧本将在您的Ansible主机上执行以下操作:
-
- 创建一个新的sudo用户并设置无密码sudo。
-
- 将本地SSH公钥复制并包含在远程主机上新的管理员用户的authorized_keys文件中(如果你之前对SSH使用的是密码)。
-
- 禁用root用户的基于密码的身份验证。
- 安装系统软件包。
一旦操作手册完成运行,你将会有一个新的用户可以用来登录服务器。
首先,在您的 Ansible 控制节点服务器上,使用具有sudo权限的用户登录。
步骤1 — 准备您的Ansible控制节点
在您的Ansible控制节点服务器上,将您的Ansible主机远程服务器的IP添加到您的Ansible清单文件中。使用vi或您喜欢的文本编辑器,打开Ansible清单文件。
- sudo vi /etc/ansible/hosts
打开你的Ansible清单文件。将你的Ansible主机远程服务器的IP地址添加到[servers]块中。
[servers]
server1 ansible_host=your_remote_server_ip
. . .
保存并关闭文件。
现在,您将在Ansible控制节点和Ansible主机远程服务器之间测试和验证您的SSH连接。
- ssh root@your_remote_server_ip
接受身份验证请求,如果有提示,请输入密码。在验证SSH连接后,按下CTRL+D关闭连接并返回到您的控制节点。
第二步——准备你的游戏计划。
playbook.yml文件是定义所有任务的地方。一个任务是您可以使用Ansible playbook自动化的最小的动作单元。使用vi或您喜欢的文本编辑器创建您的playbook文件。
- vi playbook.yml
这将打开一个空的YAML文件。在开始添加任务到你的剧本之前,先添加以下内容:
---
- hosts: all
become: true
vars:
created_username: sammy
请随意用您选择的用户名替换此用户名。
几乎每本手册都会以类似的声明开始。hosts可以声明Ansible控制节点将使用此playbook来操作哪些服务器。become则表明所有命令将使用提升的root权限来执行。
使用变量可以将数据存储在变量中。如果将来决定更改用户名,您只需编辑文件中的这一行即可。
Note
第三步 – 将Sudo用户设置任务添加到您的Playbook中
默认情况下,Ansible按照剧本(playbook)中从上到下的顺序同步执行任务。这意味着任务的顺序很重要,您可以安全地假设一个任务在下一个任务开始之前会完成执行。
这个playbook中的所有任务都可以独立存在,并且可以在你的其他playbook中重复使用。
避免频繁使用root用户是一个良好的做法。您可以通过添加sudo特权来自动创建一个用户。
tasks:
- name: Setup passwordless sudo
lineinfile:
path: /etc/sudoers
state: present
regexp: '^%sudo'
line: '%sudo ALL=(ALL) NOPASSWD: ALL'
validate: '/usr/sbin/visudo -cf %s'
- name: Create a new regular user with sudo privileges
user:
name: "{{ created_username }}"
state: present
groups: wheel
append: true
create_home: true
你正在使用Ansible的lineinfile模块来定位并替换文件中的特定行。在这种情况下,你使用正则表达式来定位sudoers文件中的特定行,然后修改该行以实现sudo无需密码。你还使用visudo来验证你的更改,以防止出现任何错误。
为了利用这个功能,您正在使用用户模块添加一个新用户。Ansible将确保在用户不存在时创建该用户,该用户属于”wheel”(管理员)组,同时不会从其他组中删除,还会创建一个家目录。
Note
第四步 — 在您的Playbook中添加SSH密钥设置和禁用Root密码任务。
Ansible运行的前提是你使用SSH密钥。强烈推荐并且通常最佳实践是将SSH密钥与禁用root密码身份验证配对使用。为了自动化此过程,请添加:
- name: Set authorized key for remote user
ansible.posix.authorized_key:
user: "{{ created_username }}"
state: present
key: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}"
- name: Disable password authentication for root
lineinfile:
path: /etc/ssh/sshd_config
state: present
regexp: '^#?PermitRootLogin'
line: 'PermitRootLogin prohibit-password'
如果您提供用户名和密钥位置,可以使用authorized_key模块。在这里,使用Ansible的lookup函数构建密钥的路径。
使用lineinfile模块可以在sshd_config中搜索和替换一行,以禁用root的密码认证,限制对其特权的访问,提高安全性。
第五步 – 向Playbook中添加软件包安装任务
Ansible 可以确保您的服务器始终安装某些软件包。您不需要对每个软件包分别调用 dnf install 命令,也不需要将其分解为多个任务,只需列出您所有想要的软件包即可。
- name: Update and install required system packages
dnf:
pkg:
- curl
- vim
- git
- firewalld
state: latest
update_cache: true
您可以根据自己的喜好添加或移除软件包。这将确保所有软件包不仅存在,而且都是最新版本,并在使用 `dnf` 更新后执行。
第六步 – 检查你的完整战略手册
你的操作手册应该大致像下面这样,根据你的定制可能会有些微差异。
---
- hosts: all
become: true
vars:
created_username: sammy
tasks:
- name: Setup passwordless sudo
lineinfile:
path: /etc/sudoers
state: present
regexp: '^%sudo'
line: '%sudo ALL=(ALL) NOPASSWD: ALL'
validate: '/usr/sbin/visudo -cf %s'
- name: Create a new regular user with sudo privileges
user:
name: "{{ created_username }}"
state: present
groups: wheel
append: true
create_home: true
- name: Set authorized key for remote user
ansible.posix.authorized_key:
user: "{{ created_username }}"
state: present
key: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}"
- name: Disable password authentication for root
lineinfile:
path: /etc/ssh/sshd_config
state: present
regexp: '^#?PermitRootLogin'
line: 'PermitRootLogin prohibit-password'
- name: Update and install required system packages
dnf:
pkg:
- curl
- vim
- git
- firewalld
state: latest
update_cache: true
Note
一旦你对你的剧本感到满意,你可以关闭文本编辑器并保存。
第7步-第一次运行您的剧本
现在你已经准备好在一个或多个服务器上运行这个剧本了。大多数剧本默认配置为在清单中的每个服务器上执行,但这次你将指定你的服务器。
要仅在以root身份连接的server1上执行playbook,可以使用以下命令:
- ansible-playbook playbook.yml -l server1 -u root -k
-l参数指定您的服务器,-u参数指定要登录的远程服务器上的用户。由于您尚未设置远程服务器,root是您唯一的选择。如果您没有使用无密码SSH,则需要-k参数:它会提示您输入SSH密码。
你将会得到类似于这样的输出。
. . . PLAY RECAP *************************************************************************************************************************************************************************************************************************************************** server1 : ok=6 changed=5 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
这表示你的服务器设置完成了!你的输出不需要完全相同,但是很重要的是你必须没有任何故障。
现在你已经为你的剧本完成了第一次设置,所有后续的Ansible调用都可以使用用户sammy进行(如果你在第一次设置中使用了密码,则无需-k标志)。
- ansible-playbook playbook.yml -l server1 -u sammy
您还可以使用以下方式登录服务器:
- ssh sammy@your_remote_server_ip
记住要用由created_username变量定义的用户名替换sammy,并用你的服务器主机名或IP地址替换server_host_or_IP。
结论是… shì…)
自动化初始服务器设置可以节省时间,同时确保服务器遵循标准配置,便于根据需要进行改进和定制。随着现代应用程序的分布式特性和不同的分区环境之间需要更多的一致性,这样的自动化变得必不可少。
在本指南中,您演示了如何使用Ansible自动化执行在新服务器上应执行的初始任务,例如创建一个具有sudo访问权限的非root用户,安装软件包并禁用基于密码的远程root登录。
要了解如何运行Ansible Playbooks的更多信息,请查看我们的Ansible速查指南。
如果您想在此手册中包含新的任务,以进一步自定义初始服务器设置,请参考我们的入门指南《配置管理101:编写Ansible剧本》。您还可以查看我们的指南《如何使用Ansible角色来抽象化您的基础设施环境》。