现代 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文件,其中包含以下内容:
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
ruby 复制代码
 root@master:~/ansible_quickstart# ansible-playbook -i inventory.ini playbook.yaml 

Ansible 返回以下输出:

markdown 复制代码
 ​
 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 时,都会使用模式。该模式是临时命令中唯一没有标志的元素。它通常是第二个元素:

xml 复制代码
 ansible <pattern> -m <module_name> -a "<module options>"

例如:

arduino 复制代码
 ansible webservers -m service -a "name=httpd state=restarted"

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

yaml 复制代码
 - 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 地址或主机名,可能会看到如下错误:

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

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

yaml 复制代码
 atlanta:
   host1:
     http_port: 80
     maxRequestsPerChild: 808
     host: 127.0.0.2

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

sql 复制代码
 [WARNING]: Could not match supplied host pattern, ignoring: 127.0.0.2

高级模式选项

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

在模式中使用变量

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

css 复制代码
 webservers:!{{ excluded }}:&{{ required }}

在模式中使用组位置

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

csharp 复制代码
 [webservers]
 cobweb
 webbing
 weber

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

模式和临时命令

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

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

模式和 ansible-playbook 标志

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

bash 复制代码
 ansible-playbook site.yml --limit datacenter2

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

css 复制代码
 ansible-playbook site.yml --limit @retry_hosts.txt

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

css 复制代码
 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

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

  • -b, --become

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

  • -c , --connection

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

  • -e, --extra-vars

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

  • -f , --forks

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

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

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

  • -k,--ask-pass

询问连接密码

  • -l , --limit

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

  • -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 -- 用户配置文件,覆盖默认配置(如果存在)

相关推荐
七夜zippoe18 小时前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann
Fcy64820 小时前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满20 小时前
Linux怎么查看最新下载的文件
linux·运维·服务器
代码游侠20 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
Harvey90320 小时前
通过 Helm 部署 Nginx 应用的完整标准化步骤
linux·运维·nginx·k8s
珠海西格电力科技21 小时前
微电网能量平衡理论的实现条件在不同场景下有哪些差异?
运维·服务器·网络·人工智能·云计算·智慧城市
释怀不想释怀21 小时前
Linux环境变量
linux·运维·服务器
zzzsde1 天前
【Linux】进程(4):进程优先级&&调度队列
linux·运维·服务器
聆风吟º1 天前
CANN开源项目实战指南:使用oam-tools构建自动化故障诊断与运维可观测性体系
运维·开源·自动化·cann
NPE~1 天前
自动化工具Drissonpage 保姆级教程(含xpath语法)
运维·后端·爬虫·自动化·网络爬虫·xpath·浏览器自动化