首页 > 其他分享 >现代 IT 人一定要知道的 Ansible系列教程:playbook

现代 IT 人一定要知道的 Ansible系列教程:playbook

时间:2024-01-15 10:06:01浏览次数:31  
标签:教程 -- 主机 ansible Ansible hosts playbook

title = '现代 IT 人一定要知道的 Ansible系列教程:playbook' date = 2023-12-23 draft = false summary = 'Ansible Playbook 提供了一个可重复、可重用、简单的配置管理和多机部署系统,非常适合部署复杂的应用程序。如果您需要多次使用 Ansible 执行任务,请编写一个 playbook 并将其置于源代码控制之下。然后,您可以使用 playbook 推出新配置或确认远程系统的配置。' tags = ["devops"]


现代 IT 人一定要知道的 Ansible系列教程:playbook

现代 IT 人一定要知道的 Ansible系列教程:playbook_配置文件

创建 playbook

  • Playbook

PlaybookAnsible 用于部署和配置托管式节点的 YAML 自动化蓝图。

定义 Ansible 从上到下执行操作以实现总体目标的顺序列表。

Play

映射到清单中的托管式节点的任务的有序列表。

Task 任务

个或多个模块的列表,用于定义 Ansible 执行的操作。

Module 模块

Ansible 在托管式节点上运行的代码单元或二进制文件。Ansible 模块分组到集合中,每个模块都有一个完全限定的集合名称。

我们来编写一个 Playbook 文件,用于 ping 主机并打印Hello world消息:

  • ansible_quickstart 目录中创建一个名为playbook.yaml文件,其中包含以下内容:
- name: My first play
   hosts: myhosts
   tasks:
    - name: Ping my hosts
      ansible.builtin.ping:
 
    - name: Print message
      ansible.builtin.debug:
       msg: Hello world
  • 运行 playbook
root@master:~/ansible_quickstart# ansible-playbook -i inventory.ini playbook.yaml

Ansible 返回以下输出:


 PLAY [My first play] ********************************************************************************************************************************************************************************
 
 TASK [Gathering Facts] ******************************************************************************************************************************************************************************
 ok: [192.168.2.130]
 ok: [192.168.2.129]
 
 TASK [Ping my hosts] ********************************************************************************************************************************************************************************
 ok: [192.168.2.130]
 ok: [192.168.2.129]
 
 TASK [Print message] ********************************************************************************************************************************************************************************
 ok: [192.168.2.129] => {
     "msg": "Hello world"
 }
 ok: [192.168.2.130] => {
     "msg": "Hello world"
 }
 
 PLAY RECAP ******************************************************************************************************************************************************************************************
 192.168.2.129              : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
 192.168.2.130              : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

在此输出中,我们可以看到:

  • 我们为 playbook 和每个任务命名。应始终使用描述性名称,以便于验证 playbook 并对其进行故障排除。
  • 任务 Gather Facts 以隐式方式运行。默认情况下,Ansible 会收集有关清单的信息,以便在 playbook 中使用这些信息。
  • 每个任务的状态。每个任务都有一个状态, ok 表示它已成功运行。
  • PLAY RECAP 汇总了每个主机的 playbook 中所有任务的结果。在此示例中,有2个任务,因此 ok=2 表示每个任务都已成功运行。

使用patterns

几乎每当执行临时命令或 playbook 时,都会使用模式。该模式是临时命令中唯一没有标志的元素。它通常是第二个元素:

ansible <pattern> -m <module_name> -a "<module options>"

例如:

ansible webservers -m service -a "name=httpd state=restarted"

在 playbook 中,模式是每个playbook的 hosts:

- name: restart webservers
   hosts: webservers

由于您经常希望同时对多个主机运行命令或 playbook,因此模式通常是指清单组。上面的临时命令和 playbook 都将对 webservers 组中的所有计算机执行。

常见patterns

下面表中列出了定位清单主机和组的常见模式。

Description

Pattern(s)

Targets

All hosts

all (or *)


One host

host1


Multiple hosts

