ansible playbook的动态组分配

时间:2015-07-23 16:34:38

标签: python redis ansible ansible-playbook

我正在开发一个可以配置redis群集的ansible playbook。我有3个小组,我的剧本看起来,但我无法弄清楚如何正确地分配节点。

问题出现是因为我有一个动态数量的节点。如果请求2个节点,我希望有这样的组:

[redis_master]
node1
[redis_slave]
node2

在3的情况下:

[redis_master]
node1
[redis_slave]
node2
[redis_sentinel]
node3

如果是4等:

[redis_master]
node1
node4
[redis_slave]
node2
[redis_sentinel]
node3

我在这里缺少一个范例吗?

2 个答案:

答案 0 :(得分:0)

我不确定我是否完全理解这种情况。通常,您预先定义所有涉及的主机并将它们分组排列。一个剧本可能处理的所有主持人都需要在清单中定义。哪个主机由剧本处理然后或多或少是固定的。你究竟是什么意思:

  

如果X节点请求 ...

我知道您可以使用--limit将playbook限制为最初定义的主机的子集。您还可以使用--extra-vars中定义的参数来选择特定组或一组主机。但是它们仍然需要在清单中预先定义,对我来说,依赖于组以及角色(redis master,slave等)对所涉及的主机数量的依赖似乎很奇怪(并且容易出错)。

话虽如此......我认为库存脚本可能就是您正在寻找的东西。使用这些脚本,您可以生成库存动态。我认为你不能通过参数,但你可以导出变量并稍后从脚本中读取它们。

答案 1 :(得分:0)

嗯,使用 Redis Sentinel,库存本质上是动态的。您可以在 [redis_master] 组中定义某个主机,但集群主机可以自动重新分配主角色。 Redis Sentinel 重写了 Sentinel 配置文件。

所以你可能会惊讶地登录到你认为是 master 的机器并发现这个!!

redis-cli info replication
...
role:slave
master_host:10.1.1.20
...

因此,要为集群设置幂等角色,您需要通过探测 [redis_sentinel] 组中的主机(假设您对每个主机运行哨兵)来发现谁是主节点。然后用这样的东西组成组:

 - name: get master_host
   run_once: true
   shell: "redis-cli info replication|grep -A1 role|tail -1|cut -d: -f2"
   register: master_host

 - name: add master_host
   add_host:
     name: "{{ master_host.stdout }}"
     groups: redis_master

如果您在 Centos/RHEL 上工作,请考虑在此处提出拉取请求: https://github.com/dockpack/base_redis