ansible的脚本—playbook剧本

目录

一、playbook

1、简介

2、playbook组成部分:

3、如何编写Playbook?

4、语句的横向/纵向写法

二、playbook模版实例:

1、playbook模版:

2、playbook的条件判断:

3、playbook中的循环:

4、循环练习:


一、playbook

1、简介


Playbook 剧本是由一个或多个play组成的列表。

play的主要功能在于将预定义的一组主机,装扮成事先通过ansible中的task定义好的角色。

Task实际是调用ansible的一个module,将多个play组织在一个playbook中,即可以让它们联合起来,按事先编排的机制执行预定义的动作

Playbook 文件是采用YAML语言编写的。
 

2、playbook组成部分:

1、tasks任务:包含要在目标主机上执行的操作,使用模块定义这些操作。每个任务都是一个模块的调用。

2、variables变量:存储和传递数据,和shell脚本中的变量是一个意思,可以在playbook当中定义为全局变量,也可以在外部传参。

3、templates模版:主要用于生成配置文件。模版是包含占位符的文件。占位符由ansible在执行时转化为变量值

4、handlers处理器:当需要有变更的时候,可以执行触发器

5、roles角色:类似于docker-compose,是一种组织和封装playbook的。允许把相关的任务,变量和模版和处理器组织成一个可复用的单元

3、如何编写Playbook?

xxx.yaml/xxx.yml
--- #表示开始
- name:  #指定play的名称
  hosts: #指定主机清单中定义的主机组名
  remote_user: #指定远程主机的执行用户
  grather_facts: ture|fales #指定是否要收集远程主机的facts信息
  vars:   #自定义变量,只能在当前play有效
    - 变量1: 值1  #格式为key: value
    - 变量2: 值2
  tasks: #定义任务列表,默认从上往下依次执行
    - name: #定义任务的名称
      模块名: 模块参数        
      ignore errors: true  #忽略任务的失败
    - name: #可以定义多个任务
      模块名: 模块参数  
      notify: 任务名  #如以上操作后为changed的状态时,会通过notify指定的名称触发对应名称的handlers操作
      ##条件判断##
     - name:
       模块名: 模块参数
       when: #定义条件表达式(== != > < >= <=),条件成立时执行此task任务,否则不执行任务
       ##循环##
     - name:
       模块名: 模块参数={{item}}
       with_items: #定义循环列表
     ##tags模块,标签## 
     - name: 
       模块名: 模块参数 
       tags:
       - 标签1
       - 标签2
        
  handlers: 
    - name: 任务名  #和notify中的任务名相同
      模块名: 模块参数

#无注释版
---
- name: 
  hosts: 
  remote_user:
  grather_facts: ture|fales 
  vars:
    - 变量1: 值1
    - 变量2: 值2
  tasks:
    - name:
      模块名: 模块参数        
      ignore errors: true
    - name:
      模块名:
      notify: 任务名
     - name:
       模块名:
       when:
     - name:
       模块名: 模块参数={{item}}
       with_items:
  handlers: 
    - name: 任务名
      模块名: 模块参数

4、语句的横向/纵向写法

task任务的模块语法格式
横向格式:
模块名: 参数1=值 参数2={{变量名}} ...

纵向格式:
模块名:
  参数1: 值
  参数2: "{{变量名}}"
  ...
  
with_items 和 vars 的语法格式
横向格式:
with_items: ["值1", "值2", "值3", ...]

值为对象(键值对字段)时:
with_items:
- {key1: "值1", key2: "值2"}
- {key1: "值3", key2: "值4"}
...

纵向格式:
with_items:
- 值1
- 值2
- 值3
...

值为对象(键值对字段)时:
with_items:
- key1: "值1"
  key2: "值2"
- key1: "值3"
  key2: "值4"
...

二、playbook模版实例:

1、playbook模版:

ansible-playbook test1.yml
执行脚本

ansible-playbook test1.yml --start-at-task='install httpd'
从指定任务模块开始执行

ansible-playbook test1.yml --syntax-check
检查yml文件的语法是否正确

ansible-playbook test1.yml --list-task
检查有多少tasks任务

ansible-playbook test1.yml --list-hosts
检查在哪台主机生效

若要切换用户,比如从koeda切换到root用户

71行要取消注释

hosts中:

改过用户,运行时的命令

ansible-playbook test1.yml -K(大K)

-K:输入密码

若脚本中没有指定用户,可以命令指定:

ansible-playbook test1.yml -u root -k(小k)

模版实例2:

#this is second
#声明和引用变量,以及外部传参
- hosts: 192.168.10.201
  remote_user: root
  vars:
    groupname: guoqi
    username: wangdefu
  tasks:
   - name: create group
     group:
        name: "{{ groupname }}"
        system: yes
        gid: 111
   - name: create user
     user:
       name: "{{ username }}"
       uid: 1011
       group: "{{ groupname }}"
       shell: /sbin/nologin
   - name: copy file
     copy:
       content: "{{ hostvars[inventory_hostname]['ansible_default_ipv4']['address']}}"
       dest: /opt/ky32.txt
#获取目标的ip地址,然后复制到目标文件

vars:
    groupname: koeda
    username: koeda
字典方式:key-value
"{{ hostvars[inventory_hostname]['ansible_default_ipv4']['address']}}"
包含所有主机变量的字典
inventory_hostname:目标主机的主机名
ansible_default_ipv4:获取目标主机的IP地址

也可以里面不指定变量参数,外部传参:

ansible-playbook test2.yaml -e 'username=koeda groupname=koeda'

2、playbook的条件判断:

when 是一个比较常见的应用场景,实现满足条件即执行,不满足条件即跳过的任务

when是满足条件即执行,不满足不执行

- hosts: all

  remote_user: root

  tasks:

   - name: nginx when

     yum: name=nginx

     when: ansible_default_ipv4.address == '20.0.0.25'

   - name: nginx info

     debug:

       msg: "安装nginx"

     when: ansible_default_ipv4.address == '20.0.0.25'

   - name: httpd when

     yum: name=httpd

     when: ansible_default_ipv4.address == '20.0.0.26'

   - name: httpd info

     debug:

       msg: "安装httpd"

     when: ansible_default_ipv4.address == '20.0.0.26'

3、playbook中的循环:

四种循环方式:

with_items 最常用的

with_list 列表分组循环

with_together 列表对应的列中,以数据结合的方式循环

with_nested 相当于双层循环,第一层定义了循环的次数,第二层表示第一层中的每个元素会循环几次

ansible有多中循环格式:

with_items 循环遍历

- hosts: 20.0.0.25
  remote_user: root
  gather_facts: false
  tasks:
   - debug:
       msg: "{{ item }}"
     with_items: [a,b,c,d]

- hosts: 20.0.0.25
  remote_user: root
  gather_facts: false
  tasks:
   - debug:
       msg: "{{ item }}"
     with_items:
      - [a,b,c,d]
      - [1,2,3,4]

with_list:列表输出

- hosts: 20.0.0.25
  remote_user: root
  gather_facts: false
  tasks:
   - debug:
       msg: "{{item}}"
     with_list:
      - [a,b,c]
      - [1,2,3]

练习:

- hosts: 20.0.0.25
  remote_user: root
  gather_facts: false
  tasks:
   - name: create
     file:
       path: "{{item}}"
       state: touch
     with_items:
      - /opt/a
      - /opt/b
      - /opt/1
      - /opt/2

with_together:组合输出

组循环,列表中的值,一一对应打印出来

- hosts: 20.0.0.25
  remote_user: root
  gather_facts: false
  tasks:
   - debug:
       msg: "{{item}}"
     with_together:
      - [a,b,c]
      - [1,2,3]
      - [A,B]

循环嵌套:

- hosts: 20.0.0.25
  remote_user: root
  gather_facts: false
  tasks:
   - debug:
       msg: "{{item}}"
     with_nested:
      - [a,b,c]
      - [1,2,3]

4、循环练习:

创建用户test1、test2,用户组分别为dn1、dn2

- name: play1
  hosts: 20.0.0.25
  gather_facts: false
  tasks:
   - name: create group
     group:
       name: "{{ item }}"
       state: present
     with_items:
       - 'dn1'
       - 'dn2'
   - name: create user
     user:
       name: "{{ item.name }}"
       state: present
       groups: "{{ item.groups }}"
     with_items:
       - {name: 'test1', groups: 'dn1'}
       - {name: 'test2', groups: 'dn2'}

yum 一键安装多个软件  tree sl nginx httpd vsftpd dhcp

- name: play2
  hosts: 20.0.0.25
  gather_facts: false
  tasks:
   - name: create tree sl nginx httpd vsftpd dhcp
     yum:
       name: "{{ item }}"
     with_list:
       - tree
       - sl
       - nginx
       - httpd
       - vsftpd
       - dhcp

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

优维科技荣获第二届中国赛宝信息技术应用创新优秀解决方案三等奖

近日&#xff0c;“第二届中国赛宝信息技术应用创新优秀解决方案”评选活动圆满结束。优维科技所提交的《Hyperlnsight超融合持续观测解决方案》、《EasyOps一体化运维平台》从全国近300份申报方案中脱颖而出&#xff0c;荣获2023中国赛宝信息技术应用创新优秀解决方案奖。 本…

【操作系统】什么是进程?

文章目录 进程进程的属性进程的状态挂起 进程 进程是一个可并发执行的具有独立功能的程序关于某个数据集合的执行过程&#xff0c;也是操作系统进行资源分配和保护的基本单位。 进程的属性 结构性&#xff1a; 共享性&#xff1a;同一程序运行于不同数据集合上构成不同的进程…

C++用哈希表封装unordered_set和unordered_map

目录 前言 一、修改kv模型为data模型 1.添加MyUnorderedSet.h和MyUnorderedMap.h 2.修改HashNode 3.修改HashTable 二、普通迭代器 三、const迭代器 四、unordered_map重载operator[] 总结 前言 在上一篇文章中&#xff0c;我们手写了一份哈希表&am…

【图神经网络】在节点分类任务中无特征节点的特征表示

无特征节点的特征表示 节点度数degree pagerank 以pagerank起源的应用场景为例&#xff0c;不是所有的网站都是同等重要的&#xff0c;所以需要根据结构信息对节点进行排序。 直觉上&#xff0c;如果一个网站它有很多链接&#xff0c;它就很重要&#xff0c;举例来说&#…

Java版企业电子招标采购系统源码—鸿鹄电子招投标系统-企业战略布局下的采购寻源

项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&#xff0c;以及审…

C# WPF上位机开发(业务主流程才是核心)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】前面我们说了很多的c# wpf编程技术,里面有控件,有绘图,有数据库,有多线程等技术。但是他们都属于实现的部分,没有和具体的行业进行挂钩,相当于是通用技术部分。这个通用部分一般通过书…

【深度学习】序列生成模型(五):评价方法计算实例:计算BLEU-N得分【理论到程序】

文章目录 一、BLEU-N得分&#xff08;Bilingual Evaluation Understudy&#xff09;1. 定义2. 计算N1N2BLEU-N 得分 3. 程序 给定一个生成序列“The cat sat on the mat”和两个参考序列“The cat is on the mat”“The bird sat on the bush”分别计算BLEU-N和ROUGE-N得分(N1或…

Dubbo面试题及答案,持续更新

在准备Dubbo相关的面试题时&#xff0c;我发现网络上的资源往往缺乏深度和全面性。为了帮助广大Java程序员更好地准备面试&#xff0c;我花费了大量时间进行研究和整理&#xff0c;形成了这套Dubbo面试题大全。 这套题库不仅包含了一系列经典的Dubbo面试题及其详尽答案&#x…

语音识别与人机交互:发展历程、挑战与未来前景

导言 语音识别技术作为人机交互领域的重要组成部分&#xff0c;近年来取得了巨大的发展。本文将深入研究语音识别与人机交互的发展历程、遇到的问题、解决过程、未来的可用范围&#xff0c;以及在各国的应用和未来的研究趋势。我们将探讨在这个领域&#xff0c;哪一方能取得竞争…

CCF编程能力等级认证GESP—C++6级—20230923

CCF编程能力等级认证GESP—C6级—20230923 单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09;判断题&#xff08;每题 2 分&#xff0c;共 20 分&#xff09;编程题 (每题 25 分&#xff0c;共 50 分)小杨买饮料小杨的握手问题 答案及解析单选题判断题编程题1编程题…

微信小程序-选择和分割打开地图选择位置的信息

一、 前言 废话不多说&#xff0c;单刀直入。 本文要实现的功能是微信小程序中打开地图选择位置&#xff0c;以及将返回的位置信息分割。 例如返回的位置信息是&#xff1a;广东省深圳市龙岗区xxxxx小区 分割后变成&#xff1a; {province: "广东省",city: "深…

【蓝桥杯】专题练习

前缀和 3956. 截断数组 - AcWing题库 一看到题目很容易想到的思路是对数组求前缀和&#xff0c;然后枚举两个分段点就好&#xff0c;时间复杂度是On^2&#xff0c;n是1e5会t&#xff0c;需要优化。 朴素的代码&#xff0c;会超时&#xff1a; #include <bits/stdc.h> u…

文件包含 [SWPUCTF 2021 新生赛]include

打开题目 要求我们传入一个file进去&#xff0c;那我们get传入 /?file1 得到源码&#xff0c;并且提示我们flag在flag,php下 在源代码中&#xff0c;我们看见了allow_url_include函数&#xff0c;我们知道这涉及到文件包含。 一般默认allow_url_fopen是on的&#xff0c;那在…

IDEA版SSM入门到实战(Maven+MyBatis+Spring+SpringMVC) -Spring的AOP前奏

第一章 AOP前奏 1.1 代理模式 代理模式&#xff1a;我们需要做一件事情&#xff0c;又不期望自己亲力亲为&#xff0c;此时&#xff0c;可以找一个代理【中介】 我们【目标对象】与中介【代理对象】不能相互转换&#xff0c;因为是“兄弟”关系 1.2 为什么需要代理【程序中…

使用C语言实现文件的拷贝——底层内存分析

使用C语言实现文件的拷贝 本文主要涉及sprintf&#xff08;&#xff09;函数的讲解以及系统IO与标准IO的区别和一个实例使用C语言实现文件的拷贝&#xff0c;在最后还深度刨析了文件拷贝的底层原理。 文章目录 使用C语言实现文件的拷贝一、 sprintf()函数1.1 sprintf ()函数的参…

设计测试用例(万能思路 + 六种设计用例方法)(详细 + 图解 + 实例)

一、设计测试用例的万能思路 针对某个物品/功能进行测试。 万能思路&#xff1a;功能测设 界面测试 性能测试 兼容性测试 易用性测试 安全测试。 总结&#xff1a; 功能测试&#xff1a; 水杯&#xff1a;装水、喝水... 注册场景&#xff1a;注册 登录 想象日常使用…

2017年第六届数学建模国际赛小美赛A题飓风与全球变暖解题全过程文档及程序

2017年第六届数学建模国际赛小美赛 A题 飓风与全球变暖 原题再现&#xff1a; 飓风&#xff08;也包括在西北太平洋被称为“台风”的风暴以及在印度洋和西南太平洋被称为“严重热带气旋”&#xff09;具有极大的破坏性&#xff0c;往往造成数百人甚至数千人死亡。   许多气…

【Spring Security】打造安全无忧的Web应用--入门篇

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Spring Security的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.Spring Security是什么 1.概…

FFmepeg——视频处理工具安装以及简单命令学习。

FFmpeg 是一个免费、开源且高度可定制的多媒体处理工具&#xff0c;它是一个强大的跨平台框架&#xff0c;用于处理音频、视频、多媒体流和图像。FFmpeg 的主要功能包括解码、编码、转码、流处理、多路复用、分离、合并、过滤等&#xff0c;支持多种音视频格式&#xff0c;包括…

研发管理-代码管理篇

前言&#xff1a; 工作了这些年&#xff0c;工作了三家公司&#xff0c;也用过主流的代码管理平台&#xff0c;比如SVN&#xff0c;git系列&#xff08;gitlib,gitee&#xff09;,各有优点&#xff0c;我个人比较喜欢SVN&#xff0c;多人协作的代码管理难免会有代码冲突&#…