希望长大对我而言,是可以做更多想做的事,而不是被迫做更多不想做的事...... 首页 playbook handle roles tags 丁D 学无止境 2019-04-04 19:15 3302已阅读 ansible playbook handle 摘要在开发中我们经常需要将多条命令,写成脚本,在ansible中类似脚本的东西就称为剧本。 # playbook 剧本类似liunx的脚本 剧本只能是yml文件 第一个剧本 ```js //创建一个yml文件 touch firstplaybook.yml //第一个剧本 --- - hosts: 39.108.231.144 remote_user: root tasks: - name: ping the host ping: - name: make directory test file: path: /root/fir_ansb_play_book state: directory ``` **“---”表示文档的开始** **“-”表示一个块序列的节点** 上述定义了两个task 一个是ping 一个是创建一个目录 **运行剧本** ```js ansible-playbook firstplaybook.yml ``` ![alt](/upload/20190408135856.png ) 如上图运行结果 绿色表示没有改变,,黄色表示有改变 我们定义的play-book明明是两个task为什么执行了3个task?? 因为**【Gathering Facts】**是ansible默认的,收集远程主机的信息(如ip地址,硬件信息等) **检查yml的语法正不正确** ```js ansible-playbook --syntax-check firstplaybook.yml playbook: firstplaybook.yml ``` 如上述只打印出文件名就是正确的。 **模拟执行** ```js ansible-playbook --check firstplaybook.yml ``` 模拟执行只能大概的预估,因为执行任务的时候,有时依赖之前任务的结果,但是是模拟的,之前的任务不会真正的执行所以没有结果。。 # handle 工作场景: 我们在开发中经常会遇到修改完配置文件之后,重启服务。 假设我们先在有一个nginx监听8080端口,我们要将他改成8088,然后重启服务。 对应的play-book如下 ```js --- - hosts: 39.108.231.144 remote_user: root tasks: - name: update nginx conf lineinfile: path=/usr/local/nginx/conf/nginx.conf regexp="listen(.*) 8080(.*)" line="listen\1 8088\2" backrefs=yes backup=yes - name: restart nginx service: name=nginx state=restarted ``` nginx目前配置文件 ![alt](/upload/20190408145355.png ) ```js //启动 [root@iZwz9278r1bks3b80puk6fZ sbin]# pwd /usr/local/nginx/sbin [root@iZwz9278r1bks3b80puk6fZ sbin]# ./nginx //查看8080端口的状态 netstat -anp |grep 8080 tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 9418/nginx ``` 当我们执行 上述nginx.yml会发现 修改成8088的任务是黄色的,重启是黄色的,这就表示两者都执行了。。 ![alt](/upload/20190408171955.png ) 我们再次执行一下nginx.yml会发现 修改成8088的任务是绿色的,重启是黄色的,这是因为第一次已经改成了8088由于幂等性不在改变。。。但是重启还是黄色的,,说明还是会重启 ![alt](/upload/20190408172104.png ) 实际情况中。。因为是修改了配置文件才重启,,想第二次就不用重启,接下来我们使用handle来处理 ```js --- - hosts: 39.108.231.144 remote_user: root tasks: - name: update nginx conf lineinfile: path=/usr/local/nginx/conf/nginx.conf regexp="listen(.*) 8080(.*)" line="listen\1 8088\2" backrefs=yes backup=yes notify: restart nginx handlers: - name: restart nginx service: name=nginx state=restarted ``` 如下图并没有执行重启操作 因为配置文件此时是8088 ![alt](/upload/20190408172702.png ) 注意: 上述只有一个task,当有多个task时候默认是先执行完所有的task,然后再执行handle ,并不会执行完一个task就立即执行对应的handle handle的执行顺序,与handle被notify无关。。与handle在playbook中定义的顺序相同 如: ```js task1 notify hand_task3 task2 notify hand_task4 handle hand_task4 hand_task3 //执行顺序是 task1 task2 hand_task4 hand_task3 ``` 如果要执行完task就立即执行handle **- meta: flush_handlers** ```js --- - hosts: test70 remote_user: root tasks: - name: task1 file: path=/testdir/testfile state=touch notify: handler1 - name: task2 file: path=/testdir/testfile2 state=touch notify: handler2 - meta: flush_handlers - name: task3 file: path=/testdir/testfile3 state=touch notify: handler3 handlers: - name: handler1 file: path=/testdir/ht1 state=touch - name: handler2 file: path=/testdir/ht2 state=touch - name: handler3 file: path=/testdir/ht3 state=touch ``` # roles **位置:/etc/ansible/roles** **目录规范** **files/** :存放由copy或script模块等调用的文件; **templates/**:template模块查找所需要模板文件的目录; **tasks/**:至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含; **handlers/**:至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含; **vars/**:至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含; **meta/**:至少应该包含一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系;其它的文件需要在此文件中通过include进行包含;注意,角色和角色之间有依赖关系,如安装NT,先装nginx后装tomcat,一般不需定义,执行我们自己定义好安装顺序即可 **default/**:设定默认变量时使用此目录中的main.yml文件; **如果你在 playbook 中同时使用 roles 和 tasks,vars_files 或者 handlers,roles 将优先执行。** ```js [root@iZwz9278r1bks3b80puk6fZ ansible]# tree roles/ roles/ ├── test │ ├── meta │ │ └── main.yml │ └── tasks │ └── main.yml ├── test1.yml ├── test_b │ └── tasks │ └── main.yml └── test.yml //定义了两个角色 test和test_b //test 通过meta依赖test_b 和本身输出“test” //test_b简单输出"test_b" //运行 ansible-playbook test.yml //注意:执行顺序 //先执行role即test_b //接着执行test角色中的main //最后执行test.yml中的task ``` ![alt](/upload/20190409174034.png ) **通过pre_tasks会post_tasks来控制执行顺序** ```js ansible-playbook test1.yml //注意执行顺序 对比上下两图 ``` ![alt](/upload/20190409174422.png ) #tags 很赞哦! (0) 上一篇:ansible初识 下一篇:ansible-语法 目录 点击排行 Elasticsearch6.3.2之x-pack redis哨兵 2019-07-09 22:05 Redis+Twemproxy+HAProxy+Keepalived 2019-07-12 17:20 GC优化策略和相关实践案例 2019-10-10 10:54 JVM垃圾回收器 2019-10-10 10:23 标签云 Java Spring MVC Mybatis Ansible Elasticsearch Redis Hive Docker Kubernetes RocketMQ Jenkins Nginx 友情链接 郑晓博客 佛布朗斯基 凉风有信 MarkHoo's Blog 冰洛博客 南实博客 Rui | 丁D Java研发工程师 生活可以用「没办法」三个字概括。但别人的没办法是「腿长,没办法」、「长得好看,没办法」、「有才华,没办法」。而你的没办法,是真的没办法。 请作者喝咖啡