type
status
date
slug
summary
tags
category
icon
password
实施多个play
这个 Playbook 通过两个
play
分别管理 web 和数据库服务器,确保 httpd
和 mariadb
服务正常运行。如何在 Ansible Playbook 中灵活设置远程用户
当我们使用 Ansible 来自动化管理服务器时,有时候需要以不同的用户身份去执行任务,尤其是在复杂的环境中,这就需要灵活设置 Ansible 使用的远程用户。本文将带你了解如何在 Playbook 中指定不同的远程用户,避免使用默认用户,轻松应对多种场景。
1. 默认用户行为
当你运行
ansible-playbook
命令时,Ansible 会默认尝试使用你当前的本地用户去连接远程主机。如果你用的是一个普通用户,而某些任务需要用 root
权限来执行,这就会遇到问题。那么如何解决呢?这就引出了 remote_user
和 become
的概念。2. 指定远程用户的几种方式
方法一:在 Playbook 中直接指定
你可以在 Playbook 的每个
play
中通过 remote_user
指定 Ansible 连接远程主机时使用的用户。这样写很简单:方法二:修改
ansible.cfg
配置文件如果你想为整个项目指定一个默认的远程用户,可以在
ansible.cfg
文件中设置:这样每次运行 Playbook 时都会自动使用这个用户,适合那些需要使用统一用户的场景。
方法三:命令行指定用户
你也可以直接在运行
ansible-playbook
命令时,通过 -u
参数来指定用户:这种方式非常灵活,适合临时需要切换用户的时候。
3. 切换到 root 用户执行任务
有时候,即使你通过非
root
用户连接到服务器,任务执行时还是需要 root
权限,这时候可以使用 Ansible 的 become
特性。只需要在 Playbook 中添加 become: true
,Ansible 就会在执行任务时自动切换到 root
:4. 用户查找顺序
Ansible 查找远程用户的顺序如下:
- Playbook 中的
ansible_user
或remote_user
ansible.cfg
文件中的remote_user
- 当前运行命令的本地用户
5. 示例:实际运行
假设你已经写好了 Playbook,可以通过以下命令执行:
总结
通过本文,你应该掌握了如何在 Ansible Playbook 中灵活地指定不同的远程用户,并理解了如何通过
become
切换到 root
执行任务。这为我们处理不同权限的任务提供了极大的灵活性,无论是修改配置文件,还是在命令行上临时指定,都能让我们更轻松地应对多变的环境。Ansible 模块指南:管理任务的强大工具
Ansible 附带了大量内置模块,这些模块为管理员提供了管理常见任务的便利。以下是一些常用的模块分类及其功能概述,帮助你快速找到适合的模块。
文件管理模块
- ansible.builtin.copy: 将本地文件复制到受管主机,方便文件分发和更新。
- ansible.builtin.file: 设置文件的权限和其他属性(如所有者、权限模式等)。
- ansible.builtin.lineinfile: 确保文件中的某一行内容符合预期,常用于配置文件的修改。
- ansible.posix.synchronize: 使用
rsync
同步文件或目录,适用于高效的数据传输。
软件管理模块
- ansible.builtin.package: 使用操作系统自带的软件包管理器来安装或升级软件包。
- ansible.builtin.dnf: 针对 DNF 软件包管理器(如 Fedora 系统)进行管理。
- ansible.builtin.apt: 适用于基于 APT 的系统(如 Ubuntu)进行软件包管理。
- ansible.builtin.pip: 管理 Python 软件包,支持通过 PyPI 安装。
系统管理模块
- ansible.posix.firewalld: 管理
firewalld
,用于控制防火墙端口和服务的访问权限。
- ansible.builtin.reboot: 重新启动计算机,适用于更新系统后自动重启的场景。
- ansible.builtin.service: 启动、停止或重启系统服务,广泛用于应用程序管理。
- ansible.builtin.user: 添加、删除和管理系统用户帐户,确保用户权限合规。
网络工具模块
- ansible.builtin.get_url: 通过 HTTP/HTTPS 下载文件,便于从远程源获取资源。
- ansible.builtin.uri: 与 Web 服务进行交互,适用于构建 RESTful API 请求等任务。
这些模块几乎涵盖了日常运维工作中的所有场景,从文件管理到网络工具,再到系统和软件包管理。通过使用这些模块,Ansible 帮助管理员高效、自动化地完成大量任务。如果你想要了解更多模块或使用细节,可以查阅 Ansible 文档,获得更全面的支持。
如何使用 Ansible Navigator 查看模块文档
Ansible Navigator 是一个强大的工具,帮助管理员查看和管理模块文档,轻松了解可用模块的功能与用法。
查看模块列表
要查看当前 Ansible 环境中可用的模块列表,可以运行以下命令:
这个命令会显示模块的名称以及其功能的简要说明。例如:
运行该命令后,你将看到一个模块列表,其中包含简短的功能描述。注意,
ansible-navigator doc -l
命令会显示模块的短名称,而不是完全限定的集合名称(FQCN)。查看详细模块文档
如果你想查看某个特定模块的详细文档,可以使用以下命令:
例如,要查看
dnf
模块的详细说明,你可以运行:这个命令会提供该模块的使用说明、参数列表、示例等详细信息。如果你指定了
-m stdout
选项,文档会以格式化文本显示;否则,可以在交互模式下查看 YAML 格式的文档。交互模式
Ansible Navigator 还支持交互模式,你可以通过浏览模块集合的方式快速查看模块文档:
在交互模式下,用户可以更加直观地浏览可用的模块和集合,并获取模块的使用说明。
总结
通过使用
ansible-navigator doc
命令,管理员可以快速查看 Ansible 模块的文档,了解每个模块的功能与用法。无论是通过命令行快速查看,还是在交互模式下浏览,Ansible Navigator 提供了灵活的方式来帮助你掌握模块使用的详细信息。如何在受管主机上运行任意命令——使用 Ansible 的 command
模块
在使用 Ansible 管理远程主机时,可能会遇到某些没有专门模块自动化的任务。在这种情况下,你可以使用
ansible.builtin.command
模块来在受管主机上执行任意命令。基本使用
ansible.builtin.command
模块用于在受管主机上运行简单的命令。下面是一个基本的例子,运行 /opt/bin/makedb.sh
脚本:该任务会在受管主机上运行
makedb.sh
脚本,并报告任务的状态。即使命令没有真正改变任何内容,Ansible 也会默认认为运行的任务已“更改”受管主机的某些内容。使用 creates
和 removes
参数控制任务的执行
为了避免重复执行不必要的命令,
command
模块提供了两个重要的选项:creates
和 removes
。creates
: 该选项指定一个文件路径,如果该文件已存在,Ansible 就不会运行该命令。可以用它来防止重复操作。例如,只有当数据库文件不存在时才初始化数据库:
removes
: 这个选项的作用相反,它指定一个文件路径,如果该文件存在,Ansible 将运行命令并移除该文件。
使用这些选项可以提高任务的幂等性,避免不必要的重复操作。
command
与 shell
的区别
ansible.builtin.command
和 ansible.builtin.shell
模块的功能类似,但它们有一些重要区别:command
: 只运行基础命令,不解析 shell 特性(例如变量、管道)。
shell
: 可以执行完整的 shell 命令,并支持更多复杂的 shell 语法。
如果你需要运行涉及管道或重定向的命令,应该使用
ansible.builtin.shell
,但一般建议尽量使用 command
以确保更好的安全性。例如,下面是使用 shell
执行命令的例子:总结
ansible.builtin.command
模块是运行任意命令的一个简单、有效的工具。通过结合使用 creates
和 removes
,可以确保任务的幂等性,避免不必要的操作。而在需要使用 shell 特性时,可以选择 ansible.builtin.shell
模块。总的来说,command
是一个非常有用的模块,可以在没有合适自动化模块的情况下灵活地执行任务。选择模块的最佳实践
- 优先使用
ansible.builtin.command
模块:更安全,更简单,适用于不依赖 shell 特性的命令。
- 仅在必要时使用
ansible.builtin.shell
:如果任务需要 shell 特性,如变量、管道或重定向,才选择shell
模块。
- 特殊场景下使用
ansible.builtin.raw
:当目标主机不支持 Python 或需要直接运行命令时,使用raw
模块。
提高 Playbook 的可读性
在 YAML 文件中,注释对于提高可读性至关重要。你可以使用
#
来添加注释,帮助团队成员理解 Playbook 的逻辑。示例:
总结
在编写 Ansible Playbook 时,选择正确的模块对于任务的安全性和幂等性至关重要。优先使用
command
模块执行简单命令,在需要 shell 特性时才使用 shell
模块。raw
模块则适用于特殊场景。通过结合这些模块,确保 Playbook 的执行过程高效、安全且可维护。理解YAML语法与Ansible Playbook
YAML(Yet Another Markup Language)是一种易于阅读和编写的数据序列化格式,广泛应用于配置文件和数据交换中。在本篇博客中,我们将探讨YAML的基本语法以及如何在Ansible Playbook中使用它。
YAML基本语法
- 注释
注释在YAML中通过井号(
#
)引入。井号右侧的内容会被视为注释。为了提高可读性,确保在井号前留一个空格。例如:- 字符串
在YAML中,字符串通常不需要引号,即使它们包含空格。字符串可以用单引号或双引号括起来:
- 多行字符串
- 保留换行符的方式:使用竖线(
|
)字符表示,字符串中的换行符将被保留。 - 转换换行符的方式:使用大于号(
>
)字符表示,换行符将被转换为空格,同时行内的引导空白将被去除。这种方法常用于将长字符串分行以提高可读性。
YAML提供两种方式来编写多行字符串:
4.键值对集合
YAML 中的键值对可以通过缩进块的形式编写:
也可以使用内联块格式,但可读性较差,通常不建议使用。内联格式如下:
不过,内联格式在角色中较常用,特别是在 Playbook 中定义角色及传递变量时。
YAML 列表
YAML 列表通常使用普通单破折号(
-
)表示:列表也可以用方括号括起来,但同样存在可读性问题,不推荐使用:
YAML在Ansible Playbook中的应用
Ansible Playbook是用YAML编写的,用于自动化配置和管理任务。通过合理利用YAML语法,我们可以创建清晰易读的Playbook,从而提高维护效率。
以下是一个简单的Ansible Playbook示例:
总结
YAML的易读性和灵活性使其成为配置管理和自动化工具(如Ansible)的理想选择。掌握YAML的基本语法将帮助您更有效地编写和管理Playbook,提高工作效率。
练习:
实施多个Play
lab start playbook-multi
- 作者:みなみ
- 链接:https://tangly1024.com/資格勉強/125d7ae8-88e2-8087-abbc-e67b7c6988be
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章