ansible进阶功能

devtools/2024/11/15 0:41:18/

目录

handlers-触发器

when-判断

循环

单变量循环

多变量循环

Jinja2-模板

include-引用

roles-角色

vault-加密


handlers-触发器

配合notify使用,通过notify监控是否发生改动,从而触发handlers。

handlers是在task全部执行完之后再执行。

下发nfs配置文件并重启:

- hosts: nfstasks:- name: 发文件copy:src: /etc/exportsdest: /etc/exportsbackup: yesnotify:- 重启nfshandlers:- name: 重启nfssystemd:name: nfsstate: reloaded

执行过程:

[root@m01 ~]# ansible-playbook handlers.ymlPLAY [nfs] ***************************************************************************************************************************************TASK [Gathering Facts] ***************************************************************************************************************************
ok: [172.16.1.31]TASK [发文件] ***************************************************************************************************************************************
changed: [172.16.1.31]RUNNING HANDLER [重启nfs] **************************************************************************************************************************
changed: [172.16.1.31]PLAY RECAP ***************************************************************************************************************************************
172.16.1.31                : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

when-判断

设置task运行的条件,满足添加后运行。

主机名为web01的安装软件:

- hosts: allgather_facts: notasks:- name: install htopyum:name: htopstate: installedwhen: ansible_hostname == "web01"

对不符合条件的主机会skipping跳过。

[root@m01 ~]# ansible-playbook when.ymlPLAY [all] ***************************************************************************************************************************************TASK [Gathering Facts] ***************************************************************************************************************************
ok: [172.16.1.41]
ok: [172.16.1.7]
ok: [172.16.1.31]TASK [install htop] ******************************************************************************************************************************
skipping: [172.16.1.31]
skipping: [172.16.1.41]
ok: [172.16.1.7]PLAY RECAP ***************************************************************************************************************************************
172.16.1.31                : ok=1    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0
172.16.1.41                : ok=1    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0
172.16.1.7                 : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

循环

ansible中loop和with_items都可以循环。

单变量循环

存在循环时,item代表变量。

重启rpcbind和nfs服务:

- hosts: nfsgather_facts: notasks:- name: 重启rpcbind,nfssystemd:name: "{{ item }}"state: restartedloop:- rpcbind- nfs
[root@m01 ~]# ansible-playbook loop.ymlPLAY [nfs] ***************************************************************************************************************************************TASK [重启rpcbind,nfs] *****************************************************************************************************************************
changed: [172.16.1.31] => (item=rpcbind)
changed: [172.16.1.31] => (item=nfs)PLAY RECAP ***************************************************************************************************************************************
172.16.1.31                : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

多变量循环

在loop或者with_itmes级别下每个列表中定义多个变量,引用时使用item.变量名

创建用户:

- hosts: nfsgather_facts: notasks:- name: 创建用户user:name: "{{ item.name }}"uid: "{{ item.uid }}"state: presentloop:- { name: wang1, uid: 3000 }- { name: wang2, uid: 3001 }
[root@m01 ~]# ansible-playbook loop2.ymlPLAY [nfs] ***************************************************************************************************************************************TASK [创建用户] **************************************************************************************************************************************
ok: [172.16.1.31] => (item={u'name': u'wang1', u'uid': 3000})
ok: [172.16.1.31] => (item={u'name': u'wang2', u'uid': 3001})PLAY RECAP ***************************************************************************************************************************************
172.16.1.31                : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Jinja2-模板

template模块配合Jinja2模板一起使用,从管理机传送文件到被控机上并将模板中的变量解析。

Jinja2也有自己的语法。

模板文件后缀使用.j2。

jinja2模板:

主机名:{{ansible_hostname}}
版本:{{ansible_distribution}}

playbook:

- hosts: alltasks:- name: 分发文件template:src: /root/template.j2dest: /etc/host.j2backup: yes

 运行结果:

[root@nfs01 ~]# cat /etc/host.j2
主机名:nfs01
版本:CentOS

include-引用

将一个较大的剧本拆分多个剧本。tasks比较多时,可以将tasks写在独立的文件内,通过include引用。

playbook:

- hosts: backuptasks:- include_tasks: yum_install.yml- hosts: webtasks:- include_tasks: yum_remove.yml

include文件:

- name: install_htopyum:name: htopstate: present
- name: remove_htopyum:name: htopstate: absent

roles-角色

一个剧本目录结构规范,按照规范存放剧本的文件。

官方定义的roles目录有好几个,此处列了最常用的几个。

使用roles目录结构后,tasks中的各种应用都可以省略路径。

roles/top.yml    主文件hosts    主机清单nfs-server/    功能目录files/        存放文件,copy模块调用的目录templates/    存放模板文件(.j2),template模块调用的目录tasks/main.yml    tasks内容handlers/main.yml    handlers触发器内容group_vars/    变量目录

使用rules后,主文件(入口文件)不再写tasks,直接写roles即可,会自己调用tasks下的文件。tasks文件只需要写对应的tasks即可,并且tasks中对文件和变量的应用也无需制定路径。

主文件写法:

- hosts: nfsroles:- role: nfs-server #role下的功能目录名

vault-加密

ansible需要使用的文件进行加密,如:hosts、变量文件、剧本文件等。

#加密文件
ansible-vault encrypt hosts
#使用,--ask-vault-pass
ansible all -m ping --ask-vault-pass
#解密文件
ansible-vault decrypt hosts


http://www.ppmy.cn/devtools/132823.html

相关文章

【Python】爬虫使用代理IP

1、代理池 IP 代理池可以理解为一个池子,里面装了很多代理IP。 池子里的IP是有生命周期的,它们将被定期验证,其中失效的将被从池子里面剔除池子里的ip是有补充渠道的,会有新的代理ip不断被加入池子中池子中的代理ip是可以被随机…

Ubuntu 22.04.5 LTS配置 bond

本次纯实验,不会讲解bond功能,配置bond mode 1 和 mode 4 如何配置 确定内核模块是否加载 实验使用root用户权限,非root用户使用sudo 调用root权限 rootubuntu22:~# lsmod | grep bonding rootubuntu22:~# modprobe bonding rootubuntu22:~# …

web安全漏洞之命令注入

命令注入 1.什么是命令注入 通常情况下,开发者使用一些可以执行命令的函数且未对用户输入进行安全检查时,可以造成命令注入。从CTF的角度来讲, 命令注入可以实现: 1、直接读取flag 2、反弹shell 3、利用题目环境漏洞, 控制整个题目环境, 干…

电子学会2024年3月青少年软件编程(图形化)等级考试试卷(二级)真题,含答案解析

我们今天分享的资料是:电子学会2024年3月青少年软件编程(图形化)等级考试试卷(二级)真题,含答案解析 电子学会 2024 年 3 月青少年软件编程(图形化)等级二级考试的主要考点包括: 坐标值的应用:熟练掌握坐标的概念及每个积木的使用,能利用坐标精确控制角色的位置。外…

IP SSL证书

随着互联网技术的发展,网络安全成为企业和个人用户关注的重点。SSL证书作为确保网络通信安全的重要工具,在各类网站和服务中得到广泛应用。然而,除了常见的基于域名的SSL证书外,还有一种特殊的证书类型——IP SSL证书,…

SpringBoot项目编译报错 类文件具有错误的版本 61.0, 应为 52.0

springboot项目在编译时报错: /Users/Apple/Developer/art/caicai/cai-api/dubbo-samples/1-basic/dubbo-samples-spring-boot/dubbo-samples-spring-boot-provider/src/main/java/org/apache/dubbo/springboot/demo/provider/ProviderApplication.java:22:32 java…

微信小程序 高校教材征订系统

文章目录 项目介绍具体实现截图技术介绍mvc设计模式小程序框架以及目录结构介绍错误处理和异常处理java类核心代码部分展示详细视频演示源码获取 项目介绍 系统分为三个角色,分别是教材科、系教学秘书、教研室主任。系统主要完成功能是教材科要发布教材征订信息&am…

搭建轻量级文件服务器Dufs

前言 Dufs是什么? 答:是一款轻量级文件管理服务器,类似于FTP服务器但又比FTP更好用易于管理。 Dufs有什么特性? 答: ‌静态文件服务…