Ansible04-任务控制

news/2024/7/5 2:09:09

目录

一、循环

二、条件

三、handlers

四、失败的处理


一、循环

使用 loop 关键字对一组项目迭代任务,循环变量 item 保存每个迭代过程中使用的值。

[student@workstation ansible]$ vim loop.yml ---
- name: Test loophosts: devgather_facts: novars:num:- one- two- three- four- fivetasks:- name: Echo someshell: "echo This is {{ item }}"loop: "{{ num }}"register: echo_results- name: Loop register vardebug:msg: "{{ item.stdout }}"loop: "{{ echo_results.results }}"

二、条件

when 语句用于有条件地运行任务。它取要测试的条件作为值。如果条件满足, 则运行任务。如果条件不满足,则跳过任务。举例,我们在 webservers 组添加了自定义事实,如果定义了那么安装一下自定义的包,否则跳过。

[student@workstation ansible]$ vim when.yml ---
- name: Install hosts: alltasks:- name: Install db_pkg if db_pkg is definedyum:name: "{{ ansible_facts.ansible_local.myfact.packages.db_pkg }}"state: presentwhen: ansible_facts.ansible_local.myfact is defined[student@workstation ansible]$ ansible-playbook when.yml 
......
TASK [Install db_pkg if db_pkg is defined] *************************************************
skipping: [servera.lab.example.com]
skipping: [serverb.lab.example.com]
changed: [serverc.lab.example.com]
changed: [serverd.lab.example.com]
......

三、handlers

Ansible 模块设计为具有幂等性,playbook 及其任务可以运行多次而不会改变受管主机。
handlers 是由其他任务触发的通知的任务。仅当任务在受管主机上被更改,任务才通知handlers。
每个处理程序具有全局唯一的名称,在 playbook 中任务块的末尾触发。
处理程序可视为非活动任务,只有在使用 notify 语句调用时才会被触发。

handlers 在一个 playbook 里面和 tasks 是对齐的。

处理handlers的规范:

  • 处理程序始终按照 play 的 handlers 部分指定的顺序运行。它们不按在任务中由 notify 语句列出的顺序运行,或按任务通知它们的顺序运行。
  • 处理程序通常在相关 play 中的所有其他任务完成后运行。
  • 如果两个处理程序被错误地给予相同的名称,则仅会运行一个。
  • 即使有多个任务通知处理程序,该处理程序依然仅运行一次。如果没有任务通知处理程序,它就不会运行。 

比如,覆盖 /etc/httpd/conf/httpd.conf 配置文件,使 httpd 监听端口改为 8421。这就需要修改 selinux 端口上下文、重启 httpd 服务、配置防火墙入栈规则。顺序一定是先修改 selinux 端口上下文,再重启 httpd 服务,否则因为 selinux 重启 httpd 会失败。

[student@workstation ansible]$ vim handlers.yml ---
- name: Test handlershosts: webserverstasks:- name: Httpd listen 8421copy:src: httpd.conf.newdest: /etc/httpd/conf/httpd.confnotify: - Allow Apache to listen on tcp port 8421- Restart httpd- Firewall permit 8421/tcphandlers:- name: Allow Apache to listen on tcp port 8421seport:ports: 8421proto: tcpsetype: http_port_tstate: present- name: Restart httpdservice:name: httpdstate: restarted- name: Firewall permit 8421/tcpfirewalld:port: 8421/tcpstate: enabledpermanent: yesimmediate: yes
[student@workstation ansible]$ ansible-playbook handlers.yml......
PLAY [Test handlers] ******************************************TASK [Gathering Facts] ****************************************
ok: [serverc.lab.example.com]
ok: [serverd.lab.example.com]TASK [Httpd listen 8421] **************************************
changed: [serverc.lab.example.com]
changed: [serverd.lab.example.com]RUNNING HANDLER [Allow Apache to listen on tcp port 8421] *****
changed: [serverc.lab.example.com]
changed: [serverd.lab.example.com]RUNNING HANDLER [Restart httpd] *******************************
changed: [serverd.lab.example.com]
changed: [serverc.lab.example.com]RUNNING HANDLER [Firewall permit 8421/tcp] ********************
changed: [serverd.lab.example.com]
changed: [serverc.lab.example.com]
......[student@workstation ansible]$ curl http://serverc.lab.example.com:8421
Added by ansible.
[student@workstation ansible]$ curl http://serverd.lab.example.com:8421
Added by ansible.

四、失败的处理

block-rescue-always 就类似 java 里面的 try-catch-finally 处理方式,block 升级一下,如果失败那么 rescue 一下,无论如何都有收尾工作放在 always里面。比如,webservers 组的两个服务器有 300 ~ 1000MiB 不同大小的卷组 vg_data,我们创建大小为 800MiB 的逻辑卷 lv_web,如果空间不够就创建大小 200MiB 的逻辑卷 lv_web,最后用 xfs 格式创建文件系统。

