Ansible 流程控制

条件语句(判断)

当满足什么条件时,就执行那些tasks
when 当...时

ansible获取主机名

# 主机名中,不包含'.'没有区别
ansible_hostname  # 包含'.'只显示第一个'.'前面的名字
ansible_fqdn      # 包含'.'显示完整的主机名

不管是shell还是各大编程语言中,流程控制,条件判断这些都是必不可少的,在我们使用Ansible的过程中,条件判断的使用率极高。例如:

# 1.我们是有不同的系统的时候,可以通过判断系统来对软件包进行安装。centos安装apache:yum install iy httpd
unbuntu安装apache:apt-get install apache2- hosts: all tasks:- name: Debian command: /sbin/shutdown -t nowwhen: ansible_facts['os_family'] == "Debian"- name: ubuntucommand: apt-get install apache2when: ansible_os_family == "ubuntu" - hosts: backupstasks:- name: 创建目录file:path: /tmp/{{ ansible_facts['default_ipv4']['address'] }}state: directory
- hosts: backupstasks:- name: 创建目录file:# setup模块,看到什么名字就写什么名字# path: /opt/{{ ansible_default_ipv4.address }}# 官方写法path: /tmp/{{ ansible_facts['default_ipv4']['address'] }}state: directory- name: 下载yum:name: - rsync- nfs-utilsstate: present# 2.在nfs和rsync安装过程中,客户端服务器不需要推送配置文件,之前都是写多play,会影响效率- hosts: backupstasks:- name: 创建目录file:path: /tmp/{{ ansible_facts['default_ipv4']['address'] }}state: directory- name: 下载yum:name: - rsync- nfs-utilsstate: present- name: 推送rsync配置文件copy:src: /root/rsyncd.confdest: /etc/when: ansible_hostname == 'backup'# 多条件判断- name: 下载rsync和nfsyum:name: - rsync- nfs-utilsstate: presentwhen: ansible_hostname == 'backup' or ansible_hostname == 'nfs'- name: 推送rsync配置文件copy:src: /root/rsyncd.confdest: /etc/when: ansible_hostname == 'backup'# 3.我们在源码安装nginx得时候,执行第二遍就无法执行,此时我们就可以进行判断是否安装过。- hosts: webstasks:- name: 查看nginx目录shell: 'ls -l /etc/nginx'register: xxx- name: 判断nginx是否安装如果没有则安装yum:name: nginxwhen: xxx.rc !=0 # - name: 获取注册的变量 nginx目录返回记过
# debug:
#   msg: "{{ xxx }}"# 判断中的且或非
and
or
!# 不使用and的多条件
- name: "shut down Centos 6 systems"command: /sib/sutdown -t nowwhen:- ansible_facts['distribution'] == "centos" - ansible_facts['distribution_major_version']|int == 6  # 模糊匹配- hosts: alltasks:- name: 推送nginx虚拟主机配置文件copy:src: /etc/nginx/conf.d/wordpress.confdest: /etc/nginx/conf.d/when: ansible_hostname is match 'web*'- name: 推送php配置文件copy:src: /etc/php-fpm.d/www.confdest: /etc/php-fpm.dwhen: ansible_hostname is match 'web'

playbook循环语句

在之前的学习过程中,我们经常会用床上文件创建目录之类的操作,创建两个目录要写量个file模块,如果要创建100个目录就要写100个file模块 ,只要用循环即可,减少重复性的代码

列表循环

  - name: 启动nginx和phpservice:name: "{{ item }}"state: startedwith_items: - nginx- php-fpmwhen: ansible_hostname == 'web02'

字典循环

- name: 推送nginxz主配置文件、nginx虚拟主机配置文件和php配置文件配置文件copy:src: "{{ item.src }}"dest: "{{ item.dest }}"with_items:- {src: "/etc/nginx/nginx.conf",dest: /etc/nginx/}- {src:  "/etc/php-fpm.d/www.conf",dest: /etc/php-fpm.d}- {src: "/etc/nginx/conf.d/wordpress.conf",dest: /etc/nginx/conf.d/}when: ansible_hostname is match 'web*'

playbook handlers (触发器)

当修改完某个服务配置文件时,应该重启该服务

# handler 注意点
1.无论多少个task调用相同handler,只会在所有tasks执行完成后,触发一次handlers2.Handler只有在其所在任务被执行是,才会被运行;如果一个任务中定义了notify调用Handlers,但是由于条件判断等原因,该任务未被执行,那么Handlers同样不会被执行3.Handlers只会在每一个play的末尾行运行一次;如果想在playbook中间运行Handlers,则需要使用meta模块来实现。4.如果一个play在运行到调用Handlers的语句之前失败了,那么这个Handlers将不会被执行。我们可以使用meta模块的--force-handlers选项来强制执行Handlers,即使Handlers所在的play中途运行失败也能执行5.不能使用handlers来代替tasks- hosts: alltasks:- name: 推送nginxz主配置文件copy:src: "{{ item.src }}"dest: "{{ item.dest }}"with_items:- {src: "/etc/nginx/nginx.conf",dest: "/etc/nginx/"}notify: qqqwhen: ansible_hostname is match "web*"handlers:- name: qqqservice:name: nginxstate: restartedenabled: truewhen: ansible_hostname is match "web*"

ansible任务标签

默认情况下,Ansible在执行一个playbook时,会执行play中定义中的所有任务,Ansible的标签(tag)功能可以给单独任务甚至整个playbook打上标签,然后利用这些标签来指定要运行playbook中的个别任务,或不执行指定的任务。

打标签的方式

# 对一个task打一个tag
- hosts: alltasks:- name: 推送nginxz主配置文件copy:src: "{{ item.src }}"dest: "{{ item.dest }}"with_items:- {src: "/etc/nginx/nginx.conf",dest: "/etc/nginx/"}notify: qqqwhen: ansible_hostname is match "web*"tags: nginx_conf- name: 创建站点目录file:path: /movie/state: directoryowner: "{{ user }}"group: "{{ user }}"when: ansible_hostname is match "web*tags: mkdir_nginx_dir# 对一个task打多个tag- name: 推送nginxz主配置文件copy:src: "{{ item.src }}"dest: "{{ item.dest }}"with_items:- {src: "/etc/nginx/nginx.conf",dest: "/etc/nginx/"}notify: qqqwhen: ansible_hostname is match "web*"tags: - nginx_conf- send_nginx_conf# 对多个task打一个tag- name: 推送nginxz主配置文件copy:src: "{{ item.src }}"dest: "{{ item.dest }}"with_items:- {src: "/etc/nginx/nginx.conf",dest: "/etc/nginx/"}notify: qqqwhen: ansible_hostname is match "web*"tags: nginx_conf- name: 创建站点目录file:path: /movie/state: directoryowner: "{{ user }}"group: "{{ user }}"when: ansible_hostname is match "web*"tags: nginx_conf

打完标签如何使用

# -t:执行指定的tag标签任务
# --skip-tags: 执行--skip-tags之外的标签任务[root@m01 ansible]# ansible-playbook 1.yml -t "nginx_conf"
[root@m01 ansible]# ansible-playbook 1.yml -t "nginx_conf"

playbook的复用

在之前写playbook的过程中,我们发现,写多个playbook没有办法,一键执行,这样我们还要单个playbook挨个去执行,很鸡肋。所以在playbook中有一个功能,叫做include用来动态调用task任务列表。

只调用task:include_tasks
调用整个task文件:include (新版本:import_playbook)

优化作业

