实施多个play

 
这个 Playbook 通过两个 play 分别管理 web 和数据库服务器,确保 httpdmariadb 服务正常运行。

如何在 Ansible Playbook 中灵活设置远程用户

当我们使用 Ansible 来自动化管理服务器时,有时候需要以不同的用户身份去执行任务,尤其是在复杂的环境中,这就需要灵活设置 Ansible 使用的远程用户。本文将带你了解如何在 Playbook 中指定不同的远程用户,避免使用默认用户,轻松应对多种场景。

1. 默认用户行为

当你运行 ansible-playbook 命令时,Ansible 会默认尝试使用你当前的本地用户去连接远程主机。如果你用的是一个普通用户,而某些任务需要用 root 权限来执行,这就会遇到问题。那么如何解决呢?这就引出了 remote_userbecome 的概念。

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 查找远程用户的顺序如下:
  1. Playbook 中的 ansible_userremote_user
  1. ansible.cfg 文件中的 remote_user
  1. 当前运行命令的本地用户

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 也会默认认为运行的任务已“更改”受管主机的某些内容。

使用 createsremoves 参数控制任务的执行

为了避免重复执行不必要的命令,command 模块提供了两个重要的选项:createsremoves
  • creates: 该选项指定一个文件路径,如果该文件已存在,Ansible 就不会运行该命令。可以用它来防止重复操作。例如,只有当数据库文件不存在时才初始化数据库:
    • removes: 这个选项的作用相反,它指定一个文件路径,如果该文件存在,Ansible 将运行命令并移除该文件。
    使用这些选项可以提高任务的幂等性,避免不必要的重复操作。

    commandshell 的区别

    ansible.builtin.commandansible.builtin.shell 模块的功能类似,但它们有一些重要区别:
    • command: 只运行基础命令,不解析 shell 特性(例如变量、管道)。
    • shell: 可以执行完整的 shell 命令,并支持更多复杂的 shell 语法。
    如果你需要运行涉及管道或重定向的命令,应该使用 ansible.builtin.shell,但一般建议尽量使用 command 以确保更好的安全性。例如,下面是使用 shell 执行命令的例子:

    总结

    ansible.builtin.command 模块是运行任意命令的一个简单、有效的工具。通过结合使用 createsremoves,可以确保任务的幂等性,避免不必要的操作。而在需要使用 shell 特性时,可以选择 ansible.builtin.shell 模块。总的来说,command 是一个非常有用的模块,可以在没有合适自动化模块的情况下灵活地执行任务。

    选择模块的最佳实践

    1. 优先使用 ansible.builtin.command 模块:更安全,更简单,适用于不依赖 shell 特性的命令。
    1. 仅在必要时使用 ansible.builtin.shell:如果任务需要 shell 特性,如变量、管道或重定向,才选择 shell 模块。
    1. 特殊场景下使用 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基本语法

    1. 注释
      1. 注释在YAML中通过井号(#)引入。井号右侧的内容会被视为注释。为了提高可读性,确保在井号前留一个空格。例如:
    1. 字符串
      1. 在YAML中,字符串通常不需要引号,即使它们包含空格。字符串可以用单引号或双引号括起来:
    1. 多行字符串
      1. 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
        Loading...
        minami
        minami
        みなみの成長 🐝
        Announcement

        🎉 ブログへようこそ 🎉

        名前: みなみ一人会社
        性別:
        国籍: China 🇨🇳
        完全独学で基本情報技術者をはじめ、32個の資格を仕事をしながら取得。
        現在はIT会社で技術担当として働きながら、ブログ執筆や学習支援にも取り組んでいます。
        独学で合格できる学習法や勉強法、試験対策を発信中!

        📚 発信内容

        • 💻 IT・システム開発
        • 🏠 不動産 × 宅建士
        • 🎓 MBA 学習記録