天天看点

Ansible-playbook 部署redis主从

Ansible-playbook 部署redis主从一键部署

ansible-playbook redis目录树结构

1

2

3

4

5

6

7

8

9

10

11

12

13

14

<code>[root@192 roles]</code><code># tree redis/</code>

<code>redis/</code>

<code>├── defaults</code>

<code>├── files</code>

<code>│   └── redis-3.2.5.</code><code>tar</code><code>.gz</code>

<code>├── handlers</code>

<code>│   └── main.yaml</code>

<code>├── meta</code>

<code>├── tasks</code>

<code>├── templates</code>

<code>│   └── redis.conf.j2</code>

<code>└── vars</code>

<code>    </code><code>└── main.yaml</code>

#首先这个tasks任务写的很乱,源码编译的这个启动脚本只有start和stop 两个参数,这个两个参数不是func函数类的,这块没办法做restart。当然也可以做,自己再重新搞个启动脚本,这块为了省事就用源码的脚本了。handlers是文件发生改变时触发重启。task里面注释的重启task,直接开启也可以的,两种方法都试过,完全ok。使用handlers就不需要注释那几行了。不使用handlers,直接把notify注释掉,start和stop开启就行。

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

<code>[root@192 tasks]</code><code># cat main.yaml </code>

<code>- name: Installredis base packages</code>

<code>  </code><code>yum: name={{ item }} state=installed</code>

<code>  </code><code>with_items:</code>

<code>    </code><code>- gcc</code>

<code>    </code><code>- </code><code>make</code>

<code>- name: copy redis.</code><code>tar</code><code>.gz to remote server</code>

<code>  </code><code>copy: src=redis-{{ redis_version }}.</code><code>tar</code><code>.gz dest=</code><code>/usr/local/</code>

<code>- name: 解压redis</code>

<code>  </code><code>shell: chdir=</code><code>/usr/local/</code> <code>tar</code> <code>zxf redis-{{ redis_version }}.</code><code>tar</code><code>.gz</code>

<code>- name: </code><code>make</code> <code>install</code> <code>redis</code>

<code>  </code><code>shell: </code><code>cd</code> <code>/usr/local/redis-</code><code>{{ redis_version }} &amp;&amp; </code><code>make</code> <code>PREFIX=</code><code>/usr/local/redis</code> <code>install</code>

<code>- name: create redis init script</code>

<code>  </code><code>copy: src=</code><code>/usr/local/redis-</code><code>{{ redis_version }}</code><code>/utils/redis_init_script</code> <code>dest=</code><code>/etc/init</code><code>.d</code><code>/redis</code> <code>mode=655</code>

<code>- name: 修改redis-server启动脚本参数路径</code>

<code>  </code><code>shell: </code><code>sed</code> <code>-i </code><code>'s/^EXEC.*/EXEC=\/usr\/local\/redis\/bin\/redis-server/g'</code> <code>/etc/init</code><code>.d</code><code>/redis</code>

<code>- name: 替换redis启动脚本CLIEXEC参数</code>

<code>  </code><code>shell: </code><code>sed</code> <code>-i </code><code>'s/^CLIEXEC.*/CLIEXEC=\/usr\/local\/redis\/bin\/redis-cli/g'</code> <code>/etc/init</code><code>.d</code><code>/redis</code>

<code>- name: 添加环境变量文件</code>

<code>  </code><code>shell: </code><code>/bin/echo</code> <code>{{ item }} &gt;&gt; </code><code>/etc/profile</code> <code>&amp;&amp; </code><code>source</code> <code>/etc/profile</code>

<code>    </code><code>- </code><code>export</code> <code>PATH=\$PATH:</code><code>/usr/local/redis/bin</code>

<code>- name: 创建redis配置文件路径</code>

<code>  </code><code>file</code><code>: path=</code><code>/etc/redis</code> <code>state=directory mode=755 owner=root group=root</code>

<code>- name: copy redis配置文件到远程主机</code>

<code>  </code><code>template: src=redis.conf.j2 dest=</code><code>/etc/redis/</code><code>{{ port }}.conf</code>

<code>  </code><code>notify:</code>

<code>     </code><code>- stop redis</code>

<code>     </code><code>- start redis</code>

<code>#- name: start redis service</code>

<code>#  shell: service redis start</code>

<code>  </code><code>#when: ansible_default_ipv4.address == "{{ slave_ip }}"</code>

<code>- name: 替换master_ip</code>

<code>  </code><code>shell: </code><code>sed</code> <code>-i </code><code>'/^# slaveof.*/a\slaveof {{ master_ip }} {{ port }}'</code> <code>/etc/redis/</code><code>{{ port }}.conf</code>

<code>  </code><code>when: ansible_default_ipv4.address == </code><code>"{{ slave_ip }}"</code>

<code>#- name: stop redis service</code>

<code>#  shell: service redis stop</code>

<code>#- name: reload redis service</code>

#handlers 文件内容:

<code>[root@192 tasks]</code><code># cat ../handlers/main.yaml </code>

<code>- name: stop redis</code>

<code>  </code><code>shell: service redis stop</code>

<code>- name: start redis</code>

<code>  </code><code>shell: service redis start</code>

#vars目录变量文件:

<code>[root@192 vars]</code><code># cat main.yaml </code>