host1:host2 (or host1,host2)


One group

webservers


Multiple groups

webservers:dbservers

all hosts in webservers plus all hosts in dbservers

Excluding groups

webservers:!atlanta

all hosts in webservers except those in atlanta

Intersection of groups

webservers:&staging

any hosts in webservers that are also in staging

一旦你知道了基本模式,你就可以将它们组合起来。比如: webservers:dbservers:&staging:!phoenix

webserversdbservers组中也属于staging组的所有计算机为目标,但phoenix组中的任何计算机除外。

模式的局限性

模式取决于 inventory。如果主机或组未在清单中列出,则无法使用模式来定位它。

如果您的模式包含未出现在清单中的 IP 地址或主机名,可能会看到如下错误:

[WARNING]: No inventory was parsed, only implicit localhost is available
 [WARNING]: Could not match supplied host pattern, ignoring: *.not_in_inventory.com

模式必须与清单语法匹配。如果将主机定义为别名

atlanta:
   host1:
     http_port: 80
     maxRequestsPerChild: 808
     host: 127.0.0.2

必须在模式中使用别名。在上面的示例中,必须在模式中使用 host1 。如果使用 IP 地址,将再次收到错误:

[WARNING]: Could not match supplied host pattern, ignoring: 127.0.0.2

高级模式选项

上面描述的常见模式可以满足您的大部分需求,但 Ansible 提供了其他几种方法来定义您要面向的主机和组。

在模式中使用变量

可以使用变量来允许将带有 -e 参数的组说明符传递给 ansible-playbook:

webservers:!{{ excluded }}:&{{ required }}

在模式中使用组位置

您可以按主机或主机在组中的位置来定义主机或主机子集。例如,给定以下组:

[webservers]
cobweb
webbing
weber

可以使用下标来选择 Webservers 组中的单个主机或范围。

模式和临时命令

可以使用命令行选项更改临时命令中定义的模式的行为。还可以使用该 --limit 标志限制特定运行的目标主机。

  • Limit to one host 限制为一台主机
$ ansible all -m <module> -a "<module options>" --limit "host1"
  • 限制为多个主机
$ ansible all -m <module> -a "<module options>" --limit "host1,host2"
  • 否定限制。请注意,必须使用单引号来防止 bash 插值。
$ ansible all -m <module> -a "<module options>" --limit 'all:!host1'
  • 对主机组的限制
$ ansible all -m <module> -a "<module options>" --limit 'group1'

模式和 ansible-playbook 标志

可以使用命令行选项更改 playbook 中定义的模式的行为。例如,可以通过指定 -i 127.0.0.2, (注意尾部逗号)来运行在单个主机上定义的 hosts: all playbook。即使您的目标主机未在清单中定义,这也有效,但此方法不会读取与此主机绑定的变量的清单,并且 playbook 所需的任何变量都需要在命令行中手动指定。您还可以使用标志 --limit 限制特定运行的目标主机,该标志将引用您的清单:

ansible-playbook site.yml --limit datacenter2

最后,可以通过 --limit 在文件名前面加上 @ 以下前缀来从文件中读取主机列表:

ansible-playbook site.yml --limit @retry_hosts.txt

如果 RETRY_FILES_ENABLED 设置为 True ,则 ansible-playbook 在运行后将创建一个 .retry 文件,其中包含所有播放的失败主机列表。每次 ansible-playbook 完成运行时,都会覆盖此文件。

ansible-playbook site.yml --limit @site.retry

命令选项

  • --become-method <BECOME_METHOD>

权限提升方法(默认=sudo),请使用 ansible-doc -t become -l 列出有效选项。

  • --become-password-file <BECOME_PASSWORD_FILE>**,** --become-pass-file <BECOME_PASSWORD_FILE>

Become password file 成为密码文件

  • --become-user <BECOME_USER>

以该用户身份运行操作(默认=root)

  • --connection-password-file <CONNECTION_PASSWORD_FILE>**,** --conn-pass-file <CONNECTION_PASSWORD_FILE>

