Ansible委托和run_once

时间:2016-09-02 17:18:37

标签: ansible ansible-playbook ansible-2.x

我为本地和开发环境编写了一个特定角色,它将从dbserver组中的第一台服务器上删除并重新创建数据库,该服务器主要用作主数据库。

group_vars/dbserver

[dbserver]
vagrant1 # master db
vagrant2 # slave db

之后,如果我需要删除数据库并再次创建数据库,基本上我只需要在组中的第一台服务器上运行该命令。

- name: drop database
  mysql_db: name={{ targetdbname }} state=absent
  when: targetdeploydb == "new"
  delegate_to: "{{ item }}"
  with_items: "{{ groups.dbserver }}"
  run_once: true

- name: create database
  mysql_db: name={{ targetdbname }} state=present
  when: targetdeploydb == "new"
  delegate_to: "{{ item }}"
  with_items: "{{ groups.dbserver }}"
  when: targetdeploydb == "new"
  run_once: true

这是我运行剧本时的日志

TASK [laravel : drop database] *************************************************
changed: [vagrant1 -> vagrant1] => (item=vagrant1)
changed: [vagrant1 -> vagrant2] => (item=vagrant2)

TASK [laravel : create database] ***********************************************
changed: [vagrant1 -> vagrant1] => (item=vagrant1)
changed: [vagrant1 -> vagrant2] => (item=vagrant2)

我能想到的另一种方法是直接在delegate_to上使用master db hostname,但这意味着我需要创建另一个变量。另一方面,我认为减少变量的数量并使其更具动态性会更好。请指教

1 个答案:

答案 0 :(得分:3)

如果您需要将任务委派给第一台服务器并且无论当前播放中有多少台服务器都运行一次,请使用:

- name: drop database
  mysql_db: name={{ targetdbname }} state=absent
  when: targetdeploydb == "new"
  delegate_to: "{{ groups['dbserver'] | first }}"
  run_once: true