2015-02-10 56 views
3

我使用ansible将多个站点部署到同一台服务器。每个站点都是一个单独的“主机”,位于安全的hosts库存中,这非常适用。Ansible每个数据库名称运行一次任务

但是,只有两个数据库:生产和测试。 如何确保我的数据库迁移任务只能在每个数据库上运行一次?

我已读入group_by,run_oncedelegate_to的功能,但我不确定如何组合这些功能。

的主机看起来像:

[production] 
site1.example.com  ansible_ssh_host=webserver.example.com 
site2.example.com  ansible_ssh_host=webserver.example.com 

[beta] 
beta-site1.example.com ansible_ssh_host=webserver.example.com 
beta-site2.example.com ansible_ssh_host=webserver.example.com 

[all:children] 
production 
beta 

目前的剧本是这样的:

--- 
- hosts: all 
- tasks: 

    # ... 

    - name: "postgres: Create PostgreSQL database" 
    sudo: yes 
    sudo_user: postgres 
    postgresql_db: db="{{ DATABASES.default.NAME }}" state=present template=template0 encoding='UTF-8' lc_collate='en_US.UTF-8' lc_ctype='en_US.UTF-8' 
    tags: postgres 
    register: createdb 
    delegate_to: "{{ DATABASES.default.HOST|default(inventory_hostname) }}" 

    # ... 

    - name: "django-post: Create Django database tables (migrate)" 
    django_manage: command=migrate app_path={{ src_dir }} settings={{ item.settings }} virtualenv={{ venv_dir }} 
    with_items: django_projects 
    #run_once: true 
    tags: 
    - django-post 
    - django-db 
    - migrate 
+0

一般来说,“一旦每组”不支持的语义,并试图让一切都变成一个单一的玩可能比它的价值更麻烦。只是想澄清一下,你希望第一个任务在每个主机上运行一次,第二个任务只有两次,每个组中有一次? – 2015-02-10 17:54:51

回答

2

所以,下面将说明为什么我说“一旦每组”一般不支持。当然,我很乐意看到一种更清晰的开箱即用的方式,并且让我知道“每组一次”是不是你所追求的。

主持人:

[production] 
site1.example.com  ansible_ssh_host=localhost ansible_connection=local 
site2.example.com  ansible_ssh_host=localhost ansible_connection=local 

[beta] 
beta-site1.example.com ansible_ssh_host=localhost ansible_connection=local 
beta-site2.example.com ansible_ssh_host=localhost ansible_connection=local 

[beta:vars] 
dbhost=beta-site1.example.com 

[production:vars] 
dbhost=site1.example.com 

[all:children] 
production 
beta 

示例剧本哪会做的东西DBHOST每组一次(两个实集团):

--- 
- hosts: all 
    tasks: 
    - name: "do this once per group" 
    sudo: yes 
    delegate_to: localhost 
    debug: 
     msg: "do something on {{hostvars[groups[item.key].0]['dbhost']}} for {{item}}" 
    register: create_db 
    run_once: yes 
    with_dict: groups 
    when: item.key not in ['all', 'ungrouped'] 
2

我发现最好的办法是限制将任务执行到组的第一个主机。因此,你需要添加组名和数据库的group_vars文件,如:

group_vars /生产

--- 
dbtype=production 
django_projects: 
    - name: project_1 
     settings: ... 
    - name: project_n 
     settings: ... 

group_vars /测试

--- 
dbtype=beta 
django_projects: 
    - name: project_1 
     settings: ... 
    - name: project_n 
     settings: ... 

主机

[production] 
site1.example.com  ansible_ssh_host=localhost ansible_connection=local 
site2.example.com  ansible_ssh_host=localhost ansible_connection=local 

[beta] 
beta-site1.example.com ansible_ssh_host=localhost ansible_connection=local 
beta-site2.example.com ansible_ssh_host=localhost ansible_connection=local 


[all:children] 
production 
beta 

,并限制任务执行到第一个匹配的主机组:

- name: "django-post: Create Django database tables (migrate)" 
    django_manage: command=migrate app_path={{ src_dir }} settings={{ item.settings }} virtualenv={{ venv_dir }} 
    with_items: django_projects 
    when: groups[dbtype][0] == inventory_hostname 
    tags: 
    - django-post 
    - django-db 
    - migrate 
相关问题