<code>port: 6379</code>

<code>redis_version: 3.2.5</code>

<code>slave_ip: 192.168.121.129</code>

<code>master_ip: 192.168.121.128</code>

#模板文件就是一个redis.conf文件,这块只改了三个参数。

第一个:后台启动

<code>[root@192 templates]</code><code># grep daemonize redis.conf.j2 </code>

<code># Note that Redis will write a pid file in /var/run/redis.pid when daemonized.</code>

<code>daemonize </code><code>yes</code>

<code># When the server runs non daemonized, no pid file is created if none is</code>

<code># specified in the configuration. When the server is daemonized, the pid file</code>

<code># output for logging but daemonize, logs will be sent to /dev/null</code>

第二个:主从的ip

#这个ip必须要改,不然的话主从会异步的。master_link_status:down 会是这个状态,下午我怕错是发现主从一直异步,telnet发现端口问题。

<code>[root@192 templates]</code><code># grep ansible redis.conf.j2 </code>

<code>bind {{ ansible_default_ipv4.address }}</code>

第三个参数:

#日志必须的,之前我没打日志,主从异步也不知道怎么回事,开了日志才发现端口被拒。

<code>[root@192 templates]</code><code># grep logfile redis.conf.j2 </code>

<code>logfile </code><code>"/usr/local/redis/redis.log"</code>

其他参数可以优化,根据自己的需要做一个模板,我这只是练习玩。

#运行ansible-playbook 建议加个-v参数,可以看到具体的运行操作,可以看看运行是否符合自己的期望。

ansible-playbook 运行过程:

43

44

45

46

47

48

49

50

51

52

53

<code>[root@192 ansible]</code><code># ansible-playbook redis.yml </code>

<code>PLAY [</code><code>test</code><code>] ********************************************************************</code>

<code>TASK [setup] *******************************************************************</code>

<code>ok: [192.168.121.129]</code>

<code>ok: [192.168.121.128]</code>

<code>TASK [redis : redis base packages] *********************************************</code>

<code>ok: [192.168.121.129] =&gt; (item=[u</code><code>'gcc'</code><code>, u</code><code>'make'</code><code>])</code>

<code>ok: [192.168.121.128] =&gt; (item=[u</code><code>'gcc'</code><code>, u</code><code>'make'</code><code>])</code>

<code>TASK [redis : copy redis.</code><code>tar</code><code>.gz to remote pc] **********************************</code>

<code>changed: [192.168.121.128]</code>

<code>changed: [192.168.121.129]</code>

<code>TASK [redis : 解压redis] *********************************************************</code>

<code> </code><code>[WARNING]: Consider using unarchive module rather than running </code><code>tar</code>

<code>TASK [redis : </code><code>make</code>  <code>install</code> <code>redis] *********************************************</code>

<code>TASK [redis : create redis init script] ****************************************</code>

<code>TASK [redis : redis init script cover] *****************************************</code>

<code> </code><code>[WARNING]: Consider using template or lineinfile module rather than running </code><code>sed</code>

<code>TASK [redis : 替换redis启动脚本CLIEXEC参数] ********************************************</code>

<code>TASK [redis : </code><code>/etc/profile</code><code>] ****************************************************</code>

<code>changed: [192.168.121.129] =&gt; (item=</code><code>export</code> <code>PATH=\$PATH:</code><code>/usr/local/redis/bin</code><code>)</code>

<code>changed: [192.168.121.128] =&gt; (item=</code><code>export</code> <code>PATH=\$PATH:</code><code>/usr/local/redis/bin</code><code>)</code>

<code>TASK [redis : create redis config directory] ***********************************</code>

<code>TASK [redis : redis template] **************************************************</code>

<code>TASK [redis : start redis service] *********************************************</code>

<code>skipping: [192.168.121.128]</code>

<code> </code><code>[WARNING]: Consider using service module rather than running service</code>

<code>TASK [redis : 替换master_ip] *****************************************************</code>

<code>TASK [redis : stop redis service] **********************************************</code>

<code>TASK [redis : reload redis service] ********************************************</code>

<code>PLAY RECAP *********************************************************************</code>

<code>192.168.121.128            : ok=14   changed=12   unreachable=0    failed=0   </code>

<code>192.168.121.129            : ok=15   changed=13   unreachable=0    failed=0</code>

#192.168.121.129从库的状态,主库set 一个值,从库也是可以get到的。

<code>127.0.0.1:6379&gt; info Replication</code>

<code># Replication</code>

<code>role:slave</code>

<code>master_host:192.168.121.128</code>

<code>master_port:6379</code>

<code>master_link_status:up</code>

<code>master_last_io_seconds_ago:1</code>

<code>master_sync_in_progress:0</code>

<code>slave_repl_offset:323</code>

<code>slave_priority:100</code>

<code>slave_read_only:1</code>

<code>connected_slaves:0</code>

<code>master_repl_offset:0</code>

<code>repl_backlog_active:0</code>

<code>repl_backlog_size:1048576</code>

<code>repl_backlog_first_byte_offset:0</code>

<code>repl_backlog_histlen:0</code>

<code>127.0.0.1:6379&gt; GET name</code>

<code>"meng"</code>

本文转自青衫解衣 51CTO博客,原文链接:http://blog.51cto.com/215687833/1889548

继续阅读