恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
实施多个Play
首页
资讯中心
/
实施多个Play
实施多个Play
发布时间:2026/10/12 5:34:04
编写多个 PlayPlaybook 是一个 YAML 文件含有由一个或多个 play 组成的列表。记住一个 play 按顺序列出了要对清单中的选定主机执行的任务。因此如果一个 playbook 中含有多个 play每个 play 可以将其任务应用到单独的一组主机。在编排可能涉及对不同主机执行不同任务的复杂部署时这会大有帮助。您可以这样编写 playbook对一组主机运行一个 play完成后再对另一组主机运行另一个 play。编写包含多个 play 的 playbook 非常简单。Playbook 中的各个 play 编写为 playbook 中的顶级列表项。各个 play 是含有常用 play 关键字的列表项。以下示例显示了含有两个 play 的简单 playbook。第一个 play 针对 web.example.com 运行第二个 play 则针对 database.example.com 运行。--- # This is a simple playbook with two plays - name: First play hosts: web.example.com tasks: - name: First task ansible.builtin.dnf: name: httpd state: present - name: Second task ansible.builtin.service: name: httpd enabled: true - name: Second play hosts: database.example.com tasks: - name: First task ansible.builtin.service: name: mariadb enabled: true用户属性Playbook 中的任务通常通过与受管主机的网络连接来执行。Ansible 必须以特定用户身份连接到各受管主机才能运行这些任务。默认情况下如果您使用ansible‑navigator run运行 playbookAnsible 会以自动化执行环境 root 中当前用户的身份连接受管主机。您可以在项目的ansible.cfg文件中设置remote_user指令将 Ansible 配置为首次登录时在受管主机上使用其他用户帐户。如果您仍要以 root 身份运行任务则可在首次远程连接后使用特权升级切换到该用户。但是您也可以根据每个 play 指定 Ansible 使用的远程用户。如果用于任务执行的 Ansible 配置中定义的远程用户不合适可以通过在 play 中的remote_user关键字来覆盖。remote_user: remoteuser特权升级属性您还可在 play 中配置特权升级。使用 become 布尔关键字可以为单个 play 或任务启用或禁用特权升级。此操作会覆盖 ansible.cfg 配置文件中的设置。可使用 yes 或 true 来启用特权升级也可使用 no 或 false 来禁用特权升级。become: true如果启用特权升级可以在 play 中使用 become_method 关键字来指定要对相应 play 使用的特权升级方法。以下示例指定以 sudo 为特权升级方法。become_method: sudo此外启用特权升级后您可在 play 中使用 become_user 关键字来定义在特定 play 中进行特权升级时要使用的用户帐户。become_user: privileged_user以下示例演示了 play 中的这些关键字- name: /etc/hosts is up-to-date hosts: datacenter-west remote_user: automation become: true tasks: - name: server.example.com in /etc/hosts ansible.builtin.lineinfile: path: /etc/hosts line: 192.0.2.42 server.example.com server state: present在受管主机上运行任意命令如果不存在自动化某些任务的模块可以使用特殊模块来在受管主机上运行任意命令。ansible.builtin.command 模块是这些命令的最简单版本。其 cmd 参数会指定您要运行的命令。以下示例任务在受管主机上运行 /opt/bin/makedb.sh。- name: Run the /opt/bin/makedb.sh command ansible.builtin.command: cmd: /opt/bin/makedb.sh与大部分模块不同ansible.builtin.command 不幂等。每次在 play 中指定该任务时该任务都会运行并报告其已更改受管主机上的某些内容即使没有需要更改的内容。您可以尝试将任务配置为仅在文件存在时运行以提高任务的安全性。creates 选项可以让任务仅在文件缺失时运行可以假设如果任务运行则会创建该文件。removes 选项可以让任务仅在文件存在时运行可以假设如果任务运行则会删除该文件。例如以下任务只会在 /opt/db/database.db 不存在时运行- name: Initialize the database ansible.builtin.command: cmd: /opt/bin/makedb.sh creates: /opt/db/database.dbansible.builtin.command 模块无法访问 shell 环境变量也无法执行输入 / 输出重定向和管道之类的 shell 操作。当您需要执行 shell 处理时可以使用 ansible.builtin.shell 模块。与 ansible.builtin.command 模块类似您可以将要执行的命令作为参数传递给该模块。ansible.builtin.command 和 ansible.builtin.shell 模块都要求受管主机上安装正常工作的 Python。第三个模块是 ansible.builtin.raw该模块可以绕过模块子系统直接使用远程 shell 运行命令。在管理无法安装 Python 的系统如网络路由器时可以用到该模块。除此之外该模块还可用于在受管主机上安装 Python。