[student@workstation ansible]$ vim control.yml ---
- name: BlockRescueAlwayshosts: webserversvars:tasks:- name: Create lvmblock:- name: Check 0.8gdebug:msg: "vg_data is less than 0.8g, not enough space"when: ansible_facts.lvm.vgs.vg_data is defined and ansible_facts.lvm.vgs.vg_data.free_g | float < 0.8failed_when: ansible_facts.lvm.vgs.vg_data is defined and ansible_facts.lvm.vgs.vg_data.free_g | float < 0.8- name: Create a logical volume of 0.8glvol:vg: vg_datalv: lv_websize: 800mrescue:- name: Create a logical volume of 0.2glvol:vg: vg_datalv: lv_websize: 0.2galways:- name: Create a xfs filesystemfilesystem:fstype: xfsdev: /dev/vg_data/lv_web

执行过程

[student@workstation ansible]$ ansible-playbook control.yml PLAY [BlockRescueAlways] **********************************************************************TASK [Gathering Facts] ************************************************************************
ok: [serverd.lab.example.com]
ok: [serverc.lab.example.com]TASK [Check 0.8g] *****************************************************************************
fatal: [serverc.lab.example.com]: FAILED! => {"msg": "vg_data is less than 0.8g, not enough space"
}
skipping: [serverd.lab.example.com]TASK [Create a logical volume of 0.8g] ********************************************************
changed: [serverd.lab.example.com]TASK [Create a logical volume of 0.2g] ********************************************************
changed: [serverc.lab.example.com]TASK [Create a xfs filesystem] ****************************************************************
changed: [serverd.lab.example.com]
changed: [serverc.lab.example.com]
.......

检查结果,看到创建 lv_web 的大小是不同的。

[student@workstation ansible]$ ansible webservers -a "lvs"
serverd.lab.example.com | CHANGED | rc=0 >>LV     VG      Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convertroot   cl      -wi-ao---- <17.00g                                                    swap   cl      -wi-ao----   2.00g                                                    lv_web vg_data -wi-a----- 800.00m                                                    
serverc.lab.example.com | CHANGED | rc=0 >>LV     VG      Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convertroot   cl      -wi-ao---- <17.00g                                                    swap   cl      -wi-ao----   2.00g                                                    lv_web vg_data -wi-a----- 208.00m 


http://lihuaxi.xjx100.cn/news/235876.html

相关文章

383. Ransom Note/691. Stickers to Spell Word-- String, Map, back tracking-- 未完待续

383 easy 题&#xff0c;就是建立字母的hash 表 看第一个String 是否能被第二个String 所构建 canConstruct("aa", "aab") -> true 统计 第二个参数中每个字母的频率&#xff0c;可以用一个int[256] 建立hashmap, 然后统计 第一个String 中字母出现的…

你猜猜typeof (typeof 1) 会返回什么值(类型)?!

typeof typeof操作符返回一个字符串&#xff0c;表示未经计算的操作数的类型。 语法&#xff1a; var num a; console.log(typeof (num)); 或console.log(typeof num) 复制代码typeof 可以返回的类型为&#xff1a;number、string、boolean、undefined、null、object、functi…

Ansible05-部署文件

目录 一、部署文件的常用模块 二、使用jinja2文件部署自定义文件 一、部署文件的常用模块 部署文件常用模块有 file 创建、删除文件或目录&#xff0c;修改selinux上下文。copy 复制文件到受控节点上&#xff0c;也可以直接在受控结点上创建文件。fetch 从受控结点获取文件…

COMP 0137 Machine Vision

COMP 0137作业代做、Python实验作业代写、代做Python语言程序作业、代写Machine Vision作业COMP 0137 Machine Vision: Homework #1Due 19th November 2018 at 23:55pmWorth 10% of your overall gradeSubmit online, through MoodleFor this homework, we’ll revisit the pra…

BIML 101 - ETL数据清洗 系列 - BIML 快速入门教程 - 序

BIML 101 - BIML 快速入门教程 做大数据的项目&#xff0c;最花时间的就是数据清洗。 没有一个相对可靠的数据&#xff0c;数据分析就是无木之舟&#xff0c;无水之源。 如果你已经进了ETL这个坑&#xff0c;而且预算有限&#xff0c;并且有大量的活要做&#xff1b; 时间紧&am…

Spring事务管理的底层逻辑—源码解析

本文代码为spring 5.1.2spring是如何控制事务的提交和回滚 加上Transactional注解之后&#xff0c;Spring可以启到事务控制的功能了&#xff0c;再正式执行方法前它会做一些操作&#xff0c;我们来看看 首先进入CglibAopProxy.class的intercept方法或者JdkDynamicAopProxy.clas…

堡垒机高危命令正则表达式

堡垒机可以设置高危命令阻断&#xff0c;防止操作人员误操作造成删库跑路。但是什么是高危命令&#xff0c;需要管理员通过配置正则表达式&#xff0c;进行命令匹配。 今天2021年8月6日先匹配最常见的删库跑路命令 rm -rf / &#xff0c;以下几种表达式联合起来就可以阻断这类…

深入理解浏览器的缓存机制

一、前言 缓存可以说是性能优化中简单高效的一种优化方式了。一个优秀的缓存策略可以缩短网页请求资源的距离&#xff0c;减少延迟&#xff0c;并且由于缓存文件可以重复利用&#xff0c;还可以减少带宽&#xff0c;降低网络负荷。 对于一个数据请求来说&#xff0c;可以分为发…