ansible playbook的使用

2023-10-27

一、playbook的使用

1.ansible的playbook与临时命令

​ 临时命令可以对一组目标主机进行一项简单的任务。要发挥ansible的真正力量,还需要了解如何使用playbook轻松的对一组目标主机执行多项复杂的任务

​ playbook是一个文本文件,其中包含由一个或多个按特定顺序运行的play组成的列表

​ Play可以将一系列冗长而复杂的手动管理任务转变为可轻松重复的例程,并且具有可预测的成功成果。在playbook中,可以将play内的任务序列保存为人类可读并可立即运行的形式。根据任务的编写方式,任务本身记录了部署应用或基础架构所需的步骤

2.临时命令改写为playbook

​ 之前所熟知的ansible临时命令都可以使用playbook来编写

​ 下面我们举一个例子,看看这条命令在playbook中如何编写

[root@ansible ~]# ansible all -m user -a 'name=tongxue uid=4999 state=present'

​ 这个命令用playbook应该这样写:

[root@ansible ~]# vim user.yml
[root@ansible ~]# cat user.yml
---
- name: create user
  hosts: all
  tasks:
    - name: create user tongxue uid 4999
      user: 
        name: tongxue
        uid: 4999
        state: present
[root@ansible ~]#

​ Playbook是以YAML格式编写的文本文件,通常以.yml结尾。Playbook使用空格字符缩进来表示其数据结构。YAML对用于缩进的空格数量没有严格的要求,但有两个基本的规则:

  • 处于层次结构中同一级别的数据元素(例如同一列表中的项目)必须具有相同的缩进量。

  • 如果项目属于其他项目的子项,其缩进量必须大于父项

    不过我们在编写playbook时,通常以2的倍数来进行缩进子项的缩进比它的父项的缩进要多两个,这样做更加的易读

​ playbook的开头一行由三个—(—)来进行分隔,这是文档开头的标记。其中的每个项目用一个—(-)来开头,所以playbook编写的格式如下:

---
- name1: name
  hosts: 1.1.1.1
  tasks: 
    - tasks1
    - tasks2
- name2
  hosts: 2.2.2.2
  tasks: 
    - tasks3
    - tasks4
- name3
  hosts: 3.3.3.3
  tasks: 
    - tasks5
    - tasks6

其中tasks是按顺序实际列出要在受管主机上运行的任务。列表中各项任务本身是一个键值对集合。

以上面创建用户的playbook为例,play中唯一任务有两个键:

  • name是记录任务用途的可选标签。最好命名所有的任务,从而帮助记录自动流程中的每一步用途。
  • user是要为这个任务运行的模块。其参数作为一组键值对传递,它们是模块的子项(name、uid和state)。

下面再来看一个含有多项任务的tasks属性案例:

---
- name: test
  hosts: all
  tasks:
    - name: create user tongxue uid 4999
      user:
        name: tongxue
        uid: 4999
        state: present
    - name: web server is enable
      service:
        name: httpd
        enabled: yes
        
    - name: ntp server is enable
      service:
        name: chronyd
        enabled: yes
        
    - name: vsftpd server is enable
      service:
        name: vsftpd
        enabled: yes

​ playbook中play和任务列出的顺序很重要,因为Ansible会按照相同的顺序运行它们

3.运行playbook

​ absible-playbook命令可用于运行playbook。该命令在控制节点上执行,要运行的playbook的名称则作为参数

[root@ansible ~]# ansible-playbook test.yml

以下示例中显示了一个简单的playbook的内容,后面是运行它的结果

[root@ansible ~]# cat test.yml 
---
- name: setup web server
  hosts: 192.168.10.201
  tasks:
    - name: install httpd
      yum: 
        name: httpd
        state: latest

    - name: service is enabled
      service:
        name: httpd
        state: started
        enabled: yes
[root@ansible ~]# ansible-playbook test.yml 

PLAY [setup web server] **********************************************************************************
TASK [Gathering Facts] ***********************************************************************************ok: [192.168.10.201]

TASK [install httpd] *************************************************************************************ok: [192.168.10.201]

TASK [service is enabled] ********************************************************************************changed: [192.168.10.201]

PLAY RECAP ***********************************************************************************************192.168.10.201             : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[root@ansible ~]#

​ 请注意,在playbook运行时,屏幕中会显示每个play和任务的name键的值。(Gathering Facts任务是一项特别的任务,setup模块通常在play启动时自动运行这项任务。)对于含有多个play和任务的playbook,设置name属性后可以更加轻松地监控playbook执行的进展。

​ 通常而言,Ansible Playbook中的任务是幂等的,而且能够安全地多次运行playbook。如果目标受管主机已处于正确的状态,则不应进行任何更改。如果再次运行这个playbook,所有任务都会以状态OK传递,且不报告任何更改。

4.提高输出的详细程度

​ ansible-playbook命令提供的默认输出不提供详细的任务执行信息。ansible-playbook -v命令提供了额外的信息,总共有四个级别

配置Playbook执行的输出详细程序

选项 描述
-v 显示任务结果
-vv 任务结果和任务配置都会显示
-vvv 包含关于与受管主机连接的信息
-vvvv 增加了连接插件相关的额外详细程序选项,包括受管主机上用于执行脚本的用户以及所执行的脚本

5.语法验证

​ 在执行playbook之前,最好要进行验证,确保其内容的语法正确无误。ansible-playbook命令提供了一个–syntax-check选项,可用于验证playbook的语法。

下面是一个playbook的成功验证:

[root@ansible ~]# ansible-playbook --syntax-check test.yml 

playbook: test.yml
[root@ansible ~]#

下面是一个playbook的验证失败:

[root@ansible ~]# ansible-playbook --syntax-check test.yml 
ERROR! conflicting action statements: service, enabled

The error appears to be in '/root/test.yml': line 10, column 7, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:


    - name: service is enabled
      ^ here
[root@ansible ~]#

6.执行空运行

​ 可以使用-C来对playbook进行空运行。这会使Ansible报告在执行该playbook时将会发生什么更改,但不会对受管主机进行任何实际的更改

注意加入该参数不会对受管主机进行任何的更改

[root@ansible ~]# ansible-playbook -C test.yml 

PLAY [setup web server] **********************************************************************************
TASK [Gathering Facts] ***********************************************************************************ok: [192.168.10.201]

TASK [install httpd] *************************************************************************************ok: [192.168.10.201]

TASK [service is enabled] ********************************************************************************ok: [192.168.10.201]

PLAY RECAP ***********************************************************************************************192.168.10.201             : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[root@ansible ~]#

7.play中的远程用户和特权升级

​ Play可以将不同的远程用户或特权升级设置用于play,取代配置文件中指定的默认设置。这些在play本身中与hosts或tasks关键字相同的级别上设置。

7.1 用户属性

​ playbook中的任务通常通过与受管主机的网络连接来执行。与临时命令相同,用于任务执行的用户帐户取决于Ansible配置文件/etc/ansible/ansible.cfg中的不同关键字。运行任务的用户可以通过remote_user关键字来定义。不过,如果启用了特权升级,become_user等其他关键字也会发生作用。

如果用于任务执行的Ansible配置中定义的远程用户不合适,可以通过在play中使用remote_user关键字覆盖

	remote_user: remoteuser
7.2 特权升级属性

​ Ansible也提供额外的关键字,从而在playbook内定义特权升级参数。become布尔值关键字可用于启用或禁用特权升级,无论它在Ansible配置文件中的定义为何。它可取yes或true值来启用特权升级,或者取no或false值来禁用它。

	become: true

​ 如果启用了特权升级,则可以使用become_method关键字来定义特定play期间要使用的特权升级方法。

以下示例中指定sudo用于特权升级:

	become_method: sudo

​ 此外,启用了特权升级时,become_user关键字可定义特定play上下文内要用于特权升级的用户帐户。

	become_user: privileged_user

​ 以下示例演示了如何在play中使用这些:

- name: setup web server
  hosts: 192.168.10.201
  remote_user: tongxue		##使用的用户
  become: yes				##特权升级
  tasks:
    - name: install httpd
      yum:
        name: httpd
        state: latest

    - name: service is enabled
      service:
        name: httpd
        state: started
        enabled: yes

8.playbook的语法

注释

​ 注释也可以用于提高可读性。在YAML中,编号或井号字符(#)右侧的所有内容都是注释。如果注释的左侧有内容,请在该编号符号的前面加一个空格。

# this is a yaml
- name: setup web server # this is name

字符串

​ YAML中通常使用单引号或双引号来括起一段字符串

- name: install httpd
      yum:
        name: 'httpd'
        state: "latest"

​ 编写多行字符串有两种方式。可以使用管道符表示要保留字符串中的换行字符。

    - name: add conf
      lineinfile:
        path: /etc/httpd/conf/httpd.conf
        regexp: AddType application/x-gzip .gz .tgz
        line: |
          AddType application/x-httpd-php .php
          AddType application/x-httpd-php-source .phps

​ 要编写多行字符串,还可以使用大于号字符来表示换行字符转换成空格并且行内的引导空白将被删除。这种方法通常用于将很长的字符串在空格字符处断行,使它们跨占多行来提高可读性。

    - name: add conf
      lineinfile:
        path: /etc/httpd/conf/httpd.conf
        regexp: AddType application/x-gzip .gz .tgz
        line: >
          AddType 
          application/x-httpd-php 
          .php

以上就是playbook的使用

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ansible playbook的使用 的相关文章

  • 何时用引号将 shell 变量括起来?

    我应该或不应该在 shell 脚本中用引号括住变量吗 例如 下列说法正确的是 xdg open URL eq 2 or xdg open URL eq 2 如果是这样 为什么 一般规则 如果它可以为空或包含空格 或实际上任何空格 或特殊字符
  • 如何在 Vim 中突出显示 Bash 脚本?

    我的 Vim 编辑器自动突出显示 PHP 文件 vim file php HTML 文件 vim file html 等等 但是当我输入 vim file在里面写一个Bash脚本 它不会突出显示它 我如何告诉 Vim 将其突出显示为 Bas
  • PIL 的 Image.show() 带来*两个*不同的查看器

    在 python shell 中处理图像时 我使用 image show 其中 image 是 Image 的实例 很久以前什么也没发生 但在定义了一个名为 xv 的 Mirage 符号链接后 我很高兴 最近几天 show 将显示 Imag
  • 我想在 Red Hat Linux 服务器中执行 .ps1 powershell 脚本

    我有一个在窗口中执行的 ps1 powershell 脚本 但我的整个数据都在 Linux 服务器中 有什么可能的方法可以让我在红帽服务器中执行 powershell 脚本 powershell脚本是 Clear Host path D D
  • 如何将一个文本文件拆分为多个 *.txt 文件?

    我有一个文本文件file txt 12 MB 包含 something1 something2 something3 something4 有没有办法分开file txt分成 12 个 txt 文件 比方说file2 txt file3 t
  • 使用 shell 脚本发送 HTML 邮件

    如何使用 shell 脚本发送 HTML 电子邮件 首先 您需要撰写消息 最低限度由这两个标头组成 MIME Version 1 0 Content Type text html 以及适当的消息正文 p Hello world p 获得后
  • 如何在C(Linux utf8终端)中打印“盒子抽屉”Unicode字符?

    我正在尝试显示 方框图范围 2500 257F 中的 Unicode 字符 它应该是标准 utf8 Unicode 标准 版本 6 2 我根本做不到 我首先尝试使用旧的 ASCII 字符 但 Linux 终端以 utf8 显示 并且没有显示
  • Bash:将字符串添加到文件末尾而不换行

    如何将字符串添加到文件末尾而不换行 例如 如果我使用 gt gt 它将添加到文件末尾并换行 cat list txt yourText1 root host 37 echo yourText2 gt gt list txt root hos
  • 链接错误:命令行中缺少 DSO

    我对 Linux 使用 Ubuntu 14 04 LTS 64 位 相当陌生 来自 Windows 并且正在尝试移植我现有的 CUDA 项目 当通过链接时 usr local cuda bin nvcc arch compute 30 co
  • 如何从 C++ 程序中重新启动 Linux?

    我有一个 Qt 4 GUI 我需要在下拉菜单中提供一个选项 允许用户选择重新启动计算机 我意识到这对于以其他方式重新启动计算机的能力来说似乎是多余的 但选择需要保留在那里 我尝试使用 system 来调用以下内容 suid root she
  • 在汇编中使用 printf 会导致管道传输时输出为空,但可以在终端上使用

    无输出 https stackoverflow com questions 54507957 printf call from assembly do not print to stdout即使在终端上 当输出不包含换行符时也有相同的原因
  • 如何才能将 TCP 连接返回到同一端口?

    机器是 RHEL 5 3 内核 2 6 18 有时我在 netstat 中注意到我的应用程序有连接 建立了 TCP 连接本地地址 and 国外地址是一样的 其他人也报告了同样的问题 症状与链接中描述的相同 客户端连接到本地运行的服务器的端口
  • awk 在循环中使用时不打印任何内容[重复]

    这个问题在这里已经有答案了 我有一堆使用 file 1 a 1 txt 格式的文件 如下所示 A 1 B 2 C 3 D 4 并使用以下命令添加包含每个文件名称的新列 awk print FILENAME NF t 0 file 1 a 1
  • 在 docker 中重定向命令输出

    我想为我的服务器做一些简单的日志记录 它是一个在 Docker 容器中运行的小型 Flask 应用程序 这是 Dockerfile Dockerfile FROM dreen flask MAINTAINER dreen WORKDIR s
  • Tomcat Intellij Idea:远程部署

    RackSpace 云服务器 Ubuntu 12 04 Intellij Idea 11 1 2 Windows 8 Tomcat 7 0 26 JDK 6 在 Intellij Idea 上 当我尝试在远程 Tomcat 7 服务器上运行
  • ioctl 命令的用户权限检查

    我正在实现 char 驱动程序 Linux 并且我的驱动程序中有某些 IOCTL 命令仅需要由 ADMIN 执行 我的问题是如何在 ioctl 命令实现下检查用户权限并限制非特权用户访问 IOCTL 您可以使用bool capable in
  • 在内核代码中查找函数的最佳方法[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我开始浏览内核代码 遇到的一件事是如何跟踪函数调用 结构定义等 有没有一种好的方法可以快速跳转到函数定义并退出 我尝试过 Source N
  • Linux 中 m 标志和 o 标志将存储在哪里

    我想知道最近收到的路由器通告的 m 标志和 o 标志的值 从内核源代码中我知道存储了 m 标志和 o 标志 Remember the managed otherconf flags from most recently received R
  • 有没有一种快速方法可以从 Jar/war 中删除文件,而无需提取 jar 并重新创建它?

    所以我需要从 jar war 文件中删除一个文件 我希望有类似 jar d myjar jar file I donot need txt 的内容 但现在我能看到从 Linux 命令行执行此操作的唯一方法 不使用 WinRAR Winzip
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win

随机推荐

  • uniapp 微信小程序webview 踩坑

    uniapp 微信小程序的存在许多功能上的限制和约束 有些情况不得不去使用webview进行开发实现需求 比如 原生无法满足 例如某团队维护SDK 只提供了WEB端jsSDK 且不维护小程序SDK H5可以同时适用多端 适用范围更广 H5可
  • 13LinuxC线程学习之利用pthread_create设置线程分离属性和相关属性解释

    1 线程属性 1 本节作为指引性介绍 linux下线程的属性是可以根据实际项目需要 进行设置 之前我们讨论的线程都是采用线程的默认属性 默认属性已经可以解决绝大多数开发时遇到的问题 如我们对程序的性能提出更高的要求那么需要设置线程属性 比如
  • java常用类之Math类--Java笔记

    Math类包含的一些用于数学运算的静态方法 1 abs 绝对值 System out println 1 t Math abs 10 2 pow 求幂 System out println 2 t Math pow 10 2 3 ceil
  • 什么是PROFINET?PROFINET支持哪些通信方式?

    什么是PROFINET PROFINET 通讯是一种新的以太网通讯系统 是由西门子公司和Profibus用户协会开发 PROFINET具有多制造商产品之间的通讯能力 自动化和工程模式 并针对分布式智能自动化系统进行了优化 其应用结果能够大大
  • F-Measure MCC ROC Area PRC Area_MCC学生会

    传媒学院学生会 媒体运营部 水墨勾染纸笺 是山海的讯息 尘世浮华轮换 是星辰的轨迹 用笔尖筑起一座城 用光影编成一曲歌 我们是凡嚣之外的不同颜色 抬眼看花开花落 云卷云舒 红霞满天 千种美景 万缕愁思 卷携着落日 我想把无数次的擦肩而过和这
  • python3GUI--在线小说播放器By:PyQt5(附ui源码)

    文章目录 一 准备工作 1 PyQt5 2 qtawesome 3 QMediaPlayer 4 LAVFilters 二 预览 1 启动 2 查看小说详情 播放小说 3 搜索后播放 4 动态演示 三 设计流程 1 UI设计 2 整体流程设
  • pycharm自带python解释器吗,如何设置默认PyCharm解释器?

    My PyCharm installation has two interpreters available Python 3 3 2 usr bin python3 3m Python 2 7 5 usr bin python2 7 Wh
  • docker获取镜像image id命令_Docker之镜像和容器基础操作命令

    本篇文章是介绍镜像 image 和 容器 container 的基础操作命令 后直接使用英文 image 和 container 替代 首先来讲解释一下 image 和 container 的关系 image 概念 image 就是我们从
  • Blender 建模案例一(1)

    目录 1 指环 1 1 创建一个柱体 1 2 柱体微调 1 3 缩放 1 4 应用缩放 1 5 物体属性回归默认 1 6 进入编辑模式 1 7 内插面 1 8 桥接循环边 1 9 添加表面细分修改器 1 10 平滑着色 1 11 添加环切
  • LTH7锂电池充电IC

    LTH7是一个完善的单片锂离子电池恒流 恒压线形电源管理芯片 它薄的尺寸和小的外包装使它便于便携应用 更值得一提的是 LTH7专门设计适用于USB的供电规格 得益于内部的MOSFET 结构 在应用上不需要外部电阻 和阻塞二极管 在高能量运行
  • libsvm相关变量总结以及libsvm 参数粗调、微调技巧 和PCA主成分分析princomp函数的使用

    libsvm搭建的支持向量机运行起来 在命令行里会蹦出很多变量 开始的时候 我不以为意 现在想想这样糊弄 到最后还是稀里糊涂 不如一次总结 当做日后的复习资料 运行起来会出现这些 1 变量总结 optimization finished i
  • 点击移除样式,再点击新增样式jq代码

    点击增加样式 再点击移除样式的jq function exam back click function if exam back hasClass exam modf5 exam back removeClass exam modf5 el
  • 什么是ui/ux

    目录 前言 1 图形元素 2 布局 3 颜色和视觉效果 4 动画和过渡效果 5 6 用户体验 User Experience UX 7 响应式设计 Responsive Design 8 可用性 Usability 9 信息架构 Infor
  • python firefly 游戏引擎 教程(一) 程序入口

    程序基本结构 程序的基本流程 firefly 基本程序流程如上所示 首先通过master模块分别启动 gate 网关 db 数据库相关 net 网络 chat 聊天 game 游戏逻辑 模块 然后各个模块分别调用initconfig进行初始
  • 入门指南:深入解析OpenCV的copyTo函数及其与rect的应用场景

    文章目录 导言 copyTo函数的示例 copyTo函数与rect的应用场景 结论 导言 OpenCV是一个功能强大的开源计算机视觉库 广泛应用于图像处理和计算机视觉任务 在OpenCV中 copyTo函数是一个重要的图像处理函数 它允许我
  • JAVA-final关键字和接口

    1 Final 关键字 final 关键字代表最终的 不可改变的 final 可以修饰变量 包括类属性 对象属性 局部变量和形参 方法 包括类方法和对象方法 和类 final修饰类 即代表它不能有儿子类 不能被继承 final修饰类 方法
  • Matlab 中 global 全局变量用法

    用法 在主函数里面 你需要设置 a 这个变量是一个全局变量 就需要声明一下 global a 然后在子函数里面你又用到了 a 这个全局变量 你需要在子函数里面再次声明 global a 这样在子函数中 就可以使用 a 这个全局变量了 不用在
  • 插入数据库喊单双引号解决方案(python)

    记录一下最近在写python 将数据持久化时 数据含单引号 双引号问题 数据库中有这样一张表 CREATE TABLE test test id INT NOT NULL AUTO INCREMENT article VARCHAR 45
  • 【VTK】可拖动的坐标轴MovableAxesWidget

    VTK 可拖动的坐标轴MovableAxesWidget 一直想从头写一个vtkWidget来了解vtk 这两天晚上比较空 正好自己选一个交互实现下 vtk官网有一个可以拖动轴的例子MovableAxes 可惜AxesActor继承自Pro
  • ansible playbook的使用

    一 playbook的使用 1 ansible的playbook与临时命令 临时命令可以对一组目标主机进行一项简单的任务 要发挥ansible的真正力量 还需要了解如何使用playbook轻松的对一组目标主机执行多项复杂的任务 playbo