# 创建www用户
- hosts: alltasks:- name: group "{{ user }}"group:name: "{{ user }}"gid: "{{ id }}"- name: useradd "{{ user }}"user:name: "{{ user }}"uid: "{{ id }}"group: "{{ id }}"shell: /sbin/nologincreate_home: false
# 下载nfs和rsync- name: 下载nfs和rsyncyum:name: nfs-utils,rsyncwhen: ansible_hostname == 'nfs' or ansible_hostname == 'backup'
# 配置nfs服务- name: 配置nfscopy:dest: /etc/exportscontent: "/data 172.16.1.0/24(rw,sync,anonuid=666,anongid=666,all_squash)"when: ansible_hostname == 'nfs'- name: 创建共享目录file:path: /dataowner: "{{ user }}"group: "{{ user }}"state: directorywhen: ansible_hostname == 'nfs' - name: 启动服务并加入开机自启service:name: nfsstate: startedenabled: truewhen: ansible_hostname == 'nfs' # 客户端下载nfs- name: 客户端下载nfsyum:name: nfs-utilswhen: ansible_hostname is match "web*"
# 部署rsync配置- name: 部署rsynccopy:src: /root/rsyncd.confdest: /etc/when: ansible_hostname == 'backup' - name: 创建服务端的密码文件copy:dest: /etc/rsync.passmode: 0600content: "rsync_backup:123"when: ansible_hostname == 'backup' - name: 创建备份目录file:path: /backupowner: "{{ user }}"group: "{{ user }}"state: directorywhen: ansible_hostname == 'backup' - name: 启动rsync并加入到开机自启service:name: rsyncdstate: startedenabled: yeswhen: ansible_hostname == 'backup' 
# 部署wordpress- name: 将nginx和php压缩包解压至客户端unarchive:src: /root/phpnginx/nginx_php.tgzdest: /opt/when: ansible_hostname is match "web*"- name: 判断是否安装nginxshell: "ls -l /etc/nginx"register: xxxwhen: ansible_hostname is match "web*"ignore_errors: yes- name: 安装nginx和phpshell: "cd /opt/ && rpm -Uvh *.rpm"when: (ansible_hostname is match "web*") and xxx.rc != 0- name: 推送nginxz主配置文件、nginx虚拟主机配置文件和php配置文件配置文件copy:src: "{{ item.src }}"dest: "{{ item.dest }}"with_items:- {src: "/etc/nginx/nginx.conf",dest: "/etc/nginx/"}- {src:  "/etc/php-fpm.d/www.conf",dest: "/etc/php-fpm.d/"}- {src: "/etc/nginx/conf.d/wordpress.conf",dest: "/etc/nginx/conf.d"}when: ansible_hostname is match "web*"- name: 创建站点目录file:path: /movie/state: directoryowner: "{{ user }}"group: "{{ user }}"when: ansible_hostname is match "web*"- name: 将压缩包解压到站点目录unarchive:src: /root/wordpress/wordpress.tgzdest: /movie/group: "{{ user }}"owner: "{{ user }}"when: ansible_hostname is match "web*"- name: 启动nginxservice:name: "{{ item }}"state: startedenabled: truewith_items: - nginx- php-fpmwhen: ansible_hostname is match "web*"
# 部署数据库- name: 下载mysqlyum:name: mariadb-serverwhen: ansible_hostname == 'db01'- name: 启动mysql并加入开机自启service:name: mariadbstate: startedenabled: Truewhen: ansible_hostname == 'db01'- name: 修改配置文件copy: src: /etc/my.cnfdest: /etc/when: ansible_hostname == 'db01'- name: 安装数据库需要的模块yum:name: MySQL-pythonwhen: ansible_hostname == 'db01'- name: 创建wordpress用户mysql_user:name: wppassword: "123"host: "172.16.1.%"priv: "*.*:ALL"state: presentwhen: ansible_hostname == 'db01'- name: 创建wordpress库mysql_db: name: wordpressstate: presentwhen: ansible_hostname == 'db01'- name: 将数据cp到db01copy:src: /root/wordpress/wordpress.sqldest: /opt when: ansible_hostname == 'db01'- name: 将数据导入数据库mysql_db: name: wordpresstarget: /opt/wordpress.sqlstate: importwhen: ansible_hostname == 'db01'
- hosts: webstasks:- name: nfs挂载目录mount:path: /movie/wordpress/wp-content/uploadssrc: 172.16.1.31:/datafstype: nfsstate: mountedwhen: ansible_hostname is match "web*"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/79043.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/79043.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git命令积累(个人学习)

如何将docx文件不上传? 创建或编辑 .gitignore 文件 打开 .gitignore 文件,添加以下内容来忽略所有 .docx 文件: *.docx清除已追踪的 .docx 文件 git rm --cached "*.docx"这将从 Git 仓库中删除 .docx 文件,但不会删…

springboot应用大批量导出excel产生oom处理措施实践(适用于poieasyexcel)

一、背景: 在某些信息管理场景中,存在大批量导出需求,例如一次性导出10~100w行excel数据,如果不做特殊的处理,很容易导致Out Of Memory,特别是堆内存溢出。 oom复现 例如修改IDEA运行配置,VM…

谷歌在即将举行的I/O大会之前,意外泄露了其全新设计语言“Material 3 Expressive”的细节

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

深入理解负载均衡:传输层与应用层的原理与实战

目录 前言1. 传输层(Layer 4)负载均衡1.1 工作层级与核心机制1.2 实现方式详解1.3 优缺点分析1.4 典型实现工具 2. 应用层(Layer 7)负载均衡2.1 工作层级与核心机制2.2 实现方式解析2.3 优缺点分析2.4 常用实现工具 3. Layer 4 与…

PyTorch 版本、torchvision 版本和 Python 版本的对应关系

PyTorch 版本、torchvision 版本和 Python 版本的对应关系 在深度学习领域,PyTorch 及其配套库 torchvision 的使用极为广泛。但不同版本的 PyTorch、torchvision 与 Python 之间存在严格的对应关系,若版本搭配不当,会导致代码运行出错…

【hadoop】Hbase java api 案例

代码实现: HBaseConnection.java package com.peizheng.bigdata;import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.client.Connection; import org.apache.hadoop.hbase.client…

荣耀A8互动娱乐组件部署实录(第3部分:控制端结构与房间通信协议)

