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

时间:2016-06-15 19:17:00

标签: 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

5 个答案:

答案 0 :(得分:3)

在服务器启动任务的前面插入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

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

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

答案 1 :(得分:0)

可能你看起来像这样:

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

- 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
  when: mongodb_install.changed

答案 2 :(得分:0)

我可以想到三种方式两个

选项#1。从启用服务的任务中删除状态,然后将其移至处理程序。

根据Ansible documentation,“通知处理程序始终以它们定义的顺序运行。”由于startedidempotent,并且restarted总是启动服务,因此如果第一个处理程序启动(重新启动),第二个处理程序(启动)将不会运行。

# roles/mongodb/tasks/main.yml

- 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 }} enabled=yes
  notify: mongodb start
# roles/mongodb/handlers/main.yml

- name: mongodb restart
  service: name={{ mongodb_daemon_name }} state=restarted

- name: mongodb start
  service: name={{ mongodb_daemon_name }} state=started

但是,仅在任务更改时才触发处理程序,因此,如果这两个任务均未更改,则不能确保服务正在运行。例如,如果该服务早已安装,启用和配置,但是有人登录到主机并手动将其关闭,则在运行此剧本时将不会启动该服务。

选项#2。添加一个后任务,该任务将始终运行并确保服务已启动。

在发布任务之前使用处理器are flushed,因此,如果在首次安装期间或由于更改了配置而更改了配置,则将启动或重新启动服务。但是,如果没有任何变化并且由于某种原因该服务未运行,它将在post_task期间显式启动。

# roles/mongodb/tasks/main.yml

- 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 }} enabled=yes
# In your playbook, e.g., site.yml

- hosts: all
  roles:
    - mongodb
  post_tasks:
    - name: Ensure mongodb is running
      service: name={{ mongodb_daemon_name }} state=started

选项#3。与选项#1一样,除了始终触发“启动”处理程序

# roles/mongodb/tasks/main.yml

# ...same as Option #1 above...

- name: Ensure mongodb is started and enabled
  service: name={{ mongodb_daemon_name }} enabled=yes
  notify: mongodb start
  changed_when: yes

只要看到输出中的“变化”不会打扰您,这将按照您想要的方式工作。

答案 3 :(得分:0)

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

诀窍是...

  1. service文件中将tasks/main.yml任务与参数state: startedenabled: yes分成各自的任务
  2. 对于Ensure mongodb is started任务register一个mongodb_service_started变量
  3. mongodb_service_started when的{​​{1}}子句中使用新注册的变量Restart mongodb仅在handler任务完成时运行 NOT < / strong>更改

这可确保您的应用程序不会在同一播放中获得Ensure mongodb is started,然后再获得started,并防止您的应用程序在启动时运行某些关键功能时被停止。例如数据库迁移。在启动后立即重新启动服务可能会导致状态不一致。

任务/main.yml

restarted

handlers / 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

答案 4 :(得分:-1)

如果你有一个处理程序(在你的角色的处理程序目录中),那么你不需要额外的任务来启动/启用mongo。在你的处理程序中,你不应该重新启动(state=restarted)。当第一次收到通知时,它将启动并启用您的服务,并且将来当服务运行时,它将重新启动。

- name: mongodb restart
  service: name={{ mongodb_daemon_name }} state=restarted enabled=yes

无需其他任务。