连接密码文件

  • --flush-cache

清除清单中每个主机的事实缓存

  • --force-handlers

即使任务失败,也要运行处理程序

  • --list-hosts

输出匹配主机列表;不执行任何其他操作

  • --list-tags

列出所有可用标签

  • --list-tasks

列出将要执行的所有任务

  • --private-key <PRIVATE_KEY_FILE>**,** --key-file <PRIVATE_KEY_FILE>

使用此文件对连接进行身份验证

  • --scp-extra-args <SCP_EXTRA_ARGS>

指定仅传递给 SCP 的额外参数(例如 -l)

  • --sftp-extra-args <SFTP_EXTRA_ARGS>

指定仅传递给 SFTP 的额外参数(例如 -f、-l)

  • --skip-tags

仅运行标签与这些值不匹配的重头戏和任务。此参数可以多次指定。

  • --ssh-common-args <SSH_COMMON_ARGS>

指定要传递给 sftp/scp/ssh 的常用参数(例如 ProxyCommand)

  • --ssh-extra-args <SSH_EXTRA_ARGS>

指定仅传递给 ssh 的额外参数(例如 -R)

  • --start-at-task <START_AT_TASK>

在与此名称匹配的任务处启动 playbook

  • --step

在运行前确认每个任务

  • --syntax-check

对 playbook 执行语法检查,但不要执行它

  • --vault-id

要使用的保管库标识。此参数可以多次指定

  • --vault-password-file**,** --vault-pass-file

vault password file 保管库密码文件

  • --version

显示程序的版本号、配置文件位置、配置的模块搜索路径、模块位置、可执行文件位置和退出

  • -C, --check

不要进行任何更改;相反,请尝试预测可能发生的一些变化

  • -D, --diff

更改(小)文件和模板时,显示这些文件的差异;与 –check 配合得很好

  • J, --ask-vault-password, --ask-vault-pass

询问保管库密码

  • -K, --ask-become-pass

询问权限升级密码

  • -M ,--module-path

在模块库前面加上冒号分隔的路径 (default={{ ANSIBLE_HOME ~ “/plugins/modules:/usr/share/ansible/plugins/modules” }})。此参数可以多次指定

  • -T <TIMEOUT>, --timeout <TIMEOUT>

覆盖连接超时(以秒为单位)(默认值取决于连接)

  • -b, --become

使用 become 运行操作(并不意味着密码提示)

  • -c <CONNECTION>, --connection <CONNECTION>

要使用的连接类型(默认=SSH)

  • -e, --extra-vars

如果 filename 前面有 @,则将其他变量设置为 key=value 或 YAML/JSON。此参数可以多次指定。

  • -f <FORKS>, --forks <FORKS>

指定要使用的并行进程数(默认值 = 5)

  • -i,--inventory,--inventory-file

指定清单主机路径或逗号分隔的主机列表。–inventory-file 已弃用。此参数可以多次指定。

  • -k,--ask-pass

询问连接密码

  • -l <SUBSET>, --limit <SUBSET>

进一步将选定的主机限制为其他模式

  • -t,--tags

仅运行标记有这些值的重头戏和任务。此参数可以多次指定。

  • -u ,<REMOTE_USER>, --user, <REMOTE_USER>

以该用户身份连接(默认值=无)

Environment

可以指定以下环境变量

ANSIBLE_INVENTORY – 覆盖默认的 ansible 清单文件 ANSIBLE_LIBRARY – 覆盖默认的 ansible 模块库路径 ANSIBLE_CONFIG – 覆盖默认的 ansible 配置文件

ansible.cfg 中的大多数选项都提供了更多选项

Files

/etc/ansible/hosts – 默认库存文件

/etc/ansible/ansible.cfg – 配置文件,如果存在,则使用

~/.ansible.cfg – 用户配置文件,覆盖默认配置(如果存在)


标签:教程,--,主机,ansible,Ansible,hosts,playbook
From: https://blog.51cto.com/demo007x/9247946

相关文章

  • STM32CubeMX教程14 ADC - 多通道DMA转换
    1、准备材料开发板(正点原子stm32f407探索者开发板V2.4)ST-LINK/V2驱动STM32CubeMX软件(Version6.10.0)keilµVision5IDE(MDK-Arm)CH340GWindows系统驱动程序(CH341SER.EXE)XCOMV2.6串口助手3个滑动变阻器2、实验目标使用STM32CubeMX软件配置STM32F407开发板的ADC实现ADC多......
  • Angular 17+ 高级教程 – Component 组件 の Control Flow
     前言ControlFlow是Angularv17版本后推出的新模板语法,用来取代NgIf、NgForOf、NgSwitch这3个StructureDirective。StructureDirective的好处是比较灵活,原理简单,但是即便用了微语法,它看上去还是相当繁琐,而且不够优雅。ConrolFlow的好处是它的语法够美,缺点是不......
  • 五菱宝骏车机升级教程【嘟嘟桌面或ES文件管理器】
    文章来源:https://www.djww.net/607.html简介越来越多的汽车厂商自研车机系统,其实就是在原来安卓的基础上加入自己的元素,然后禁用某些功能从而实现禁止用户安装第三方app。因此有些用户想安装第三方app来满足自己的需求,例如实现车机carplay、hicar、carlink、carlife等等。此教程......
  • MacOS安装Stable Diffusion WebUI实战教程
    前言1.电脑配置:m1pro芯片,16+512的内存和SSD空间2.默认开启科学网络代理,在终端也使用网络代理请参考博客3 中第2条 本实践以博客1为主要安装步骤,并根据博客2的方法配置Anaconda环境*此处省略了非必要的细节,重点展示conda虚拟环境和stablediffusion的结合配置 1......
  • Linux安装Docker完整教程
    Linux安装Docker之前使用的CentOS8由于停止维护了,这意味着无法再使用新版本的软件包更新了,由于Docker支持64位版本CentOS7,并且要求内核版本不低于3.10,CentOS7满足最低内核的要求,所以这次在CentOS7安装Docker。本篇文档参考黑马Docker课件,希望这篇文章对大家能有帮助......
  • Docker完整教程
    一、安装Docker♦️1.下载关于Docker的依赖环境在Xterm中输入以下代码安装依赖环境回车yum-yinstallyum-utilsdevice-mapper-persistent-datalvm2使用yum工具下载yum是软件包管理工具通过执行manyum可以查看yum的帮助信息♦️2.设置一下下载Docker的镜像源依赖......
  • k8s教程----零基础快速入门
    k8s详解教程----零基础快速入门前言:Kubernetes(k8s)作为云原生的核心平台,吸引了越来越多的运维、开发、测试以及其他技术员去了解学习。随着行业越来越内卷,k8s已经被广泛使用,作为一名运维人员,k8s将成为一个必须掌握的技术点,同时,我们也可以依靠它跳槽涨薪。一、什么是K8s它前......
  • 无涯教程-LISP - 类(defclass)
    常见的LISP早于几十年的面向对象编程的发展,但是,它在稍后的阶段将面向对象并入其中。定义类defclass宏允许创建用户定义的类。它创建一个类作为数据类型。它具有以下语法-(defclassclass-name(superclass-name*)(slot-description*)class-option*))slot是存储数据......
  • 无涯教程-LISP - 软件包(Packages)
    用编程语言来说,程序包旨在提供一种使一组名称彼此分开的方法,在一个程序包中声明的符号不会与在另一个程序包中声明的相同符号冲突,这样,程序包减少了独立代码模块之间的命名冲突。当前包由特殊变量*package*引用。LISP中有两个预定义的程序包-common-lisp      -......
  • 无涯教程-LISP - 文件I/O
    在本章中,我们将了解LISP如何创建,打开,关闭文本或二进制文件进行数据存储。打开文件您可以使用open函数来创建新文件或打开现有文件,with-open-file通常更方便,更常用,这将在本节的后面看到。打开文件后,将在LISP环境中构造一个流对象来表示它。open函数的语法是-openfilename......