Ansible 委托和 run_once
Ansible delegate and run_once
我为本地和开发环境编写了一个特定角色,它将从 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 上使用主数据库主机名,但这意味着我需要创建另一个变量。另一方面,我认为减少变量的数量并使其更具动态性会更好。请指教
如果你只需要将你的任务委派给第一个服务器,并且运行无论当前游戏中有多少个服务器,它一次,使用:
- name: drop database
mysql_db: name={{ targetdbname }} state=absent
when: targetdeploydb == "new"
delegate_to: "{{ groups['dbserver'] | first }}"
run_once: true
我为本地和开发环境编写了一个特定角色,它将从 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 上使用主数据库主机名,但这意味着我需要创建另一个变量。另一方面,我认为减少变量的数量并使其更具动态性会更好。请指教
如果你只需要将你的任务委派给第一个服务器,并且运行无论当前游戏中有多少个服务器,它一次,使用:
- name: drop database
mysql_db: name={{ targetdbname }} state=absent
when: targetdeploydb == "new"
delegate_to: "{{ groups['dbserver'] | first }}"
run_once: true