Ansible 进阶

news2024/11/20 13:21:37

模块应用

firewalld模块

可以配置防火墙策略

[root@control ~]#  vim ~/ansible/firewall.yml
---
- hosts: test                           #hosts定义需要远程的主机
  tasks:                                 #tasks定义需要执行哪些任务
    - name: install firewalld.         #name为第一个任务定义描述信息
      yum:                               #第一个任务调用yum模块安装软件
        name: firewalld                 #需要安装的软件名称为firewalld
        state: present                  #state等于present代表安装软件
    - name: run firewalld.             #定义第二个任务的描述信息
      service:                          #第二个任务调用service模块启动服务
        name: firewalld                #启动的服务名称为firewalld
        state: started                 #state等于started代表启动服务
        enabled: yes                    #enabled等于yes是设置服务为开机自启动
    - name: set firewalld rule.       #第三个任务的描述信息
      firewalld:                        #第三个任务调用firewalld模块设置防火墙规则
        port: 80/tcp                    #在防火墙规则中添加一个放行tcp,80端口的规则
        permanent: yes                  #permaenent 是设置永久规则
        immediate: yes                  #immediate 是让规则立刻生效
        state: enabled                  #state等于enabled是添加防火墙规则
#最终:在默认zone中添加一条放行80端口的规则

template模块 

copy模块可以将一个文件拷贝给远程主机,但是如果希望每个拷贝的文件内容都不一样呢?如何给所有web主机拷贝index.html内容是各自的IP地址?

Ansible可以利用Jinja2模板引擎读取变量,之前在playbook中调用变量,也是Jinja2的功能,Jinja2模块的表达式包含在分隔符"{{ }}"内。

[root@control ansible]# vim ~/ansible/index.html
Welcome to {{ansible_hostname}} on {{ ansible_eth0.ipv4.address }}. 
#注意网卡名称根据实际情况填写,不可以完全照抄,不知道网卡名可以通过ip a s查询!
#{{ansible_hostname}}和{{ ansible_eth0.ipv4.address }}是ansible自动的facts变量。   

[root@control ansible]# vim ~/ansible/template.yml
---
- hosts: webserver
  tasks:
    - name: use template copy index.html to webserver.
      template:
        src: ~/ansible/index.html
        dest: /tmp/index.html
#hosts定义需要远程的目标主机是谁;tasks定义需要执行的任务是什么
#- name定义任务的描述信息;任务需要调用的模块是template模块
#template模块需要两个参数,src指定需要拷贝的源文件,dest指定需要拷贝的目标位置
#src: ~/ansible/template/index.html是上面创建的文件,文件中包含变量
#dest: /tmp/index.html拷贝到目标主机放在/tmp目录下

高级语法

error错误处理

默认ansible在遇到error会立刻停止playbook,使用ignore_errors可以忽略错误,继续后续的任务。

如果一个剧本里面有20个任务,执行到第3个时失败,则不再往下执行。

没有忽略错误示例

[root@control ansible]# vim ~/ansible/error.yml
---
- hosts: test
  tasks:
    - name: start a service that does not exist.
      service:
        name: hehe         #注意:没有这个服务(启动一个不存在的服务)                                       
        state: started
    - name: touch a file.
      file:
        path: /tmp/service.txt
        state: touch

下面这个Playbook在执行时因为忽略了错误针对某一个任务),不会被中断。

[root@control ansible]# vim ~/ansible/error.yml
---
- hosts: test
  tasks:
    - name: start a service that does not exist.
      service:
        name: hehe
        state: started
      ignore_errors: true       #针对某一个任务忽略错误(ignore_errors是关键词)                          
    - name: touch a file.
      file:
        path: /tmp/service.txt
        state: touch

下面这个Playbook在执行时因为忽略了错误,不会被中断,针对playbookl

[root@control ansible]# cat ~/ansible/error.yml
---
- hosts: test
  ignore_errors: true      #针对playbook全局忽略错误                             
  tasks:
    - name: start a service that does not exist.
      service:
        name: hehe
        state: started
    - name: touch a file.
      file:
        path: /tmp/service.txt
        state: touch

handlers

仅当某个任务触发(notify)handlers时才执行相应的任务,如果有多个notify触发执行handlers任务,也仅执行一次。

仅当任务的执行状态为changed时handlers任务才执行

handlers任务在所有其他任务都执行后才执行

notify后面的名称必须和handlers中的任务名称一致

在剧本中tasks用来定义任务(一定会执行),handlers也可以定义任务(不一定执行),handlers任务要想执行必须要被别人触发才能执行。

实例草稿:
---
- hosts: test
  tasks:
    - 任务1
       notify:任务5
    - 任务2
  handlers:
    - 任务5
    - 任务6
通过notify触发执行handlers任务的案例
[root@control ansible]# vim ~/ansible/handlers.yml
---
- hosts: test
  tasks:
    - name: create directory.           #多次执行playbook该任务状态不再是changed
      file:                               #调用file模块创建目录
        path: /tmp/parents/subdir/      #需要创建的具体目录名称
        state: directory                #state等于directory代表创建目录
      notify: touch file                #notify后面名称必须和handlers中的任务名称一致           
  handlers:                              #通过handlers再定义一组任务
    - name: touch file                  #给任务写描述信息(任务的名字,名字可以任意)
      file:                              #调用file模块创建文件
        path: /tmp/parents/subdir/new.txt    #需要创建的文件名
        state: touch                           #state等于touch代表创建文件
#备注:仅当file模块执行成功,
#并且状态为changed时才会通过notify触发执行handlers下面的任务,
#所以多次执行该剧本时,handlers任务不会被重复执行,
#notity后面的名称必须和handlers下面name定义的任务名称一致(名称可以任意)。

when条件判断

when可以定义判断条件,条件为真时才执行某个任务。

常见条件操作符有:==、!=、>、>=、<、<=。

多个条件可以使用and(并且)或or(或者)分割,when表达式中调用变量不要使用{{ }}。

远程主机剩余内存不足700M则关闭NetworkManager服务

[root@control ansible]# vim ~/ansible/when_1.yml
---
- hosts: test
  tasks:
    - name: check memory size.
      service:
        name: NetworkManager
        state: stopped
      when: ansible_memfree_mb < 700
#被管理端主机剩余内存不足700M则关闭NetworkManager服务(也可以关闭别的不需要的服务)
#ansible_memfree_mb这个是ansible自带的facts变量,代表剩余内存的容量。

判断操作系统是RedHat8则创建测试文件。YAML的语法格式中>支持多行输入,但不保留换行符。

[root@control ansible]# vim ~/ansible/when_2.yml
---
- hosts: test
  tasks:
    - name: touch a file
      file:
        path: /tmp/when.txt
        state: touch
      when:  >
        ansible_distribution == "RedHat"
        and
        ansible_distribution_major_version == "8"
#判断操作系统是RedHat8则创建测试文件
#YAML的语法格式中>支持多行输入,但不保留换行符(计算机会认为实际是一行内容)
#ansible_distribution和ansible_distribution_major_version都是自带的facts变量
#可以使用setup模块查看这些变量

block任务块

通常与 rescue  always语句 一起使用

如果我们需要当条件满足时执行N个任务,我们可以给N个任务后面都加when判断(但是很麻烦),此时可以使用block定义一个任务块,当条件满足时执行整个任务块.

任务块就是把一组任务合并为一个任务组,使用block语句可以将多个任务合并为一个任务组。

[root@control ansible]# vim ~/ansible/block_1.yml
---
- hosts: test
  tasks:
    - name: define a group of tasks.
      block:                                          #block是关键词,定义任务组
        - name: install httpd                       #任务组中的第一个任务
          yum:                                        #调用yum模块安装httpd软件包
            name: httpd
            state: present
        - name: start httpd                          #任务组中的第二个任务
          service:                                    #调用service模块启动httpd服务
            name: httpd
            state: started
      when: ansible_distribution == "RedHat"       #仅当条件满足再执行任务组
#注意:when和block是对齐的,他们在一个级别,当条件满足时要执行的是任务组(不是某一个任务)
#判断条件是看远程的目标主机使用的Linux发行版本是否是RedHat.

对于block任务块,我们可以使用rescue语句定义在block任务执行失败时要执行的其他任务,还可以使用always语句定义无论block任务是否成功,都要执行的任务。

rescue和always的示例

[root@control ansible]# vim ~/ansible/block_2.yml
---
- hosts: test
  tasks:
    - block:
        - name: touch a file test1.txt
          file:
            name: /tmp/test1.txt      #如果修改为/tmp/xyz/test1.txt就无法创建成功                        
            state: touch
      rescue:
        - name: touch a file test2.txt
          file:
            name: /tmp/test2.txt
            state: touch
      always:
        - name: touch a file test3.txt
          file:
            name: /tmp/test3.txt
            state: touch
#默认在/tmp/目录下创建test1.txt会成功,所以不执行rescue(创建test2.txt)
#如果我们把block中的任务改为创建/tmp/xyz/test1.txt(因为没有xyz目录所以会失败)
#当block默认任务失败时就执行rescue任务(创建test2.txt)
#但是不管block任务是否成功都会执行always任务(创建test3.txt)

loop循环

相同模块需要反复被执行怎么处理?使用loop循环可以避免重复。

编写Playbook,循环创建目录。

[root@control ansible]# vim ~/ansible/simple_loop.yml
---
- hosts: test
  tasks:
    - name: mkdir multi directory.
      file:
        path=/tmp/{{item}}       #注意,item是关键字,调用loop循环的值                                
        state=directory
      loop:                       #loop是关键词,定义循环的值,下面是具体的值
        - School
        - Legend
        - Life
#最终在/tmp目录下创建三个子目录.file模块被反复执行了三次。
#mkdir  /tmp/School;  mkdir  /tmp/Legend;   mkdir  /tmp/Life。

循环创建用户并设置密码

[root@control ansible]# vim ~/ansible/complex_loop.yml
---
- hosts: test
  tasks:
    - name: create multi user.
      user:
        name: "{{item.iname}}"
        password: "{{item.ipass | password_hash('sha512')}}"
      loop:
        - { iname: 'term', ipass: '123456' }
        - { iname: 'amy' , ipass: '654321' }
#loop循环第一次调用user模块创建用户,user模块创建用户会读取loop里面的第一个值.
#loop第一个值里面有两个子值,iname和ipass
#创建用户item.iname就是loop第一个值里面的iname=term
#修改密码item.ipass就是loop第一个值里面的ipass=123456
#loop循环第二次调用user模块创建用户,user模块创建用户会读取loop里面的第二个值.
#loop第二个值里面有两个子值,iname和ipass
#创建用户item.iname就是loop第二个值里面的iname=amy
#修改密码item.ipass就是loop第二个值里面的ipass=654321

Ansible Roles

  • 自定义Ansible Role
  • 编写playbook调用role
  • 使用ansible-galaxy管理Roles

在实际生产环境中,为了实现不同的功能,我们会编写大量的playbook文件。而且,每个playbook还可能会调用其他文件(如变量文件),对于海量的、无规律的文件,管理起来非常痛苦!

Ansible从1.2版本开始支持Role(角色),Role(角色)是管理ansible文件的一种规范(目录结构),Role(角色)会按照标准的规范,自动到特定的目录和文件中读取数据。

如果我们创建了一个名称为user.example的Role(角色),则其标准的目录结构如下图所示。

 Roles目录结构中主要文件的作用     

  • defualts/main.yml:定义变量的缺省值,优先级较低
  • files目录:存储静态文件的目录,如tar包、音乐、视频等
  • handlers/main.yml:定义handlers
  • meta/main.yml:写作者、版本等描述信息
  • README.md:整个角色(role)的描述信息
  • tasks/main.yml:定义任务的地方
  • templates目录:存放动态数据文件的地方(文件中包含了变量的模板文件)
  • vars/main.yml:定义变量,优先级高

创建Roles

下面这个案例目的:编写一个包含变量的模板文件,编写任务调用template模块,将模板文件拷贝给被管理端主机

ansible-galaxy命令可以创建、管理自己的roles

[root@control ansible]# mkdir ~/ansible/roles
[root@control ansible]# ansible-galaxy init ~/ansible/roles/issue
#创建一个Role,该Role的目的是拷贝自己新建的一个模板文件到远程主机的/etc/issue
[root@control ansible]# tree ~/ansible/roles/issue/
#查看目录结构,如果没有tree命令则需要使用yum安装该软件

 修改Role文件

定义名称为myfile.txt的模板文件(该文件包含变量,因此必须放置templates目录)

[root@control ansible]# vim ~/ansible/roles/issue/templates/myfile.txt
This is the system {{ansible_hostname}}
Today's date is:{{ansible_date_time.date}}
Contact to {{ admin }}

 自定义变量文件(前面调用了admin这个变量,这里需要定义admin变量并赋值)

[root@control ansible]# vim ~/ansible/roles/issue/vars/main.yml
---
# vars file for /root/ansible/roles/issue
admin: yoyo@tedu.cn
#变量名为admin,变量的值为yoyo@yy.cn

 文件准备好了,计算机不会自动将文件拷贝给被管理端主机!需要编写任务调用模块实现拷贝的功能。

修改任务文件,任务文件中不需要tasks关键词,Role的各个文件之间相互调用不需要写文件的路径。

[root@control ansible]# vim ~/ansible/roles/issue/tasks/main.yml
---
# tasks file for /root/ansible/roles/issue
-  name: delever issue file
   template:
     src: myfile.txt
     dest: /etc/issue
#调用template模块将myfile.txt文件拷贝给被管理端主机.

 在Playbook中调用Role

Role创建好了,role不会自己运行,需要编写一个剧本调用上面的role。

编写playbook剧本文件,通过roles关键词调用role。

[root@control ansible]# vim  ~/ansible/issue.yml
---
- hosts: test
  roles:
    - issue
#- role2              #支持加载多个role

 修改ansible.cfg配置文件,定义roles目录。

[root@control ansible]# vim  ~/ansible/ansible.cfg 
[defaults]
inventory = ./inventory
roles_path = ./roles                    #指定到哪个目录下找role

 ansible-galaxy命令

