Skip to content

Instantly share code, notes, and snippets.

@shichi-at-nttr
Last active November 9, 2017 01:23
Show Gist options
  • Save shichi-at-nttr/89b2545db6d8a9c0026db20c5c0878ef to your computer and use it in GitHub Desktop.
Save shichi-at-nttr/89b2545db6d8a9c0026db20c5c0878ef to your computer and use it in GitHub Desktop.
redis-trib.rbでRedisクラスタを構築するAnsibleプレイブック

AnsibleによるRedisクラスタの構築

前提と目的

  • 個々のRedisノードは構築済みとする
    • それぞれ別ノードとし、同一ポートでredisが起動している
  • ansibleを使ってRedisクラスタを構築する
  • クラスタ構築には redis-trib.rb を用いる  - Rubyをインストールし、/usr/local/bin/redis-trib.rb にリンクしておく

具体的には

  • ansibleでこのようなコマンドラインを構成し、実行する (IPアドレスは仮)

    redis-trib.rb create --replicas 1 192.168.33.21:6379 192.168.33.22:6379 192.168.33.23:6379 192.168.33.24:6379 192.168.33.25:6379 192.168.33.26:6379

ポイント

  • redis-trib.rb ではホスト名でのノード指定ができないのでコマンドラインはIPアドレスで構成する
  • ノードが複数NICを持っていることを想定し、IPアドレスを取得する
  • jinja2の空白/改行コントロールを用いる
all:
vars:
ansible_python_interpreter: /usr/bin/python3
kvnodes:
hosts:
node1:
node2:
node3:
node4:
node5:
node6:
---
# Redisクラスタ構築用yml
# ホストグループ「kvnodes」には6台(以上)のホストを指定する。
# eth_ipaddr_exp は、VMの複数のNICのうちどのNICを使うかの正規表現
- hosts: kvnodes
vars:
eth_ipaddr_exp: "192.168.33."
tasks:
# 全サーバのIPアドレス(=各サーバのbindアドレス)を得る
# - ip addr の出力結果から、特定nicのIPアドレスを抽出する
- name: get IP addr
shell: >
/sbin/ip addr | grep "{{ eth_ipaddr_exp }}" | cut -d ' ' -f6 | cut -d '/' -f1
register: redis_node_ipaddr
# 最初のサーバで redis-trib.rb を実行
# Master-Slave配置はお任せ(制御不能)なので、構築後に手動で調整する (たとえばReddieを使う)
- hosts: kvnodes
become: yes
gather_facts: false
tasks:
- shell:
>-
echo yes |
/usr/local/bin/redis-trib.rb create --replicas 1
{% for server in groups['kvnodes'] -%}
{{ hostvars[server].redis_node_ipaddr.stdout }}:6379{{ ' ' }}
{%- endfor -%}
run_once: true
# yamlの改行コントロール(>-)とjinja2のWhitespaceControl( {{%- )の混在に注意
# {% for ... -%} で --replicas 1 の後ろに空白をあけ、
# {%- endfor -%} でループアイテム間の改行/空白を全ツメにし、
# {{ ' ' }} で強制的に1文字空白を置いている
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment