2.playbook剧本

news2024/11/16 13:32:43

文章目录

  • playbook剧本
    • 创建剧本
    • 运行剧本
    • 定义和引用变量
    • 指定远程主机sudo切换用户
    • when条件判断
    • 剧本格式
    • 迭代
      • with_items
      • with_list
      • with_flattened
      • with_together
      • with_cartesian
      • with_nested
    • Templates模块
    • tags模块

playbook剧本

  • playbooks 本身由以下各部分组成
    1. Tasks:任务,即通过 task 调用 ansible 的模板将多个操作组织在一个 playbook 中运行
    2. Variables:变量
    3. Templates:模板
    4. Handlers:处理器,当changed状态条件满足时,(notify)触发执行的操作
    5. Roles:角色

创建剧本

##示例:
vim test1.yaml


---     #yaml文件以---开头,以表明这是一个yaml文件,可省略

- name: first play       #定义一个play的名称,可省略
  gather_facts: false    #设置不进行facts信息收集,这可以加快执行速度,可省略
  hosts: webservers      #指定要执行任务的被管理主机组,如多个主机组用冒号分隔
  remote_user: root      #指定被管理主机上执行任务的用户
  tasks:                 #定义任务列表,任务列表中的各任务按次序逐个在hosts中指定的主机上执行
   - name: test connection    #自定义任务名称
     ping:               #使用 module: [options] 格式来定义一个任务
   - name: disable selinux
     command: '/sbin/setenforce 0'    #command模块和shell模块无需使用key=value格式
    
    ignore_errors: True          
#如执行命令的返回值不为0,就会报错,tasks停止,可使用 ignore_errors 忽略失败的任务

   - name: disable firewalld
   
     service: name=firewalld state=stopped   
     #使用 module: options 格式来定义任务,option使用key=value格式
     
   - name: install httpd
     yum: name=httpd state=latest
   - name: install configuration file for httpd
     copy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf    
     #这里需要一个事先准备好的/opt/httpd.conf文件
     
     notify: "restart httpd"    
     #如以上操作后为changed的状态时,会通过notify指定的名称触发对应名称的handlers操作
     
   - name: start httpd service
     service: enabled=true name=httpd state=started
   
#handlers中定义的就是任务,此处handlers中的任务使用的是service模块
  handlers:    
   - name: restart httpd         #notify和handlers中任务的名称必须一致
     service: name=httpd state=restarted
     
     
##Ansible在执行完某个任务之后并不会立即去执行对应的handler,而是在当前play中所有普通任务都执行完后再去执行handler,这样的好处是可以多次触发notify,但最后只执行一次对应的handler,从而避免多次重启。
##创建安装apache服务的剧本

vim demo1.yaml
- name: the first play for install apache
  gather_facts: false
  hosts: dbservers
  remote_user: root
  tasks:
  - name: disable firewalld
    service: name=firewalld state=stopped enabled=no
  - name: disable selinux
    command: '/usr/sbin/setenforce 0'
    ignore_errors: true
  - name: disable selinux forever
    replace: path=/etc/selinux/config regexp='enforcing' replace='disabled'
  - name: mount cdrom
    mount: src=/dev/sr0 path=/mnt fstype=iso9660 state=mounted 
  - name: install apache
    yum: name=httpd state=latest
  - name: prepare httpd configuration file
    copy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf
    notify: "reload httpd"
  - name: start httpd
    service: name=httpd state=started enabled=yes
  handlers:
  - name: reload httpd
    service: name=httpd state=reloaded    
##执行playbook剧本

ansible-playbook demo1.yaml

在这里插入图片描述

运行剧本

-k(–ask-pass):用来交互输入ssh密码

-K(-ask-become-pass):用来交互输入sudo密码

-u:指定用户

ansible-playbook demo1.yaml --syntax-check    
#检查yaml文件的语法是否正确

ansible-playbook demo1.yaml --list-task       
#检查tasks任务

ansible-playbook demo1.yaml --list-hosts     
#检查生效的主机

ansible-playbook demo1.yaml --start-at-task='install httpd'   
#指定从某个task开始运行

在这里插入图片描述

定义和引用变量

vim demo2.yaml
- name: second play
  hosts: dbservers
  reomte_user: root
  vars:
  - username: zhangsan
  - groupname: abc
  - filename: /opt/123.txt
  - uid: 9527
  gather_facts: true
  tasks:
  - name: create group
    group: name={{groupname}} gid=2800
  - name: create user join group
    user: name={{usernsme}} uid={{uid}} groups={{groupname}}
  - name: copy file
    copy: content="{{ansible_default_ipv4.address}}" dest={{filename}}
  - name: modify username and groupname of file
    file: path={{filename}} owner={{username}} group={{groupname}}

在这里插入图片描述

##运行playbook剧本

ansible-playbook demo2.yaml

在这里插入图片描述

###也可以在命令行中定义变量

ansible-playbook demo2.yaml -e "username=lisi" -e "groupname=nba" -e "filename=/opt/456.txt" -e "uid=9528"

指定远程主机sudo切换用户

##修改 ssh配置文件,禁止  root  用户直接登陆

vim /etc/ssh/sshd_config

#PermitRootLogin yes
##将这个配置项设置为no,就能够禁止root用户登陆

在这里插入图片描述

###设置用户密码

echo 123 | passwd --stdin zhangsan
###给登陆用户提权

vim /etc/sudoers

#添加

zhangsan ALL=ALL

在这里插入图片描述

##修改剧本文件

vim demo2.yaml
- name: second play
  hosts: dbservers
  remote_user: zhangsan
  become: yes             #2.6版本以后的参数,之前是sudo,意思为是否切换用户运行,就是是否提权
  become_user: root               #指定sudo用户为root
  vars:
  - username: zhangsan
  - groupname: abc
  - filename: /opt/123.txt
  - uid: 9527
  gather_facts: true
  tasks:
  - name: create group
    group: name={{groupname}} gid=2800
  - name: create user join group
    user: name={{username}} uid={{uid}} groups={{groupname}}
  - name: copy file
    copy: content="{{ansible_default_ipv4.address}}" dest={{filename}}
  - name: modify username and groupname of file
    file: path={{filename}} owner={{username}} group={{groupname}}

在这里插入图片描述

##运行剧本文件

ansible-playbook demo2.yaml -e "username=lisi" -e "groupname=nba" -e "filename=/opt/456.txt" -e "uid=9528" -k -K

SSH password:               ##输入SSH密码,但这里是配置文件中登陆的用户的密码

在这里插入图片描述

when条件判断

  • 在Ansible中,提供的唯一一个通用的条件判断是when指令,当when指令的值为true时,则该任务执行,否则不执行该任务
- name: third play
  hosts: all
  remote_user: root
  tasks:
  - name: touch file
    file: path=/opt/789.txt state=touch
    when: ansible_default_ipv4.address != "192.168.242.68"
    #when: inventory_hostname == "192.168.242.68"

在这里插入图片描述
在这里插入图片描述

剧本格式

- name: fouth play
  hosts: dbservers
  remote_user: root
  vars:
    myfile:
    - /opt/a
    - /opt/b
    - /opt/c
    - /opt/d
  tasks:
  - name: touch directory
    with_items: "{{myfile}}"
    file: path={{item}} state=directory

  - name: touch file
    with_items:
    - /root/a
    - /root/b
    - /root/c
    - /root/d
    file:
      path: "{{item}}"
      state: touch
task任务 模块语法格式:
横向格式:
模块名: 参数选项1=值  参数选项2={{变量名}}  ...

纵向格式:
模块名:
  参数选项1: 值
  参数选项2: "{{变量名}}"

迭代

with_items

with_items 和 变量 的语法格式
横向格式:
with_items: ["值1", "值2", "值3"]

值为对象(键值对字段)时:
with_items:
- {key1: value1, key2: value2, ...}
- {key1: value3, key2: value4, ...}

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

值为对象(键值对字段)时:
with_items:
- key1: value1
  key2: value2
- key1: value3
  key2: value4
- name: fifth play
  hosts: dbservers
  remote_user: root
  tasks:
  - name: touch file
    with_items:
    - {filename: /opt/a, username: zhangsan, groupname: nba}
    - {filename: /opt/b, username: lisi, groupname: abc}
    file: path={{item.filename}}  owner={{item.username}} group={{item.groupname}} state=touch

  - name: create dir
    with_items:
    - filename: /opt/cd
      username: zhangsan
      groupname: nba
    - filename: /opt/ef
      username: lisi
      groupname: abc
    file:
      path: "{{item.filename}}"
      owner: "{{item.username}}"
      group: "{{item.groupname}}"
      state: directory

在这里插入图片描述

with_list

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

在这里插入图片描述

with_flattened

- hosts: dbservers
  remote_user: root
  gather_facts: no
  tasks:
  - debug:
      msg: "{{item}}"
    with_flattened:
    - [ 1, 2, 3 ]
    - [ a, b ]

在这里插入图片描述

  • with_list、with_items、with_flattened之间的区别:
    • 在处理简单的单层列表时,他们没有区别,
    • 但是当处理嵌套的多层列表时,with_items与with_flattened会将嵌套列表”拉平展开”,循环的处理每个元素,
    • 而with_list只会处理最外层的列表,将最外层的列表中的每一项循环处理,loop可以替代with_list。

with_together

- hosts: dbservers
  remote_user: root
  gather_facts: no
  tasks:
  - debug:
      msg: "{{item}}"
    with_together:
    - [ 1, 2, 3 ]
    - [ a, b, c ]

在这里插入图片描述

  • with_together可以将两个列表中的元素”对齐合并”:
    • 第一个小列表中的第1个值会与第二个小列表中的第1个值合并在一起输出,
    • 第一个小列表中的第2个值会与第二个小列表中的第2个值合并在一起输出,
    • 第一个小列表中的第3个值会与第二个小列表中的第3个值合并在一起输出,如果第二个小列表中的第3个元素没有值则输出null

with_cartesian

- hosts: dbservers
  remote_user: root
  gather_facts: no
  tasks:
  - debug:
      msg: "{{item}}"
    with_cartesian:
    - [ a, b, c ]
    - [ test1, test2 ]
  • with_cartesian的作用就是将每个小列表中的元素按照两两组合循环的处理每个组合,比如第一个小列表中的每个元素与第二个小列表中的每个元素都两两组合在了一起。
    在这里插入图片描述

with_nested

- hosts: dbservers
  remote_user: root
  gather_facts: no
  vars:
    test:
      - a
      - b
      - c  
    demo:
      - test1 
      - test2
  tasks:
  - debug:
      msg: "{{ item[0] }},{{ item[1] }}" 
    with_nested:             
    - "{{test}}"
    - "{{demo}}"

在这里插入图片描述

Templates模块

  • Jinja是基于Python的模板引擎。Template类是Jinja的一个重要组件,可以看作是一个编译过的模板文件,用来产生目标文本,传递Python的变量给模板去替换模板中的标记。
vim httpd.conf.j2


就是复制httpd配置文件,进行修改,创建模板文件

Listen {{ip_port}}
ServerName {{host_name}}
DocumentRoot "{{root_dir}}"
vim demo6.yaml
- name: sixth play
  hosts: all
  remote_user: root
  vars:
  - pkg: httpd

  tasks:
  - name: install apache
    yum: name=httpd state=latest
  - name: create root dir
    file: state=directory path={{item}}
    with_items:
    - /var/www/html/accp
    - /var/www/html/benet
  - name: create index.html in www.accp.com
    copy: content="<h1>this is accp web</h1>" dest=/var/www/html/accp/index.html
    when: ansible_default_ipv4.address == "192.168.242.67"
  - name: create index.html in www.benet.com
    copy: content="<h1>this is benet web</h1>" dest=/var/www/html/benet/index.html
    when: inventory_hostname == "192.168.242.68"
  - name: prepare configuration file
    template: src=/etc/ansible/playbook/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
    notify: "reload apache"
  - name: start apache
    service: name={{pkg}} state=started enabled=yes

  handlers:
  - name: reload apache
    service: name={{pkg}} state=reloaded  

在这里插入图片描述
在这里插入图片描述

tags模块

  • 可以在一个playbook中为某个或某些任务定义“标签”,在执行此playbook时通过ansible-playbook命令使用–tags选项能实现仅运行指定的tasks。
  • playbook还提供了一个特殊的tags为always。作用就是当使用always作为tags的task时,无论执行哪一个tags时,定义有always的tags都会执行。
- name: seventh play
  hosts: dbservers
  remote_user: root
  tasks:
  - name: create abc.txt
    file: path=/opt/abc.txt  state=touch
    tags:
    - zhangsan
    - lisi

  - name: create 123.txt
    file: path=/opt/123.txt  state=touch
    tags:
    - always

  - name: create 456.txt
    copy: content="123456789"  dest=/opt/456.txt
    tags:
    - zhangsan

在这里插入图片描述

##运行

ansible-playbook demo7.yaml --tags="zhangsan"

在这里插入图片描述

ansible-playbook demo7.yaml --tags="lisi"

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

基于javeSprict的WebAPI详解

一、前言 作为后端开发&#xff0c;前端其实只需要了解一些就可以了&#xff0c;不需要了解多么深入。在前面我们已经学习了ECMAScript:的基础语法部分&#xff0c;还有DOM API和BOM API需要学习。 DOM API主要负责操作页面结构。 所有的WebAPI可以参考下面这个网址里面的信息…

高清视频制作GIF怎么操作?一个工具在线完成视频转GIF

一段视频为了方便传输分享想要做成GIF动画的时候要怎么操作呢&#xff1f;很简单&#xff0c;只需要一款专业的GIF在线制作工具-GIF中文网&#xff0c;使用视频转GIF&#xff08;https://www.gif.cn/&#xff09;功能&#xff0c;上新MP4格式视频&#xff0c;能够快速制作1分钟…

arm neon/fpu/mfloat

neon官网介绍: Arm Neon technology is an advanced Single Instruction Multiple Data (SIMD) architecture extension for the A-profile and R-profile processors. Neon technology is a packed SIMD architecture. Neon registers are considered as vectors of elements …

【达哥讲网络】第3集:数据交换的垫基石——二层交换原理

专业的网络工程师在进行网络设计时&#xff0c;会事先规划好不同业务数据的转发路径&#xff0c;一方面是为了满足用户应用需求&#xff0c;另一方面是为了提高数据转发效率、充分利用各设备/各链路的硬件或带宽资源。在进行网络故障排除时&#xff0c;理顺各路数据的转发路径也…

Android 开发代码规范

一. AndroidStudio开发工具规范 使用最新的稳定版本.统一文件的编码格式为utf-8. 清除每个类里面的无效的import导包.代码样式统一,比如&#xff0c;tab缩进4个空格&#xff0c;或者 tab size等如果没有特殊情况使用默认的配置即可。每行字数每行字符数不得超过 160 字符&…

C++笔记之++i和i++是原子操作吗?

C笔记之i和i是原子操作吗&#xff1f; code review! 文章目录 C笔记之i和i是原子操作吗&#xff1f;1.i是原子操作吗&#xff1f;2.i是原子操作吗&#xff1f;3.前置递增和后置递增 1.i是原子操作吗&#xff1f; 2.i是原子操作吗&#xff1f; 3.前置递增和后置递增

绝美!轮到AI写真爆火了!18种AI视频制作教程;Llama 2微调的极速指南;Nijijourney官方AI绘画课 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 摄影写真面临AI技术洗牌&#xff0c;一键生成杂志大片的时代来了 软件&#xff1a;midjourney & Stable Diffusion 模型&#xff…

Appium+python自动化(三十四)- 有图有真相,很美很精彩 - 屏幕截图和Android APP类型简介

简介 在实际自动化项目运行过程中&#xff0c;很多时候App可以会出现各种异常&#xff0c;为了更好的定位问题&#xff0c;除了捕捉日志我们还需要对运行时的设备状态来进行截屏。从而达到一种“有图有真相”的效果。 截图方法 方法1 save_screenshot() 该方法直接保存当前…

传统计算机视觉

传统计算机视觉 计算机视觉难点图像分割基于主动轮廓的图像分割基于水平集的图像分割交互式图像分割基于模型的运动分割 目标跟踪基于光流的点目标跟踪基于均值漂移的块目标跟踪基于粒子滤波的目标跟踪基于核相关滤波的目标跟踪 目标检测一般目标检测识别之特征一般目标检测识别…

【深度学习】生成对抗网络Generative Adversarial Nets

序言 本文是GAN网络的原始论文&#xff0c;发表于2014年&#xff0c;我们知道&#xff0c;对抗网络是深度学习中&#xff0c;CNN基础上的一大进步&#xff1b; 它最大的好处是&#xff0c;让网络摆脱训练成“死模型”到固定场所处去应用&#xff0c;而是对于变化的场景&#xf…

【小梦C嘎嘎——启航篇】类和对象(上篇)

【小梦C嘎嘎——启航篇】类和对象&#xff08;上篇&#xff09;&#x1f60e; 前言&#x1f64c;什么是面向过程&#xff1f;什么是面向对象&#xff1f;什么是类和对象类中的访问权限属性类的大小计算this 指针构造函数析构函数 总结撒花&#x1f49e; &#x1f60e;博客昵称&…

自动化测试——APP测试

一、环境配置 1、安装jdk 配置环境变量 2、Android SDK 环境安装 3、Appium Server安装 4、模拟器安装 5、安装appium-python-client Python第三方库 二、APP自动化测试原理 三、Desired Capabilites——APPium自动化配置项 1、设置参数 2、操作系统 3、选择版本 4、设备名称…

LeetCode 1857. Largest Color Value in a Directed Graph【拓扑排序,动态规划】困难

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

【LeetCode】148.排序链表

题目 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [4,2,1,3] 输出&#xff1a;[1,2,3,4]示例 2&#xff1a; 输入&#xff1a;head [-1,5,3,4,0] 输出&#xff1a;[-1,0,3,4,5]示例 3&#xff1…

Go 下载安装教程

1. 下载地址&#xff1a;The Go Programming Language (google.cn) 2. 下载安装包 3. 安装 &#xff08;1&#xff09;下一步 &#xff08;2&#xff09;同意 &#xff08;3&#xff09;修改安装路径&#xff0c;如果不修改&#xff0c;直接下一步 更改后&#xff0c;点击下一…

软件测试/测试开发丨Selenium环境安装与使用

Selenium 官方网站&#xff1a; www.selenium.dev/ 简介&#xff1a; 用于web浏览器测试的工具&#xff1b;支持的浏览器包括IE&#xff0c;Firefox&#xff0c;Safari&#xff0c;Chrome&#xff0c;Edge等&#xff1b;使用简单&#xff0c;可使用Java&#xff0c;Python等…

InnoDB引擎底层逻辑讲解——逻辑存储结构

逻辑存储结构架构事务原理MVCC 1.逻辑存储结构 InnoDB逻辑存储结构图 mysql数据文件存储位置(linux系统) cd /var/lib/mysql一个mysql实例中有多个表空间&#xff0c;我们切换到某一个特定的数据库如itcast数据库&#xff0c;每个ibd文件都是一个表空间&#xff0c; cd it…

使用pikachu管理工具下的XSS后台进行实战

写在前面的重要提示&#xff1a; Attention&#xff1a;技术没有好坏之分&#xff0c;关键在于使用技术的人或组织。网络安全技术是一把双刃剑 – 作为网络安全人&#xff0c;虽然无法控制头上的帽子是否会变绿&#xff0c;但能控制不让它变黑&#xff1b;无论我们在物质上面对…

Cilium 系列-7-Cilium 的 NodePort 实现从 SNAT 改为 DSR

系列文章 Cilium 系列文章 前言 将 Kubernetes 的 CNI 从其他组件切换为 Cilium, 已经可以有效地提升网络的性能。但是通过对 Cilium 不同模式的切换/功能的启用&#xff0c;可以进一步提升 Cilium 的网络性能。具体调优项包括不限于&#xff1a; 启用本地路由 (Native Rou…

精读《自由布局吸附线的实现》

目录 判断 box 离哪条边最近 产生吸附效果 resize 时中间对齐线需要放大双倍吸附力 总结 自由布局吸附线的效果如下图所示&#xff1a; 那么如何实现吸附线呢&#xff1f;我们先归纳一下吸附线的特征&#xff1a; 正在拖动的 box 与其他 box 在水平或垂直位置距离接近时&am…