公共Roles仓库(https://galaxy.ansible.com)管理

[root@control ansible]# ansible-galaxy  search 'httpd' 
#联网搜索roles
[root@control ansible]# ansible-galaxy info acandid.httpd 
#查看roles基本信息
[root@control ansible]# ansible-galaxy install acandid.httpd -p ~/ansible/roles/
#下载roles到特定的目录,-p可以指定下载到哪个目录

 使用ansible-galaxy install可以直接下载Role,也可以编写requirements.yml文件下载Role

[root@control ansible]# vim ~/ansible/roles/requirements.yml
#格式一:可以直接从Ansible Galaxy官网下载
- src: acandid.httpd
#格式二:可以从某个git服务器下载
- src: http://gitlab.com/xxx/xxx.git
  scm: git
  version: 56e00a54
  name: nginx-acme
#格式三:可以指定位置下载tar包,支持http、https、file
- src:  http://example.com/myrole.tar
  name:  myrole
[root@control ansible]# ansible-galaxy install \
-r ~/ansible/roles/requirements.yml \
-p roles
# -r后面跟文件名,该文件中包含了需要下载哪些role以及他们的链接位置
# -p 指定将下载的role保存到哪个目录

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

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

相关文章

ChatGPT已过时?Auto-GPT迅速走红,无需人类插手自主解决复杂任务,GitHub标星5万

来源: AI前线 微信号&#xff1a;ai-front 作者 | Luke Larsen ChatGPT 之所以能风靡全球&#xff0c;很大程度上要归功于其简单的功能框架。作为一款 AI 聊天机器人&#xff0c;它唯一的作用就是生成令人信服的自然语言文本、顺畅回应用户的提问。 但 AI 聊天机器人的使用体…

大数据分析案例-基于XGBoost算法预测航空机票价格

🤵‍♂️ 个人主页:@艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂加关注+ 喜欢大数据分析项目的小伙伴,希望可以多多支持该系列的其他文章 大数据分析案例合集…

实在智能获评十大数字经济风云企业,2022余杭数字经济“群英榜”发布

4月17日&#xff0c;经专家评审、公开投票&#xff0c;由中共杭州市余杭区委组织部&#xff08;区委两新工委&#xff09;、中共杭州市余杭区经济和信息化局委员会主办评选的2022年度余杭区数字经济“群英榜”正式公示。其中&#xff0c;实在智能成功获评十大数字经济风云企业之…

cocoscreator性能优化4-Sprite颜色数据去除

前言 Sprite是游戏内容的一个基本组成元素&#xff0c;包括ui、道具、立绘等各种地方都会用到。大部分情况下美术会帮我们调好图片颜色&#xff0c;我们只要把图片直接放到游戏里就行了。Sprite默认的渲染顶点数据中包含了颜色数据&#xff0c;由于我们并不需要去修改颜色&…

【Python】AttributeError: ‘list‘ object has no attribute ‘corr‘

一、问题描述 在绘制相关分析热力图的时候&#xff1a; import seaborn as sns to_corr [Age, Income, Kidhome, Teenhome, Recency, Complain, MntWines, MntFruits, MntMeatProducts, MntFishProducts, MntSweetProducts, MntGoldProds, NumDealsPurchases, AcceptedCmp1,…

如何将 Spire.Doc for C++ 集成到 C++ 程序中

Spire.Doc for C 是一个专业的 Word 库&#xff0c;供开发人员在任何类型的 C 应用程序中阅读、创建、编辑、比较和转换 Word 文档。 本文演示了如何以两种不同的方式将 Spire.Doc for C 集成到您的 C 应用程序中。 通过 NuGet 安装 Spire.Doc for C通过手动导入库安装 Spire.…

tomcat配置虚拟主机

文章目录 tomcat配置虚拟主机环境修改tomcat主配置文件server.xml配置配置虚拟主机目录以及文件重新启动tomcat修改windows的hosts文件浏览器测试 tomcat配置虚拟主机 环境 java version “1.8.0_261”Server version: Apache Tomcat/8.5.20 修改tomcat主配置文件server.xml…

缺省参数-函数重载

缺省参数 缺省参数是声明或定义函数时为函数的参数指定一个默认值 有什么用&#xff1f; 更加灵活的增加默认值&#xff0c;或者手动给一个初始值&#xff0c;解决了C语言#define给死一个值的缺陷&#xff0c;C语言无法做到缺省参数这么灵活 struct Stack {int* a;int top;in…

北邮22信通:(13)第三章 3.4 串的实现 KMP算法

北邮22信通一枚~ 跟随课程进度每周更新数据结构与算法的代码和文章 持续关注作者 解锁更多邮苑信通专属代码~ 上一篇文章&#xff1a; 下一篇文章&#xff1a; ***说明*** 1.本代码结合书上第二章线性表和4.3.3KMP算法结合书写。 2.加快匹配速度的根本原因&#xff1…

行业分析| 新的学习方式——在线自习室

互联网技术在快速革新中不断推动新应用、新场景、新模式和新业态的发展融通&#xff0c;如近年来不断催生的游戏直播、直播带货、户外直播等网络生态。随着互联网用户逐年增多&#xff0c;年轻化趋势明显&#xff0c;互联网直播内容逐渐向生活化、日常化拓展&#xff0c;加之“…

Linux 防火墙常用命令

目录 前文叙述 Linux 找不到 firewall 命令 firewalld 常用管理命令 firewall-cmd 常用命令参数说明 前文叙述 Linux 防火墙默认为开启状态&#xff0c;生产环境下 Linux 防火墙也肯定是开启状态。因此在生产环境下往往是开放特定端口让外部进行连接使用。 Linux 找不到 fir…

数字化时代,企业为什么越来越重视数据分析

自数据成为第五大生产要素后&#xff0c;其价值得到了越来越多企业的认可&#xff0c;也成为了各行各业企业的重要的资产。而信息化建设在企业中的发展更是给了数据增长的机会&#xff0c;随着业务信息系统在企业中成为基础建设&#xff0c;众多企业都通过业务系统沉淀了大量业…

JSP的基本使用总结

JSP的基本使用总结 &#x1f3e0;个人主页&#xff1a;shark-Gao &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是shark-Gao&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f389;目前状况&#xff1a;23届毕业生&#xff0c;目前在…

海睿思分享 | 风控监管,守住企业生命线

1 企业如何应对市场风险 随着市场形势日益严峻&#xff0c;企业风险系数也在同步增加&#xff0c;一旦风险管理出现重大问题&#xff0c;将是致命的、灾难性的&#xff0c;可能导致企业出现生存危机。 风控监管的主要目的在于通过对各类风险进行识别、分析、监控&#xff0c…

【java web篇】MyBatis之Mapper代理

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…

MacOS版本RedisDesktopManager源码编译

1. 克隆 : git clone --recursive https://github.com/RedisInsight/RedisDesktopManager.git 查看依赖模块: git submodule 编译注意事件,部分源码的子仓库依赖没有下载完整的,要手动下载 brotli子模块 编译brotli子模块 $ mkdir out && cd out $ ../configure-c…

助力春耕:数智驱动现代农业高质量发展

最近有部很有意思的综艺《种地吧&#xff01;少年》&#xff0c;节目内容就是十个少年要用192天的时间在142亩土地上&#xff0c;完成抢收水稻&#xff0c;抢种小麦&#xff0c;并在6月份完成小麦的收割&#xff0c;这样一个内容。 这个节目没有流量明星&#xff0c;而被吸引去…

MyBatis(十六)MyBatis使用PageHelper

一、limit分页 mysql的limit后面两个数字&#xff1a; 第一个数字&#xff1a;startIndex&#xff08;起始下标。下标从0开始。&#xff09; 第二个数字&#xff1a;pageSize&#xff08;每页显示的记录条数&#xff09; 假设已知页码pageNum&#xff0c;还有每页显示的记录…

K8s集群搭建-Kubeadm方式搭建集群【1.23.0版本】

文章目录 一、初始化准备二、安装kubeadm三、初始化Master集群四、将新的Node节点加入集群五、部署CNI网络插件六、其他配置 Kubernetes1.24(包括1.24)之后不在兼容docker,如果有需要兼容docker的需求&#xff0c;则安装一个 cri-docker的插件&#xff0c;本文使用的是kuberne…

【技巧】如何在微信与企业微信端实现自动化ChatGPT智能机器人服务?(WorkTool)

场景描述 对于使用企业微信办公协作的公司/团体/组织等&#xff0c;在工作的时候&#xff0c;经常需要通过群机器人的方式&#xff0c;回答群内成员的问题。 基于此&#xff0c;一些企业想要将ChatGPT的智能对话能力与企业微信群机器人的回复能力结合&#xff0c;在企业微信群…