Ansible:在上一台主机上完成服务启动后,在下一台主机上启动服务

Ansible:在上一台主机上完成服务启动后,在下一台主机上启动服务,ansible,Ansible,我有三台主机,希望以滚动方式启动服务。主机2需要等待主机1上的服务完成启动,主机3需要等待主机2上的服务。 主机1已完成启动服务,当一行包含以下指令时: 开始侦听CQL客户端 写入文件 当前一台主机上的服务将行写入该文件时,我如何指示Ansible(服务模块更好)只启动以下主机?例如,您可能需要将您的剧本分解一下 您的restart.yml内容: - service: name: foobar state: restarted - wait_for: search_reg

我有三台主机,希望以滚动方式启动服务。主机2需要等待主机1上的服务完成启动,主机3需要等待主机2上的服务。
主机1已完成启动服务,当一行包含以下指令时:

开始侦听CQL客户端

写入文件


当前一台主机上的服务将行写入该文件时,我如何指示Ansible(
服务
模块更好)只启动以下主机?

例如,您可能需要将您的剧本分解一下

您的restart.yml内容:

- service:
    name: foobar
    state: restarted
- wait_for:
    search_regex: "Starting listening for CQL clients"
    path: /tmp/foo
- include_tasks: restart.yml
  with_items:
    - host1
    - host2
    - host3
然后是main.yml的内容:

- service:
    name: foobar
    state: restarted
- wait_for:
    search_regex: "Starting listening for CQL clients"
    path: /tmp/foo
- include_tasks: restart.yml
  with_items:
    - host1
    - host2
    - host3

例如,你可能需要把剧本分解一下

您的restart.yml内容:

- service:
    name: foobar
    state: restarted
- wait_for:
    search_regex: "Starting listening for CQL clients"
    path: /tmp/foo
- include_tasks: restart.yml
  with_items:
    - host1
    - host2
    - host3
然后是main.yml的内容:

- service:
    name: foobar
    state: restarted
- wait_for:
    search_regex: "Starting listening for CQL clients"
    path: /tmp/foo
- include_tasks: restart.yml
  with_items:
    - host1
    - host2
    - host3

似乎不可能在任务级别进行序列化。因此,我必须构建另一个特定于启动服务的剧本,并在剧本yaml中使用
serial:1

我的文件现在如下所示:

角色/启动集群/任务/main.yaml

- name: Start Cassandra
  become: yes
  service:
    name: cassandra
    state: started

- name: Wait for node to join cluster
  wait_for:
    search_regex: "Starting listening for CQL clients"
    path: /var/log/cassandra/system.log
- hosts: all
  serial: 1
  gather_facts: False
  roles:
  - start-cluster
启动集群.yaml

- name: Start Cassandra
  become: yes
  service:
    name: cassandra
    state: started

- name: Wait for node to join cluster
  wait_for:
    search_regex: "Starting listening for CQL clients"
    path: /var/log/cassandra/system.log
- hosts: all
  serial: 1
  gather_facts: False
  roles:
  - start-cluster

似乎不可能在任务级别进行序列化。因此,我必须构建另一个特定于启动服务的剧本,并在剧本yaml中使用
serial:1

我的文件现在如下所示:

角色/启动集群/任务/main.yaml

- name: Start Cassandra
  become: yes
  service:
    name: cassandra
    state: started

- name: Wait for node to join cluster
  wait_for:
    search_regex: "Starting listening for CQL clients"
    path: /var/log/cassandra/system.log
- hosts: all
  serial: 1
  gather_facts: False
  roles:
  - start-cluster
启动集群.yaml

- name: Start Cassandra
  become: yes
  service:
    name: cassandra
    state: started

- name: Wait for node to join cluster
  wait_for:
    search_regex: "Starting listening for CQL clients"
    path: /var/log/cassandra/system.log
- hosts: all
  serial: 1
  gather_facts: False
  roles:
  - start-cluster

为此,为了工作,我需要在
列表中使用\u items
对主机进行硬编码?我可以使用
hosts
文件中的列表吗?这根本不起作用。不可能在任务级别进行序列化。所有主机都会同时调用restart.yaml。但是,
wait\u for
有助于找到解决方案,所以这里还是有一个向上的投票:谢谢好东西,我完全忽略了它将并行运行所有主机的任务这一事实。也许这有助于在串行模式下执行任务?为此,我需要在
中使用\u items
列表对主机进行硬编码?我可以使用
hosts
文件中的列表吗?这根本不起作用。不可能在任务级别进行序列化。所有主机都会同时调用restart.yaml。但是,
wait\u for
有助于找到解决方案,所以这里还是有一个向上的投票:谢谢好东西,我完全忽略了它将并行运行所有主机的任务这一事实。也许这有助于在串行模式下执行任务?你看过关于滚动升级的ansible文档吗?他们用英语谈论这件事。还有一些。这里的关键是在游戏级别使用
serial
。你看过关于滚动升级的ansible文档了吗?他们用英语谈论这件事。还有一些。这里的关键是在播放级别使用
serial