ansible怎么确保tasks在这一台执行完成后,再在另外一台执行,怎么确保顺序执行?当有一台的环境变量不满足时,该怎么执行?怎么确保当前面一个任务执行成功后才能执行下一个任务?下一个任务怎么引用上一个任务的结果
在 Ansible 中确保任务在一台服务器上执行完成后再在另一台服务器上执行,可以使用 serial 参数,可以指定每次只向有序列表中的一台服务器发送指令。需要在 Playbook 中加入 serial 参数并指定一个小于等于有序列表长度的数值。
例如:
- name: Run commands on webservers
hosts: webservers
serial: 1
tasks:
- name: Do a thing
shell: /path/to/command
上面的示例会分批次向 webservers 列表中指定的服务器发送命令。
如果在有序列表中的服务器的环境变量不满足条件,可以使用 when 参数来跳过这些服务器:
- name: Ensure the right package is installed
hosts: all
tasks:
- name: Install package for CentOS
yum:
name: httpd
when: ansible_os_family == "RedHat"
- name: Install package for Debian
apt:
name: apache2
when: ansible_os_family == "Debian"
这将确保安装适当的软件包,因为有序列表中的不同服务器有不同的操作系统家族。
要确保任务按顺序执行,可以使用 depends_on 参数。可以在一个任务中指定它应该等待哪些其他任务完成后再开始执行。
例如:
- name: Run tasks in sequence
hosts:
- webservers
tasks:
- name: Do something first
shell: command1.sh
- name: Do something next
shell: command2.sh
depends_on: "Do something first"
在这个示例中,任务 Do something next 将在任务 Do something first 完成后才开始执行。
要引用另一个任务的结果,可以使用 Ansible 的注册变量。可以在一个任务中运行一个命令并将其结果存储在变量中,然后在后续任务中引用该变量。
例如:
- name: Run commands on servers
hosts: webservers
tasks:
- name: Get current date
shell: date +"%Y-%m-%d"
register: current_date
- name: Print current date
debug:
var: current_date.stdout
在这个示例中,变量 current_date 将存储第一个任务中执行的 date 命令的结果。在第二个任务中,使用 debug 模块并将 current_date.stdout 输出到屏幕上。

浙公网安备 33010602011771号