Ansible中的任务执行控制

  • 实验环境
  • 一.循环
    • 1.循环
    • 2.循环散列或字典列表
    • 3.实验:
  • 二.条件
    • 1.条件判断
      • 判断实验
    • 2.多条条件组合
      • 实验多条条件组合
    • 测试题
  • 三.触发器
    • 1.触发器
      • 实验
    • 练习
  • 四.处理失败任务
    • 1.ignore_errors
    • 2.force_handlers
    • 3.changed_when
    • 4.failed_when
    • 5.block
  • 测试练习

实验环境

新建3个虚拟机
ip设定同网段的比如172.25.254.70 71 72 73
virt-mananger 关闭所有虚拟机,并改虚拟机abc内存为768M
在控制机现在ansible的源教程在ansible第一章有教程
控制机:

useradd devops
su - devops
cd ansible/
cp /etc/ansible/ansible.cfg .
ls
vim ansible.cfg
///
inventory      = ~/ansible/inventory
#roles_path    = /etc/ansible/roles
host_key_checking = False
remote_user = devops
module_name = shell[privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=False
///
vim inventory
///
[westos]
172.25.254.71            ##westosa
172.25.254.72            ##westosb
172.25.254.73            ##westoscdevops用户下
cd ansible
ssh-keygen
for i in 10 20 30
>do
>ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.25.14.$i
>doneopenssl passwd -6               ##生成密钥
ansible all -m user -a 'name=devops state=present password="密钥"' -u rootfor i in 10 20 30; do ssh-copy-id -i ~/.ssh/id_rsa.pub devops@172.25.14.$i; doneansible all -m lineinfile -a 'path=/etc/sudoers line="devops ALL=(ALL) NOPASSWD: ALL"' -u rootansible all -m shell -a 'tail -n 3 /etc/sudoers'ansible all -m ping

一.循环

1.循环

#1.简单循环
loop:           ##赋值列表- value1- value2- ...{{item}}        ##迭代变量名称#实例#
---
- name: create filehosts: 172.25.0.254tasks:- name: file modulefile:name: /mnt/{{item}}state: presentloop:- westos_file1- westos_file2
实验:
vim user.yml
///
---
- name: create userhosts: westostasks:- name: westosuser:name: "{{ item }}"state: presentloop:- westos1- westos2- westos3
///
ansible-playbook user.yml

或者
vim user_list.yml
///
---
USERS:- westos1- westos2- westos3
///
vim user.yml
///
---
- name: create userhosts: westosvars_files:- ./user_list.ymltasks:- name: westosuser:name: "{{ item }}"state: presentloop:"{{ USERS }}"
///

2.循环散列或字典列表

---
- name: create filehosts: 172.25.0.254tasks:- name: file moduleservice:name: "{{ item.name}}"state: "{{ item.state }}"loop:- name: httpdstate: started

3.实验:

建立三个用户westos{1,2,3},密码分别为123,456,789

vim user1.yml
///
---
- name: create userhosts: westostasks:- name: useruser:name: "{{ item.user }}"password: "{{ item.passwd }}"state: presentloop:- user: westos1passwd: "$6$aOHp/7b8u2HR1u2/$0vga5bdE8hOLMuXvXsGZA9QQlU6uz2n8/g3LB3IA64B0XSH9Y8K.PFDB3nxLw4U4X1lY02r65c8ifaQPmqSTB/"- user: westos2passwd: "$6$EUAMLnZzJuaqJhBS$Vf8OLeVOBnT1f11Wll9lDVY9RkdNwtddMB0gEwjuH97CqJudIAGuh9GvxdWm8l0aPYpVvvfHRsH8PVSHm3UZL/"- user: westos3passwd: "$6$Bt8yoy94CY6af1rw$YR0uEZM7tlC21CP7crzE9qw.JsBVsl4lpa1UrI3eoolrcI6qscM.lMoHxkk0FZLmOphARSRz3DSS0lgvShZQP."
///
[注意]  此处的密码为openssl passwd -6生成。
"{{ item.user }}"更正规的写法应该是"{{ item['user'] }}"

二.条件

when:

  • 条件1
  • 条件2

1.条件判断

=                       value == "字符串",value == 数字
<                       value <  数字
>                       value >  数字
<=                      value <= 数字
>=                      value >= 数字
!=                      value != 数字
is defined              value is defined        变量存在
is not defined          value is not defined    变量不存在
in                      value is in value       变量为
not in                  value is not in value   变量不为
bool变量 为true         value                   value的值为true
bool变量 false          not value               value的值为falsevalue in value2         value的值在value2列表中

实验:
ansible 172.25.14.10 -m file -a ‘path=/mnt/file state=touch’

vim test1.yml
///
---
- name: testhosts: alltasks:- name: testshell: test -e /mnt/fileignore_errors: yes       ##忽略错误register: OUTPUT- name: show messagesdebug:msg: /mnt/file is not findwhen: OUTPUT.rc != 0- name: show messagesdebug:msg: /mnt/file is exitwhen: OUTPUT.rc == 0
///


判断实验

给虚拟机westosc加上一个10G的硬盘
ansible 172.25.254.71 -m shell -a 'fdisk -l'
vim test2.yml
///
---
- name: testhosts: alltasks:- name: show messagesdebug:msg: vdb not findwhen: ansible_facts['devices']['vdb'] is not defined- name: show messagesdebug:msg: vdb is existwhen: ansible_facts['devices']['vdb'] is defined
///

2.多条条件组合

when:条件1 and 条件2- 条件1- 条件2when:条件1 or 条件2when: >条件1or条件2

实验多条条件组合

#and
vim test2.yml
///
---
- name: testhosts: alltasks:- name: show messagesdebug:msg: vdb not findwhen:- ansible_facts['devices']['vdb'] is not defined- inventory_hostname in "172.25.14.20"
##- name: show messagesdebug:msg: vdb is existwhen:- ansible_facts['devices']['vdb'] is defined- inventory_hostname in "172.25.14.20"
///#or
///- name: show messagesdebug:msg: vdb not findwhen:- ansible_facts['devices']['vdb'] is not defined or inventory_hostname in "172.25.14.20"
//////- name: show messagesdebug:msg: vdb not findwhen: >ansible_facts['devices']['vdb'] is not definedorinventory_hostname in "172.25.14.20"
///

测试题

测试题:
建立playbook ~/ansibles/lvm.yml要求如下:
*建立大小为1500M名为exam_lvm的lvm 在westos组中
*如果westos不存在请输出:
vg westos is not exist
*如果westos大小不足1500M请输出:
vg westos is less then 1500M
并建立800M大小的lvm

vim lvm.yml
///
---
- name: create lvmhosts: alltasks:- name: create 1500M lvmlvol:lv: exam_lvmvg: westossize: 1500Mwhen: ansible_facts['lvm']['vgs']['westos'] is definedignore_errors: yesregister: OUTPUT- name: debug size messagedebug:msg: vg westos is less than 1500Mwhen:- ansible_facts['lvm']['vgs']['westos'] is defined- OUTPUT.rc != 0- name: create 800M lvmlvol:lv: example_lvmvg: westossize: 800Mwhen:- ansible_facts['lvm']['vgs']['westos'] is defined- OUTPUT.rc != 0- name: debug messagesdebug:msg: vg westos is not existwhen: ansible_facts['lvm']['vgs']['westos'] is not defined

报错是内存不够了

三.触发器

1.触发器

notify: 触发器当遇到更改时触发handlers

handlers: 触发器触发后执行的动作

#实例#
---
- name: create virtualhost for web serverhosts: 172.25.0.254vars_files:./vhost_list.ymltasks:- name: create documentfile:path: "{{web2.document}}"state: directory- name: create vhost.confcopy:dest: /etc/httpd/conf.d/vhost.confcontent:"<VirtualHost *:{{web1.port}}>\n\tServerName {{web1.name}}\n\tDocumentRoot {{web1.document}}\n\tCustomLog logs/{{web1.name}}.log combined\n</VirtualHost>\n\n<VirtualHost *:{{web2.port}}>\n\tServerName {{web2.name}}\n\tDocumentRoot {{web2.document}}\n\tCustomLog logs/{{web2.name}}.log combined\n</VirtualHost>"notify:restart apachehandlers:- name: restart apacheservice:name: httpdstate: restarted

实验

实验:///
---
- name: web serverhosts: alltasks:- name: install apachednf:name: httpdstate: latest- name: start serviceservice:name: httpdstate: startedenabled: yes- name: configure firewalldfirewalld:service: httpstate: enabledpermanent: yesimmediate: yes- name: configure portlineinfile:path: /etc/httpd/conf/httpd.confline: Listen "{{ port }}"regexp: "^Listen {{ port }}"#      backrefs: yesnotify:- firewalld- restart apachehandlers:- name: firewalldfirewalld:port: "{{port}}/tcp"state: enabledpermanent: yesimmediate: yes- name: restart apacheservice:name: httpdstate: restarted///

练习

练习:vsftpd,允许匿名访问

vim vsftpd.yml
///
---
- name: vsftpdhosts: alltasks:- name: install vsftpddnf:name: vsftpdstate: latestnotify:- restart vsftpd- firewalld- name: configure vsftpdlineinfile:path: /etc/vsftpd/vsftpd.confregexp: "^anonymous_enable="line: "anonymous_enable={{state}}"notify:restart vsftpdhandlers:- name: restart vsftpdservice:name: vsftpdstate: restartedenabled: yes- name: firewalldfirewalld:service: ftpstate: enabledpermanent: yesimmediate: yes


四.处理失败任务

1.ignore_errors

#作用:
当play遇到任务失败是会终止
ignore_errors: yes 将会忽略任务失败使下面的任务继续运行

#实例#
---
- name:hosts: alltasks:- name: testdnf:name: westosstate: latestignore_errors: yes- name: create filefile:path: /mnt/westosstate: touch

2.force_handlers

#作用:
#当任务失败后play被终止也会调用触发器进程
#example

---
- name: apache change porthosts: 172.25.0.254force_handlers: yesvars:http_port: 80tasks:- name: configure apache conf filelineinfile:path: /etc/httpd/conf/httpd.confregexp: "^Listen"line: "Listen {{ http_port }}"notify: restart apache- name: install errordnf:name: westosstate: latesthandlers:- name: restart apacheservice:name: httpdstate: restartedenabled: yes

3.changed_when

#作用:
#控制任务在何时报告它已进行更改 (强制成功)

---
- name: apache change porthosts: 172.25.0.254force_handlers: yesvars:http_port: 8080tasks:- name: configure apache conf filelineinfile:path: /etc/httpd/conf/httpd.confregexp: "^Listen"line: "Listen {{ http_port }}"changed_when: truenotify: restart apachehandlers:- name: restart apacheservice:name: httpdstate: restartedenabled: yes

4.failed_when

#当符合条件时强制任务失败

---
- name: testhosts: 172.25.0.254tasks:- name: shellshell: echo helloregister: westosfailed_when: "'hello' in westos.stdout"

5.block

block: ##定义要运行的任务
rescue: ##定义当block句子中出现失败任务后运行的任务
always: ##定义最终独立运行的任务

测试练习

建立playbook ~/westos.yml要求如下:
建立大小为1500M名为/dev/vdb1的设备
如果/dev/vdb不存在请输入:
/dev/vdb is not exist
如果/dev/vdb大小不足2G请输出:
/dev/vdb is less then 2G
并建立800M大小的/dev/vdb1
此设备挂载到/westos上

---
- name: create vdb1hosts: alltasks:- name: check vdbdebug:msg: /dev/vdb is not existwhen: ansible_facts['devices']['vdb'] is not defined- name: create /dev/vdb1block:- name: check size 2Gparted:device: /dev/vdbnumber: 1state: presentpart_end: 2GiBwhen: ansible_facts['devices']['vdb'] is definednotify:- remove 2G- create vdb1rescue:- name: create 800Mparted:device: /dev/vdbstate: presentnumber: 1part_end: 800MiBwhen: ansible_facts['devices']['vdb'] is definedalways:- name: create mount pointfile:path: /westosstate: directoryhandlers:- name: remove 2Gparted:device: /dev/vdbnumber: 1state: absent- name: create vdb1parted:device: /dev/vdbnumber: 1state: presentpart_end: 1500MiB- name: create filesystemfilesystem:fstype: xfsdev: /dev/vdb1- name: mount /dev/vdb1mount:path: /westossrc: /dev/vdb1fstypes: xfsstate: mounted


ansible all -m parted -a ‘device=/dev/vdb number=1 state=absent’ ##删除设备
ansible all -m mount -a ‘path=/westos state=absent’ ##卸载设备

5.Ansible中的任务执行控制相关推荐

  1. Ansible中的任务执行控制介绍

    文章目录 一.循环 二.条件 三.触发器 四.处理失败任务 一.循环 循环迭代任务 1.简单循环 loop: ##赋值列表- value1- value2- ...{{item}} ##迭代变量名称 ...

  2. Anisble中的任务执行控制

    一.循环 #1.简单循环# loop: ##赋值列表- value1- value2- ...{{item}} ##迭代变量名称#实例# --- - name: create filehosts: 1 ...

  3. Ansible中的一些特殊变量与执行控制

    文章目录 一.注册变量 二.事实变量 三.魔术变量 四.触发器 五.处理失败任务 1.ignore_errors 2.force_handlers 3.changed_when 4.failed_wh ...

  4. ansible的任务执行控制(循环、条件判定、触发器、处理失败任务)

    ansible的任务执行控制 一.循环 1.简单循环 2.循环散列或字典列表 二.条件判定 1.when条件语句 2.条件判断 三.触发器 四. 处理失败任务 1.ignore_errors 2.fo ...

  5. Ansible(十九)-- ansible 中的任务控制(四)--block、rescue、always块

    使用"when"关键字对条件进行判断,如果条件成立,则执行对应的任务,但是,我们可以发现,当条件成立时,我们只能执行一个任务,如果我们想要在条件成立时,执行三个任务,该怎么办呢?难 ...

  6. Ansible中的角色使用

    ansible roles #ansible 角色简介# * Ansible roles 是为了层次化,结构化的组织Playbook * roles就是通过分别将变量.文件.任务.模块及处理器放置于单 ...

  7. Ansible中的playbook详解

    首先简单说明一下playbook,playbook是什么呢? 根本上说playbook和shell脚本没有任何的区别,playbook就像shell一样,也是把一堆的命令组合起来,然后加入对应条件判断 ...

  8. 使用Ansible中的playbook

    使用Ansible中的playbook 1 playbook的功能 2 YMAL 2.1 简介 2.2 特点 2.3 语法简介 2.4 YAML列表 2.5 YAML的字典 3 playbook执行命 ...

  9. 设CPU中各部件及其相互连接关系如下图所示。图中W是写控制标志,R是读控制标志,R 1 和R 2 是暂存器

    设CPU中各部件及其相互连接关系如下图所示.图中W是写控制标志,R是读控制标志,R1和R2是暂存器. (1)假设要求在取指周期由ALU完成 (PC) + 1→PC的操作(即ALU可以对它的一个源操作数 ...

最新文章

  1. 人工智能会让工作环境变得更公平,还是更压抑?
  2. Python数据预处理之异常值的处理——【自定义的three_sigma()函数、boxplot()方法】
  3. android模拟机新闻APP,DavidTGNewsProject
  4. 前端、后台和连接前端后台的网络数据传输
  5. Linux常用命令及笔记
  6. sprintf函数_C语言源代码展示:常用转换函数实现原理
  7. 趣学 C 语言(十三)—— 标准输入输出重定向
  8. 大数据技术与应用实训心得_信息学院成功举办大数据技术与应用论坛
  9. command对象提供的3个execute方法是_【面试题】面向对象编程篇-01
  10. 毕向东Mysql教程_传智播客_毕姥爷_2012年毕向东Java基础教程_毕向东老师
  11. 百度网盘客户端(java)版本
  12. vivado2020报错:error when launching …vivao.bat…launcher time out“
  13. Unity中的混合光照
  14. 今日头条是如何做推广和运营的?
  15. 程序员掌握linux命令,程序员必须知道的linux命令
  16. Mac | 替换系统自带的壁纸
  17. 双离合档把上按钮作用_大众车自动档档把上的按钮是干什么用的?
  18. StoreFront配置本地安装Receiver客户端
  19. java计算机毕业设计小型酒店管理系统源码+系统+数据库+lw文档+mybatis+运行部署
  20. 生成伪随机数的函数int rand(void)和void srand(unsigned seed);

热门文章

  1. Firefox常用扩展(extension)推荐
  2. 【花雕动手做】有趣好玩的音乐可视化系列项目(24)--无限LED镜子灯
  3. Android之UI学习篇二:TextVeiw显示表情和跑马灯效果
  4. 网络搜索先锋 v1.0 官方
  5. 利用telnet发送邮件遇到554 DT:SPM错误提示
  6. 沉浸式夜游的发展应充分挖掘文化内涵
  7. 【陈鹏老师精益项目实战】华东区电机企业精益生产项目第六期总结
  8. 多传感器融合定位六-惯性导航原理及误差分析
  9. ERP术语解释及SAP模块介绍
  10. 事件抽取与事理图谱(二)