Ansible 是适用于您的 IT 环境的完整自动化解决方案。您可以使用 Ansible 自动化 Linux 和 Windows 服务器配置、编排服务配置、部署云环境,甚至配置您的网络设备。
Ansible 模块 抽象化了您系统上的操作,因此您无需担心实现细节。您只需描述所需的状态,Ansible 即可确保目标系统与之匹配。
模块的可用性是 Ansible 的主要优势之一,通常被称为 Ansible “内置电池”。 实际上,您可以找到用于大量任务的模块,虽然这很棒,但我经常听到初学者说他们不知道从哪里开始。
虽然您对模块的选择将完全取决于您的需求以及您尝试使用 Ansible 自动化的内容,但以下是您需要开始使用 Ansible 进行 Linux 系统自动化的十大模块。
1. copy
copy 模块允许您将文件从 Ansible 控制节点复制到目标主机。 除了复制文件外,它还允许您为目标文件设置所有权、权限和 SELinux 标签。 以下是使用 copy 模块将“每日消息”配置文件复制到目标主机的示例
- name: Ensure MOTD file is in place
copy:
src: files/motd
dest: /etc/motd
owner: root
group: root
mode: 0644
对于不太复杂的内容,您可以将内容直接复制到目标文件,而无需本地文件,如下所示
- name: Ensure MOTD file is in place
copy:
content: "Welcome to this system."
dest: /etc/motd
owner: root
group: root
mode: 0644
此模块以幂等方式工作,这意味着仅当相同的文件尚未以相同的内容和权限就位时,它才会复制该文件。
copy 模块是复制少量具有静态内容的文件的好选择。 如果您需要复制大量文件,请查看 synchronize 模块。 要复制具有动态内容的文件,请查看下一个 template
模块。
2. template
template 模块的工作方式类似于 copy
模块,但它在使用 Jinja2 模板语言动态处理内容后,再将其复制到目标主机。
例如,定义一个“每日消息”模板,显示目标系统名称,如下所示
$ vi templates/motd.j2
Welcome to {{ inventory_hostname }}.
然后,使用 template
模块实例化此模板,如下所示
- name: Ensure MOTD file is in place
template:
src: templates/motd.j2
dest: /etc/motd
owner: root
group: root
mode: 0644
在复制文件之前,Ansible 会处理模板并插入变量,将其替换为目标主机系统名称。 例如,如果目标系统名称是 rh8-vm03
,则结果文件是
Welcome to rh8-vm03.
虽然 copy
模块在使用 content
参数时也可以插入变量,但 template
模块通过创建模板文件提供了额外的灵活性,使您能够定义更复杂的内容,包括 for
循环、if
条件等。 有关完整参考,请查看 Jinja2 文档。
此模块也是幂等的,如果目标系统上的内容已与模板的内容匹配,则不会复制该文件。
3. user
user 模块允许您在目标系统中创建和管理 Linux 用户。 此模块有许多不同的参数,但在其最基本的形式中,您可以使用它来创建新用户。
例如,要创建 UID 为 2001、属于组 users
和 wheel
且密码为 mypassword
的用户 ricardo
,请使用以下参数应用 user
模块
- name: Ensure user ricardo exists
user:
name: ricardo
group: users
groups: wheel
uid: 2001
password: "{{ 'mypassword' | password_hash('sha512') }}"
state: present
请注意,此模块尝试实现幂等性,但不能保证其所有选项都实现幂等性。 例如,如果您再次执行之前的模块示例,它会将密码重置为定义的值,从而在每次执行时更改系统中的用户。 为了使此示例具有幂等性,请使用参数 update_password: on_create
,以确保 Ansible 仅在创建用户时设置密码,而不在后续运行时设置密码。
您还可以通过设置参数 state: absent
来使用此模块删除用户。
user
模块有许多选项供您管理多个用户方面。 请务必查看模块文档以获取更多信息。
4. package
package 模块允许您使用操作系统标准软件包管理器在目标系统中安装、更新或删除软件包。
例如,要在 Red Hat Linux 机器上安装 Apache Web 服务器,请应用如下模块
- name: Ensure Apache package is installed
package:
name: httpd
state: present
此模块与发行版无关,它通过使用底层软件包管理器(例如,基于 Red Hat 发行版的 yum/dnf
和 Debian 的 apt
)来工作。 因此,它仅执行安装和删除软件包等基本任务。 如果您需要更多地控制软件包管理器选项,请使用目标发行版的特定模块。
另请注意,即使模块本身在不同的发行版上工作,但每个发行版的软件包名称可能不同。 例如,在基于 Red Hat 的发行版中,Apache Web 服务器软件包名称是 httpd
,而在 Debian 中,它是 apache2
。 确保您的 playbook 处理了这一点。
此模块是幂等的,如果当前系统状态与所需状态匹配,则不会执行任何操作。
[ 提升您的自动化专业知识。 获取 Ansible 清单: 迁移到 Red Hat Ansible Automation Platform 2 的 5 个理由 ]
5. service
使用 service 模块使用所需的 init 系统(例如 systemd)来管理目标系统服务。
在其最基本的形式中,您只需提供服务名称和所需的状态。 例如,要启动 sshd
服务,请使用如下模块
- name: Ensure SSHD is started
service:
name: sshd
state: started
您还可以通过提供参数 enabled: yes
来确保服务在目标系统启动时自动启动。
与 package
模块一样,service
模块非常灵活,可以在不同的发行版上工作。 如果您需要微调特定的目标 init 系统,请使用相应的模块; 例如,模块 systemd
。
与您到目前为止看到的其他模块类似,service
模块也是幂等的。
6. firewalld
在支持 firewalld
守护进程的系统(例如基于 Red Hat 的发行版)上,使用 firewalld 模块来控制系统防火墙。
例如,要在端口 80 上打开 HTTP 服务,请像这样使用它
- name: Ensure port 80 (http) is open
firewalld:
service: http
state: enabled
permanent: yes
immediate: yes
您还可以使用 port
参数指定自定义端口而不是服务名称。 在这种情况下,请确保也指定协议。 例如,要打开 TCP 端口 3000,请使用以下命令
- name: Ensure port 3000/TCP is open
firewalld:
port: 3000/tcp
state: enabled
permanent: yes
immediate: yes
您还可以使用此模块来控制 firewalld
的其他方面,例如区域或复杂规则。 请务必查看模块文档以获取完整的选项列表。
7. file
file 模块允许您控制文件和目录的状态——设置权限、所有权和 SELinux 标签。
例如,使用 file
模块创建用户 ricardo
拥有的目录 /app
,所有者和组 users
具有读取、写入和执行权限
- name: Ensure directory /app exists
file:
path: /app
state: directory
owner: ricardo
group: users
mode: 0770
您还可以使用此模块通过使用参数 recurse: yes
递归地设置目录上的文件属性,或使用参数 state: absent
删除文件和目录。
此模块对于其大多数参数都具有幂等性,但其中一些参数可能会使其每次都更改目标路径。 请查看文档以获取更多详细信息。
8. lineinfile
lineinfile 模块允许您管理现有文件中的单行。 它对于更新现有文件上的目标配置而无需更改文件的其余部分或复制整个配置文件非常有用。
例如,像这样在您的 hosts 文件中添加一个新条目
- name: Ensure host rh8-vm03 in hosts file
lineinfile:
path: /etc/hosts
line: 192.168.122.236 rh8-vm03
state: present
您还可以使用此模块通过应用参数 regexp
来查找要替换的现有行来更改现有行。 例如,更新 sshd_config
文件以通过将行 PermitRootLogin yes
修改为 PermitRootLogin no
来阻止 root 登录
- name: Ensure root cannot login via ssh
lineinfile:
path: /etc/ssh/sshd_config
regexp: '^PermitRootLogin'
line: PermitRootLogin no
state: present
注意:使用 service 模块重新启动 SSHD 服务以启用此更改。
此模块也是幂等的,但是,在行修改的情况下,请确保正则表达式与原始状态和更新状态都匹配,以避免不必要的更改。
9. unarchive
使用 unarchive 模块来提取存档文件(例如 tar
或 zip
文件)的内容。 默认情况下,它会在提取存档文件之前将其从控制节点复制到目标计算机。 通过提供参数 remote_src: yes
来更改此行为。
例如,使用以下语法提取已下载到目标主机的 .tar.gz
文件的内容
- name: Extract contents of app.tar.gz
unarchive:
src: /tmp/app.tar.gz
dest: /app
remote_src: yes
某些存档技术需要在目标系统上提供额外的软件包; 例如,软件包 unzip
用于提取 .zip
文件。
根据使用的存档格式,此模块可能具有幂等性,也可能不具有幂等性。 为了防止不必要的更改,您可以使用参数 creates
来指定此模块在提取存档内容时将创建的文件或目录。 如果此文件或目录已存在,则模块不会再次提取内容。
10. command
command 模块是一个灵活的模块,允许您在目标系统上执行任意命令。 使用此模块,只要有相应的命令,您几乎可以在目标系统上执行任何操作。
即使 command
模块灵活且功能强大,也应谨慎使用。 如果有其他合适的模块可用于执行任务,请避免使用 command 模块。 例如,您可以使用 command
模块执行 useradd
命令来创建用户,但您应该改用 user
模块,因为它为您抽象化了许多细节,处理了极端情况并确保配置仅在必要时才更改。
对于没有可用模块的情况,或者要运行自定义脚本或程序,command
模块仍然是一个很好的资源。 例如,使用此模块运行已存在于目标计算机中的脚本
- name: Run the app installer
command: "/app/install.sh"
默认情况下,此模块不是幂等的,因为 Ansible 每次都会执行该命令。 要使 command
模块具有幂等性,您可以使用 when
条件仅在适当的条件存在时执行该命令,或者使用 creates
参数,类似于 unarchive 模块示例。
下一步是什么?
使用这些模块,您可以通过复制、模板化或修改配置文件、创建用户、安装软件包、启动系统服务、更新防火墙等来配置整个 Linux 系统。
如果您是 Ansible 新手,请务必查看有关如何创建 playbook 的文档,以组合这些模块来自动化您的系统。 其中一些任务需要以提升的权限运行才能工作。 有关更多详细信息,请查看权限提升文档。
从 Ansible 2.10 开始,模块被组织在集合中。 此列表中的大多数模块都是 ansible.builtin
集合的一部分,并且默认情况下可与 Ansible 一起使用,但其中一些模块是其他集合的一部分。 有关集合列表,请查看 Ansible 文档。
3 条评论