如何阻止Ansible启动然后重新启动服务?

Rya*_*rah 6 ansible

在我的许多Ansible角色中,我有一个重新启动服务的处理程序和一个确保服务已启用并启动的任务.当这是第一次运行时,Ansible将启动我的服务(确保mongodb启动并启用),然后在最后运行重启处理程序.我怎么告诉Ansible只启动一次.

样本游戏:

---
- name: Install MongoDB package
  yum: name="mongodb-org-{{ mongodb_version }}" state=present

- name: Configure mongodb
  template: src=mongod.conf.j2 dest=/etc/{{ mongodb_config_file }} owner=root group=root mode=0644
  notify: mongodb restart

- name: Ensure mongodb is started and enabled
  service: name={{ mongodb_daemon_name }} state=started enabled=yes
Run Code Online (Sandbox Code Playgroud)

Din*_*hen 5

flush_handlers在服务器启动任务的前面插入一个任务以运行重新启动处理程序。喜欢:

- name: flush handlers
  meta: flush_handlers

## your service start task
- name:  Ensure mongodb is started and enabled
  service:
    service: name={{ mongodb_daemon_name }} state=started enabled=yes
Run Code Online (Sandbox Code Playgroud)

如果通知处理程序,处理程序将重新启动服务(我假设您有重新启动服务的处理程序)。

如果未通知处理程序,则确保服务已启动任务将启动该服务(如果该服务尚未启动)。


Rya*_*rah 3

自从我问这个问题以来已经有一段时间了,但是如果有帮助的话,我最终得到的解决方案如下......

诀窍是...

  1. service任务包含在tasks/main.yml带有参数的文件中state: started,并将enabled: yes其拆分为各自的任务
  2. 对于Ensure mongodb is started任务register一个mongodb_service_started变量
  3. 在的子句mongodb_service_started中使用新注册的变量仅在任务更改时运行whenRestart mongodb handlerEnsure mongodb is started

这可以确保您的应用程序不会started随后restarted处于同一状态,并防止您的应用程序在启动时运行某些关键功能时被停止。例如数据库迁移。服务启动后立即重新启动可能会导致状态不一致。

任务/main.yml

---
- name: Install MongoDB package
  yum: 
    name: "mongodb-org-{{ mongodb_version }}" 
    state: present
  notify: Restart mongodb

- name: Configure mongodb
  template: 
    src: mongod.conf.j2 
    dest: "/etc/{{ mongodb_config_file }}"
    owner: root 
    group: root 
    mode: 0644
  notify: Restart mongodb

- name: Ensure mongodb is started
  service: 
    name: "{{ mongodb_daemon_name }}" 
    state: started
  register: mongodb_service_started

- name: Ensure mongodb is enabled
  service: 
    name: "{{ mongodb_daemon_name }}"
    enabled: yes
Run Code Online (Sandbox Code Playgroud)

处理程序/main.yml

---
- name: Restart mongodb
  service: 
    name: "{{ mongodb_daemon_name }}" 
    state: started
  when: mongodb_service_started.changed == False
Run Code Online (Sandbox Code Playgroud)