redis使用playbook批量安装
我们想使用playbook来安装redis服务,redis不能使用默认端口,要加入systemd系统服务里,且启动时以端口号来区分并启动
目录结构
把这些文件贴一下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 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 43 44 45 |
$ cat redis/tasks/main.yml - name: apt depend pkg apt: name={{ item }} state=latest with_items: - build-essential - tcl - name: copy redis copy: src=redis-4.0.11.tar.gz dest=/usr/local/src - name: tar redis shell: chdir=/usr/local/src/ tar -zxf redis-4.0.11.tar.gz - name: mkdir /usr/lcoal/redis file: path=/usr/local/redis state=directory - name: install redis shell: chdir=/usr/local/src/redis-4.0.11 make PREFIX=/usr/local/redis install - name: mkdir /usr/local/redis/conf file: path=/usr/local/redis/conf state=directory - name: copy redis-{{ port|default(6397) }}.conf template: src=redis.conf.j2 dest=/usr/local/redis/conf/redis-{{ port|default(6397) }}.conf - name: copy /etc/init.d/redis-{{ port|default(6397) }} template: src=redis.j2 dest=/etc/init.d/redis-{{ port|default(6397) }} mode=755 - name: mkdir /var/lib/redis/{{ port|default(6397) }} file: path=/var/lib/redis/{{ port|default(6397) }} state=directory - name: add PATH shell: ln -s /usr/local/redis/bin/* /usr/local/sbin/ - name: add systemd service template: src=redis.service.j2 dest=/lib/systemd/system/redis@.service - name: reload systemd shell: systemctl daemon-reload - name: auto start redis-{{ port|default(6397) }} shell: systemctl enable redis@{{ port|default(6397) }} - name: start redis-{{ port|default(6397) }} shell: systemctl start redis@{{ port|default(6397) }} |
---|
redis的主配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
$ cat redis/templates/redis.conf.j2 bind 127.0.0.1 {{ inventory_hostname }} protected-mode yes port {{ port|default(6397) }} tcp-backlog 511 timeout 0 tcp-keepalive 300 daemonize yes supervised no pidfile /var/run/redis-{{ port|default(6397) }}.pid loglevel notice logfile /var/log/redis-{{ port|default(6397) }}.log databases 16 always-show-logo yes save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dbfilename dump.rdb dir /var/lib/redis/{{ port|default(6397) }} slave-serve-stale-data yes slave-read-only yes repl-diskless-sync no repl-diskless-sync-delay 5 repl-disable-tcp-nodelay no slave-priority 100 lazyfree-lazy-eviction no lazyfree-lazy-expire no lazyfree-lazy-server-del no slave-lazy-flush no appendonly no appendfilename "appendonly.aof" appendfsync everysec no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb aof-load-truncated yes aof-use-rdb-preamble no lua-time-limit 5000 slowlog-log-slower-than 10000 slowlog-max-len 128 latency-monitor-threshold 0 notify-keyspace-events "" hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-size -2 list-compress-depth 0 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 hll-sparse-max-bytes 3000 activerehashing yes client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 hz 10 aof-rewrite-incremental-fsync yes |
---|
redis的自定义服务模版
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ cat redis/templates/redis.service.j2 [Unit] Description=redis%I After=syslog.target network.target remote-fs.target nss-lookup.target [Service] Type=forking PIDFile=/var/run/redis-%I.pid ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis-%I.conf ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s QUIT $MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target |
---|
添加到/etc/init.d/目录下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
$ cat redis/templates/redis.j2 #!/bin/sh #Configurations injected by install_server below.... EXEC=/usr/local/redis/bin/redis-server CLIEXEC=/usr/local/redis/bin/redis-cli PIDFILE=/var/run/redis-{{ port|default(6397) }}.pid CONF="/usr/local/redis/conf/redis-{{ port|default(6397) }}.conf" REDISPORT="{{ port|default(6397) }}" ############### # SysV Init Information # chkconfig: - 58 74 # description: redis_{{ port|default(6397) }} is the redis daemon. ### BEGIN INIT INFO # Provides: redis_{{ port|default(6397) }} # Required-Start: $network $local_fs $remote_fs # Required-Stop: $network $local_fs $remote_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Should-Start: $syslog $named # Should-Stop: $syslog $named # Short-Description: start and stop redis_{{ port|default(6397) }} # Description: Redis daemon ### END INIT INFO case "$1" in start) if [ -f $PIDFILE ] then echo "$PIDFILE exists, process is already running or crashed" else echo "Starting Redis server..." $EXEC $CONF fi ;; stop) if [ ! -f $PIDFILE ] then echo "$PIDFILE does not exist, process is not running" else PID=$(cat $PIDFILE) echo "Stopping ..." $CLIEXEC -p $REDISPORT shutdown while [ -x /proc/${PID} ] do echo "Waiting for Redis to shutdown ..." sleep 1 done echo "Redis stopped" fi ;; status) PID=$(cat $PIDFILE) if [ ! -x /proc/${PID} ] then echo 'Redis is not running' else echo "Redis is running ($PID)" fi ;; restart) $0 stop $0 start ;; *) echo "Please use start, stop, restart or status as first argument" ;; esac $ cat redis/redis.yml --- - hosts: redis remote_user: tcmedia roles: - redis |
---|
这里需要注意的是如何根据不同的端口来启动对应的redis,我们这里使用了systemd服务的模版写法,具体写法可参考:https://blog.mallux.me/2017/02/13/systemd/
后面会对systemd做下研究
执行playbook
1 2 |
ansible-playbook -C redis.yml -e port=9998 ansible-playbook redis.yml -e port=9998 |
---|
安装完之后,我们看下被控端redis的启动方式
看下我们的redis自定义服务模版
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- JDK15已发布,网友:我还在JDK8踏步走...
- 树莓派基础实验15:电位器传感器实验
- java JDBC数据库连接池技术(Druid ,c3p0)
- Fail to start qos server: dubbo version: current host: java.net.BindException:
- JAVA JDBC Template的使用
- 《sql必知必会》——读书笔记(2)
- 2.通过QOpenGLWidget绘制三角形
- 树莓派基础实验16:霍尔传感器实验
- 1.opengl绘制三角形
- dubbo本地直连调试注意点
- Tomcat的使用及服务器的一些基础知识
- fastJson 之JSONObject.toJavaObject()方法不能解析嵌套自定义list对象
- 文件包含漏洞学习总结(结尾有实例)
- 树莓派基础实验17:温度传感器实验
- Java Servlet详解(体系结构+注解配置+生命周期)