2

Ansible之等待服务状态变成成功

 1 year ago
source link: https://bajie.dev/posts/20220729-ansible_until/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Ansible之等待服务状态变成成功

2022-07-29 2 分钟阅读

ansible的脚本中我们可能会要启动某项服务并等待,直到服务启动起来,然后再进行下一步

这个非常重要,我们举例来实验一下:

- hosts: localhost
  vars:
    local__service: ssh
  tasks:
    - block:
      - name: "Stop {{ local__service }} service"
        systemd:
          service: "{{ local__service }}"
          state: stopped

      - name: "Populate ansible_facts.services variable"
        ansible.builtin.service_facts:

      - name: "{{ local__service }} state will be stopped as expected"
        assert:
          that:
            ansible_facts.services[local__service].state == 'stopped'

      - name: "Start {{ local__service }} service"
        systemd:
          service: "{{ local__service }}"
          state: started

      - name: "Registered {{ local__service }} state will still be stopped as it was not refreshed"
        assert:
          that:
            ansible_facts.services[local__service].state == 'stopped'

      - name: "Refresh ansible_facts.services variable"
        ansible.builtin.service_facts:

      - name: "{{ local__service }} state will be running as expected"
        assert:
          that:
            ansible_facts.services[local__service].state == 'running'

上面的 playbook 一共有7步:

1、停止 ssh 服务

2、获取 ansible_fact 变量

3、断言 ansible_facts 中的 ssh 服务是 stopped 状态

4、重新启动 ssh 服务

5、断言 ansible_facts 中的 ssh 服务仍然是 stopped 状态

6、重新获取 ansible_fact 变量

7、这时 ansible_facts 中的 ssh 服务状态刷新了,变成了 running

就是服务启动后,必须去不断刷新 ansible_facts,才能获得刷新后的状态,所以我们利用这一点,脚本如下:

- hosts: localhost
  vars:
    local__service: ssh
  tasks:
    - block:
      - name: "Stop {{ local__service }} service"
        systemd:
          service: "{{ local__service }}"
          state: stopped

      - name: "Wait until {{ local__service }} service is stopped"
        ansible.builtin.service_facts:
        register: temp__service_facts
        until: temp__service_facts.ansible_facts.services[local__service].state == 'stopped'
        retries: 20
        delay: 2

      - name: "Start {{ local__service }} service"
        systemd:
          service: "{{ local__service }}"
          state: started

      - name: "Wait until {{ local__service }} service is running"
        ansible.builtin.service_facts:
        register: temp__service_facts
        until: temp__service_facts.ansible_facts.services[local__service].state == 'running'
        retries: 20
        delay: 2

上面wait until的步骤就是,注册一个临时的变量,然后不断去测试,重试20次,每次的延时是2秒。这样就可以解决了。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK