在我的许多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
答案 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)
我可以想到三种方式两个。
根据Ansible documentation,“通知处理程序始终以它们定义的顺序运行。”由于started
是idempotent,并且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
但是,仅在任务更改时才触发处理程序,因此,如果这两个任务均未更改,则不能确保服务正在运行。例如,如果该服务早已安装,启用和配置,但是有人登录到主机并手动将其关闭,则在运行此剧本时将不会启动该服务。
在发布任务之前使用处理器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
# 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)
自从我问这个问题已经有一段时间了,但是如果有帮助,我最终找到的解决方案是...
诀窍是...
service
文件中将tasks/main.yml
任务与参数state: started
和enabled: yes
分成各自的任务Ensure mongodb is started
任务register
一个mongodb_service_started
变量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
无需其他任务。