当前位置: 首页 > news >正文

ansible 语句+jinjia2+roles

文章目录

    • 1、when语句
      • 1、判断表达式
        • 1、比较运算符
        • 2、逻辑运算符
        • 3、根据rc的返回值判断task任务是否执行成功
        • 5、通过条件判断路径是否存在
        • 6、in
    • 2、when和其他关键字
      • 1、block关键字
      • 2、rescue关键字
      • 3、always关键字
    • 3、ansible循环语句
      • 1、基于列表循环(whith_items)
      • 2、基于字典循环(with_dict)
      • 3、loop循环
    • 4、jinja2模块管理
      • 1、为什么需要这个
      • 2、jinjia条件语句
      • 3、jinjiafor语句
      • 4、jinjia2过滤器
        • 1、default过滤器
        • 2、password_hash
    • 5、角色
      • 1、为什么需要角色
      • 2、创建角色

1、when语句

  • 判断的结果一致的话,就执行任务,否则跳过任务

  • ansible中判断语句是when判断,默认when判断,就识别变量,所以的话,不需要使用"{{}}"来引用变量when inventory_hostname == 'node1

  • 还有一个点就是如果不使用变量的话,就只使用这个值的话,那么的话就要带上这个双引号,并且里面还要有单引号即可

  • 层级和模块的层级一样

1、判断表达式

1、比较运算符
符号作用
==比较2边是否相等
!=比较2边
>=左边大于右边
2、逻辑运算符
符号作用
and逻辑与,2边都为真,则返回
or逻辑或,有一个为真,则返回真
not逻辑否,对表达式进行取反,真为假,假为真
3、根据rc的返回值判断task任务是否执行成功
[root@controller mnt]# cat f8.yml
- hosts: node1tasks:- shell: ls /etc/passsssssregister: get_statusignore_errors: yes- debug:msg: rc is 0when: get_status.rc == 0- debug:msg: rc is errorwhen: get_status.rc != 0
5、通过条件判断路径是否存在
名称作用
file判断指定路径是否为一个文件
directory判断指定路径是否是一个目录
link判断指定路径是否为一个软链接
mount判断路径是否为挂载点
exists判断指定路径是否存在
# /etc/passwd存在的话,就执行任务
# when直接使用值的话需要使用双引号里面的值在加上单引号即可
[root@controller mnt]# cat f9.yaml
- hosts: alltasks:- debug:msg: existwhen: "'/etc/passwd is exists'"
6、in
  • 判断值是不是在列表中
[root@controller mnt]# cat f3.yml
- hosts: node1tasks:- debug:msg: ens160 existswhen: "'ens160' in ansible_interfaces"

2、when和其他关键字

1、block关键字

  • 判断一个部分的任务是否成功执行
[devops@controller ansible]$ cat when/2.yaml 
- hosts: alltasks:- block:- file:path: /mnt/111.txtstate: touch- file:path: /mnt/1.dirstate: directorywhen: inventory_hostname == "node1"

2、rescue关键字

  • block中任务失败的话,就会执行rescue下的任务,否则,不执行
- name: rescuehosts: alltasks:- block:- shell: ls /etc/p11111- file:path: /etc/passwdstate: filerescue:- debug:msg: rescuewhen: inventory_hostname == 'node1'

3、always关键字

  • 无论block任务执行成功还是失败都会执行的
- name: rescuehosts: alltasks:- block:- shell: ls /etc/p11111- file:path: /etc/passwdstate: filerescue:- debug:msg: rescuealways:- debug:msg: alwayswhen: inventory_hostname == 'node1'

3、ansible循环语句

1、基于列表循环(whith_items)

- hosts: allvars:users:- zhangsan- lisi- wangwutasks:- debug:msg: "{{ item }}"with_items: "{{users}}"

2、基于字典循环(with_dict)

[devops@controller ansible]$ cat dict.yaml 
- hosts: allvars:users:q1:uid: 2022name: zhangsanq2:uid: 2023name: lisitasks:- debug:msg: "{{ item.value.name }}"with_dict: "{{ users }}"# vaule就是uid和name

3、loop循环

  • 天生用来便利列表,也可以过滤字典
[devops@controller ansible]$ cat loop.yml 
- hosts: allvars:users:- zhangsan- lisi- wangwutasks:- debug:msg: "{{ item }}"loop: "{{ users }}"   # 循环里面

4、jinja2模块管理

1、为什么需要这个

  • 很多个主机都要搭建httpd服务,将一个httpd的配置文件拷贝到其余的主机上面,上面的ip地址都是一样的,所以的话,这个jinjia2模版文件会根据不同主机更改需要的内容

  • 将带有变量的模版,拷贝到其他节点上面,变量会自动的识别出来的值

[devops@controller ansible]$ cat j1.yml 
- hosts: alltasks:- template:src: /mnt/http.conf.j2dest: /mnt/httpd.conf
[devops@controller ansible]$ cat /mnt/http.conf.j2 
Listen {{ ansible_ens160.ipv4.address }}:80# 会根据不同的主机来获取到不同的信息

2、jinjia条件语句

  • 跟when语句是一样的

  • 主要就是利用了setup收集事实变量,从而实现内容的更替

# 格式
{% if 表达式 %}
执行语句
{% elif 表达式 %}
执行语句{% else %}
执行语句{% endif %}
# 需求如果是node1主机就显示node1 is ok ,node2主机就显示node2 is ok
[devops@controller ansible]$ cat /mnt/1.j2 
{% if ansible_hostname == 'node1' %}
"node1 is ok"
{% elif ansible_hostname == 'node2' %}
"node2 is ok"
{% else %}
error
{% endif %}[devops@controller ansible]$ cat j2.yml 
- hosts: alltasks:- template:src: /mnt/1.j2dest: /mnt/1

3、jinjiafor语句

{% for 变量 in 循环体 %}
执行语句
{% endof %}
  • groups.all 获取所有主机

  • hostvars 获取指定主机的信息,比如获取node1的fqdn hostvars[node1].ansible_fqdn

[devops@controller ansible]$ cat j3.yml 
- hosts: alltasks:- template:src: /mnt/3.j2dest: /etc/hosts[devops@controller ansible]$ cat /mnt/3.j2 
{% for i in groups.all %}
{{ hostvars[i].ansible_ens160.ipv4.address }} {{ hostvars[i].ansible_fqdn}} {{ hostvars[i].ansible_hostname}}
{% endfor %}

4、jinjia2过滤器

1、default过滤器
  • default 就是没有值的就使用定义的默认值
[devops@controller ansible]$ cat p1.yml 
- hosts: nodevars:users:- name: qquid: 3333- name: ww- name: rrtasks:- debug:msg: "{{ item.uid|default('9999') }}"loop: "{{ users }}"
2、password_hash
[devops@controller ansible]$ cat p2.yml 
- hosts: nodetasks:- user:name: j11password: "{{'123'|password_hash('sha512')}}"

5、角色

1、为什么需要角色

  • 解决了这个剧本之间的移植的关系,使用了角色的话,就可以直接移植到其他主机上面也能进行运行,就变得非常的高效了

  • 角色的组成部分

    • files:用于存放一些非模版文件的文件,就是一些普通的文件,会被复制到被控节点上面的

    • templates:用于存放角色相关的jinja2模版文件,当使用角色相关的模版时,如果没有明确指定模版的路径,则默认使用此目录中的模版

    • tasks:角色所需要执行的所有任务文件都存放于此,包含一个主文件main.yml,可以通过include的方式引入其他任务文件,就是可以创建多个tasks任务,然后在main,yml里面进行引用

    • handlers:用于定义角色中需要调用的handlers,包含一个主配置文件main.yml,也可以通过include引入其他的handlers文件

    • vars:定义此角色要用到的变量,包含一个主文件main.yml

    • meta:用于存储角色的元数据信息,这个写元数据用于描述角色的相关属性,作者等

    • defaults:除了vars目录,也可以定义角色用到的变量,定义的变量的优先级是最低的

2、创建角色

[devops@controller ansible]$ ansible-galaxy init apache
- Role apache was created successfully[devops@controller apache]$ ls
defaults  files  handlers  meta  README.md  tasks  templates  tests  vars# 编写一个httpd
[devops@controller tasks]$ cat main.yml 
---
# tasks file for apache- name: mountmount:src: /dev/sr0path: /mediafstype: iso9660state: mounted
- name: use yumyum:name: httpdstate: present
- name: use templatetemplate:src: httpd.conf.j2dest: /etc/httpd/conf/httpd.conf
- name: index.htmlcopy:src: index.htmldest: /var/www/html/
- name: serviceservice:name: "{{item}}"state: startedenabled: yesloop:- firewalld- httpd
- name: firewalldfirewalld:service: httppermanent: yesstate: enabledimmediate: yes# {{}} 输出变量,for和if可以一起使用
{% if inventory_hostname == 'node1' %}
Listen {{hostvars['node1'].ansible_ens160.ipv4.address}}:80
{% elif inventory_hostname == 'node2' %}
Listen {{hostvars['node2'].ansible_ens160.ipv4.address}}:80
{% endif %}

相关文章:

ansible 语句+jinjia2+roles

文章目录 1、when语句1、判断表达式1、比较运算符2、逻辑运算符3、根据rc的返回值判断task任务是否执行成功5、通过条件判断路径是否存在6、in 2、when和其他关键字1、block关键字2、rescue关键字3、always关键字 3、ansible循环语句1、基于列表循环(whith_items)2、基于字典循…...

【Docker项目实战】使用Docker部署HumHub社交网络平台

【Docker项目实战】使用Docker部署HumHub社交网络平台 一、HumHub介绍1.1 HumHub简介1.2 HumHub特点1.3 主要使用场景二、本次实践规划2.1 本地环境规划2.2 本次实践介绍三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本四、下载HumHub镜…...

“医者仁术”再进化,AI让乳腺癌筛查迎难而上

世卫组织最新数据显示,我国肿瘤疾病仍然呈上升趋势,肿瘤防控形势依然比较严峻。尤其是像乳腺癌等发病率较高的疾病,早诊断和早治疗意义重大,能够有效降低病死率。 另一方面,中国地域广阔且发展不平衡,各地…...

安卓流式布局实现记录

效果图&#xff1a; 1、导入第三方控件 implementation com.google.android:flexbox:1.1.0 2、布局中使用 <com.google.android.flexbox.FlexboxLayoutandroid:id"id/baggageFl"android:layout_width"match_parent"android:layout_height"wrap_co…...

-bash gcc command not found解决方案(CentOS操作系统)

以 CentOS7 为例&#xff0c;执行以下语句 : yum install gcc如果下载不成功&#xff0c;并且网络没有问题。 执行以下语句 : cp -r /etc/yum.repos.d /etc/yum.repos.d.bakrm -f /etc/yum.repos.d/*.repocurl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.…...

(二)Python输入输出函数

一、输入函数 input函数&#xff1a;用户输入的数据&#xff0c;以字符串形式返回&#xff1b;若需数值类型&#xff0c;则进行类型转换。 xinput("请入你喜欢的蔬菜&#xff1a;") print(x) 二、输出函数 print函数 输出单一数值 x666 print(x) 输出混合类型…...

从调用NCCL到深入NCCL源码

本小白目前研究GPU多卡互连的方案&#xff0c;主要参考NCCL和RCCL进行学习&#xff0c;如有错误&#xff0c;请及时指正&#xff01; 内容还在整理中&#xff0c;近期不断更新&#xff01;&#xff01; 背景介绍 在大模型高性能计算时会需要用到多卡&#xff08;GPU&#xf…...

深入理解Transformer的笔记记录(精简版本)NNLM → Word2Vec

文章的整体介绍顺序为&#xff1a; NNLM → Word2Vec → Seq2Seq → Seq2Seq with Attention → Transformer → Elmo → GPT → BERT 自然语言处理相关任务中要将自然语言交给机器学习中的算法来处理&#xff0c;通常需要将语言数学化&#xff0c;因为计算机机器只认数学符号…...

优选算法第一讲:双指针模块

优选算法第一讲&#xff1a;双指针模块 1.移动零2.复写零3.快乐数4.盛最多水的容器5.有效三角形的个数6.查找总价格为目标值的两个商品7.三数之和8.四数之和 1.移动零 链接: 移动零 下面是一个画图&#xff0c;其中&#xff0c;绿色部分标出的是重点&#xff1a; 代码实现&am…...

智能优化算法-水循环优化算法(WCA)(附源码)

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1.内容介绍 水循环优化算法 (Water Cycle Algorithm, WCA) 是一种基于自然界水循环过程的元启发式优化算法&#xff0c;由Shah-Hosseini于2012年提出。WCA通过模拟水滴在河流、湖泊和海洋中的流动过程&#xff0c;以及蒸发…...

基于SpringBoot的个性化健康建议平台

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理基于智能推荐的卫生健康系统的相关信息成为…...

Mapsui绘制WKT的示例

步骤 创建.NET Framework4.8的WPF应用在NuGet中安装Mapsui.Wpf 4.1.7添加命名空间和组件 <Window x:Class"TestMapsui.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winf…...

Modbus TCP 西门子PLC指令以太口地址配置以及 Poll Slave调试软件地址配置

1前言 本篇文章讲了 Modbus TCP通讯中的一些以太网端口配置和遇到的一些问题&#xff0c; 都是肝货自己测试的QAQ。 2西门子 SERVER 指令 该指令是让外界设备主动连接此PLC被动连接&#xff0c; 所以这里应该填 外界设备的IP地址。 这边 我因为是电脑的Modbus Poll 主机来…...

MySQL表的基本查询上

1&#xff0c;创建表 前面基础的文章已经讲了很多啦&#xff0c;直接上操作&#xff1a; 非常简单&#xff01;下一个&#xff01; 2&#xff0c;插入数据 1&#xff0c;全列插入 前面也说很多了&#xff0c;直接上操作&#xff1a; 以上插入和全列插入类似&#xff0c;全列…...

MySQL中什么情况下类型转换会导致索引失效

文章目录 1. 问题引入2. 准备工作3. 案例分析3.1 正常情况3.2 发生了隐式类型转换的情况 4. MySQL隐式类型转换的规则4.1 案例引入4.2 MySQL 中隐式类型转换的规则4.3 验证 MySQL 隐式类型转换的规则 5. 总结 如果对 MySQL 索引不了解&#xff0c;可以看一下我的另一篇博文&…...

数据治理的意义

数据治理是一套管理数据资产的流程、策略、规则和控制措施&#xff0c;旨在确保数据的质量、安全性、可用性和合规性。数据治理的目标通常包括但不限于以下几点&#xff1a; 1. **提高数据质量**&#xff1a;确保数据的准确性、一致性、完整性和可靠性。 2. **确保数据安全**…...

快手游戏服务端C++开发一面-面经总结

1、tcp的重传机制有哪几种&#xff1f;具体描述一下 最基本的超时重传 超过时间就会重传 三个重复ACK 快速重传 减少等待超时、 接收方可以发送选择性确认 不用重传整段 乱序到达 可以通知哪些丢失 重复数据重传 2、override和final&#xff1f; override可写可不写 写出来就…...

git的学习使用(认识工作区,暂存区,版本区。添加文件的方法)

学习目标&#xff1a; 学习使用git&#xff0c;并且熟悉git的使用 学习内容&#xff1a; 必备环境&#xff1a;xshell&#xff0c;Ubuntu云服务器 如下&#xff1a; 搭建 git 环境认识工作区、暂存区、版本区git基本操作之添加文件&#xff08;1&#xff09;&#xff1a;gi…...

Series数据去重

目录 准备数据 Series数据去重 DataFrame数据和Series数据去重对比 在pandas中&#xff0c;Series.drop_duplicates(keep, inplace)方法用于删除Series对象中的重复值。 keep&#xff1a; 决定保留哪些重复值。可以取以下三个值之一&#xff1a; first&#xff08;默认值&…...

Python语言核心12个必知语法细节

1. 变量和数据类型 Python是动态类型的&#xff0c;变量不需要声明类型。 python复制代码 a 10 # 整数 b 3.14 # 浮点数 c "Hello" # 字符串 d [1, 2, 3] # 列表 2. 条件语句 使用if, elif, else进行条件判断。 python复制代码 x 10 if x > 5: print(&q…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来&#xff0c;在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂&#xff0c;网络攻击、数据泄露等事件频发&#xff0c;现行法律已难以完全适应新的风险挑战。 2025年3月28日&#xff0c;国家网信办会同相关部门起草了《网络安全…...

《Docker》架构

文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器&#xff0c;docker&#xff0c;镜像&#xff0c;k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...

软件工程 期末复习

瀑布模型&#xff1a;计划 螺旋模型&#xff1a;风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合&#xff1a;模块内部功能紧密 模块之间依赖程度小 高内聚&#xff1a;指的是一个模块内部的功能应该紧密相关。换句话说&#xff0c;一个模块应当只实现单一的功能…...

LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》

&#x1f9e0; LangChain 中 TextSplitter 的使用详解&#xff1a;从基础到进阶&#xff08;附代码&#xff09; 一、前言 在处理大规模文本数据时&#xff0c;特别是在构建知识库或进行大模型训练与推理时&#xff0c;文本切分&#xff08;Text Splitting&#xff09; 是一个…...

[USACO23FEB] Bakery S

题目描述 Bessie 开了一家面包店! 在她的面包店里&#xff0c;Bessie 有一个烤箱&#xff0c;可以在 t C t_C tC​ 的时间内生产一块饼干或在 t M t_M tM​ 单位时间内生产一块松糕。 ( 1 ≤ t C , t M ≤ 10 9 ) (1 \le t_C,t_M \le 10^9) (1≤tC​,tM​≤109)。由于空间…...

网页端 js 读取发票里的二维码信息(图片和PDF格式)

起因 为了实现在报销流程中&#xff0c;发票不能重用的限制&#xff0c;发票上传后&#xff0c;希望能读出发票号&#xff0c;并记录发票号已用&#xff0c;下次不再可用于报销。 基于上面的需求&#xff0c;研究了OCR 的方式和读PDF的方式&#xff0c;实际是可行的&#xff…...