作者:曾在 WebSocket 超时里泡了七天七夜的苦命人 一、控制端总体架构概述 荣耀A8控制端主要承担的是“运营支点”功能,也就是开发与运营之间的桥梁。它既不直接参与玩家行为,又控制着玩家的行为逻辑和游戏规则触发机制。控制端的主要职责包…

Vue3路由模式为history,使用nginx部署上线后刷新404的问题

一、问题 在使用nginx部署vue3的项目后,发现正常时可以访问的,但是一旦刷新,就是出现404的情况 二、解决方法 1.vite.config.js配置 在vite.config.js中加入以下配置 export default defineConfig(({ mode }) > {const isProduction …

企业级UI测试的“双保险”:TestComplete的智能对象识别与详细报告功能

企业级UI测试真是让人头疼!界面元素变来变去,测试脚本动不动就报错,测试工作根本没法顺利推进。而且,测试结果的管理和共享也麻烦得很,团队协作效率大打折扣。别急!TestComplete的智能对象识别和详细测试报…

SpringBoot的自动配置和起步依赖原理

关于Spring Boot的自动配置和起步依赖,我想结合最新的实现机制来展开说明。先说自动配置——这是Spring Boot最核心的"约定优于配置"思想的落地体现。举个例子,当我们创建一个新的Spring Boot项目时,只要在pom.xml里添加了spring-b…

《MATLAB实战训练营:从入门到工业级应用》高阶挑战篇-《5G通信速成:MATLAB毫米波信道建模仿真指南》

《MATLAB实战训练营:从入门到工业级应用》高阶挑战篇-5G通信速成:MATLAB毫米波信道建模仿真指南 🚀📡 大家好!今天我将带大家进入5G通信的奇妙世界,我们一起探索5G通信中最激动人心的部分之一——毫米波信…

一、Redis快速入门

Redis的常见命令和客户端使用 一、初识Redis Redis是一种键值型的NoSql数据库,这里有两个关键字: 键值型 NoSql 其中键值型,是指Redis中存储的数据都是以key、value对的形式存储,而value的形式多种多样,可以是字符…

gitcode 上传文件报错文件太大has exceeded the limited size (10 MiB) in commit

登陆gitcoe,在项目设置->提交设置 ,勾选提交文件限制,修改限制的大小。 修改完后,重新提交代码。

【运维】构建基于Python的自动化运维平台:用Flask和Celery打造高效管理工具

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着企业IT基础设施的复杂性不断增加,手动运维已无法满足高效管理的需求。本文详细介绍如何基于Python构建一个自动化运维平台,利用Flask…

基于大模型预测的产钳助产分娩全方位研究报告

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与方法 二、产钳助产分娩概述 2.1 产钳助产定义与历史 2.2 适用情况与临床意义 三、大模型预测原理与数据基础 3.1 大模型技术原理 3.2 数据收集与处理 3.3 模型训练与验证 四、术前预测与准备 4.1 大模型术前风险预…

css使用aspect-ratio制作4:3和9:16和1:1等等比例布局

文章目录 1. 前言2. 用法2.1 基本语法2.2. 与max-width、max-height等属性结合使用2.3. 动态计算比例 3. 应用场景4. 兼容性和替代方案5. 总结 1. 前言 在网页制作过程中,有时候我们只知道宽度,或者只知道高度,这时候需要制作一个4:3和9:16这…

【国产化】在银河麒麟ARM环境下离线安装docker

1、前言 采用离线安装的方式。 关于离线安装的方式官网有介绍,但是说的很简单,网址:Binaries | Docker Docs 官网介绍的有几种主流linux系统的安装方式,但是没有kylin的,所以在此记录一下。 在安装过程中也遇到了些…

从一城一云到AI CITY,智慧城市进入新阶段

AI将如何改变城市面貌?AI能否为城市创造新的商业价值?AI的落地应用将对日常生活有什么样的影响? 几乎在每一场和城市发展相关的论坛上,都会出现以上几个问题。城市既是AI技术创新融合应用的综合性载体,普罗大众对AI产…

鸿蒙知识总结

判断题 1、 在http模块中,多个请求可以使用同一个httpRequest对象,httpRequest对象可以复用。(错误) 2、订阅dataReceiverProgress响应事件是用来接收HTTP流式响应数据。(错误) 3、ArkTS中变量声明时不需要…

[人机交互]理解用户

一.解释什么是认知,以及它对交互设计的重要性 1.1什么是认知 认知是指与knowing相关的能力,行为和过程(考填空) -如何感知物理刺激?如注意、知觉等 -如何认识自我、他人以及环境?如意识、记忆等 -如何…