【问题标题】:Ansible delegate and run_onceAnsible 委托和 run_once
【发布时间】:2016-09-03 04:27:43
【问题描述】:

我为本地和开发环境编写了一个特定角色,它将从 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 上使用主数据库主机名,但这意味着我需要创建另一个变量。另一方面,我认为减少变量的数量并使其更具动态性会更好。请指教

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 完美!它现在真的可以工作并且只在一台服务器上运行。无论如何,你知道我可以在哪里阅读更多关于 ansible 变量高级用法的文档吗?我对何时使用方括号或大括号并不十分熟悉,甚至不知道如何使用上面给出的管道来获得数组中的第一个结果。还是基于python?
    • 您需要的一切都是:VariablesAnsible FiltersJinja2 Filters。花括号和管道来自 Jinja2,方括号来自 Python。
    • 您好,我想做同样的事情,但不是在第一台服务器上执行,而是在组中的所有服务器上执行。你能帮我吗
    猜你喜欢
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-29
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    相关资源
    最近更新 更多