网站搜索

如何使用 Ansible Playbook 在多个远程服务器上自动执行复杂任务 - 第 2 部分


在本 Ansible 系列的上一篇文章中,我们解释了 Ansible 是一种无代理工具,可让您从单个系统快速高效地管理多台计算机(也称为节点,并对它们执行部署)。

在控制器计算机中安装软件、创建无密码登录密钥并将其复制到节点后,是时候学习如何使用 Ansible 优化管理此类远程系统的过程了。

在本文以及下一篇文章中,我们将使用以下测试环境。所有主机都是CentOS 7机器:


Controller machine (where Ansible is installed): 192.168.0.19
Node1: 192.168.0.29
Node2: 192.168.0.30

另外,请注意,两个节点都已添加到本地 /etc/ansible/hosts 文件的 Webservers 部分中:

也就是说,让我们开始讨论当前的话题。

Ansible Playbook 简介

如上一指南所述,您可以使用 ansible 实用程序在远程节点中运行命令,如下所示:


ansible -a "/bin/hostnamectl --static" webservers

在上面的示例中,我们在 node1node2 上运行 hostnamectl --static。人们很快就会意识到,这种在远程计算机上运行任务的方法对于短命令来说效果很好,但对于需要进一步结构良好的配置参数或与其他服务交互的更复杂的任务来说,很快就会变得繁重或混乱。

例如,在多个主机上设置和配置 WordPress - 我们将在本系列的下一篇文章中介绍)。这就是剧本登场的地方。

简而言之,Playbook 是以 YAML 格式编写的纯文本文件,并包含一个列表,其中的项目具有一个或多个键/值对(也称为“ >哈希”或“字典”)。

在每个 Playbook 中,您都会找到一组或多组主机(这些组中的每一组也称为 play),在其中执行所需的任务。

官方文档中的一个例子将帮助我们说明:

1. 主机:这是将执行以下任务的机器列表(根据/etc/ansible/hosts)。

2. remote_user:将用于执行任务的远程帐户。

3. vars:用于修改远程系统行为的变量。

4. 任务按顺序执行,一次一个,针对所有与主机匹配的计算机。在一场比赛中,所有主持人都将获得相同的任务指令。

如果您需要为特定主机执行一组不同的关联任务,请在当前 Playbook 中创建另一个 play(换句话说,play 的目的是将特定的主机选择映射到良好的主机) - 定义的任务)。

在这种情况下,通过在底部添加主机指令并重新开始来开始新的游戏:


---
- hosts: webservers
  remote_user: root
  vars:
    variable1: value1
    variable2: value2
  remote_user: root
  tasks:
  - name: description for task1
    task1: parameter1=value_for_parameter1 parameter2=value_for_parameter2
  - name: description for task1
    task2: parameter1=value_for_parameter1 parameter2=value_for_parameter2
  handlers:
    - name: description for handler 1
      service: name=name_of_service state=service_status
- hosts: dbservers
  remote_user: root
  vars:
    variable1: value1
    variable2: value2
…

5. 处理程序是在每次播放的任务部分结束时触发的操作,主要用于重新启动服务或触发远程系统中的重新启动。


mkdir /etc/ansible/playbooks

其中有一个名为 apache.yml 的文件,其中包含以下内容:


---
- hosts: webservers
  vars:
    http_port: 80
    max_clients: 200
  remote_user: root
  tasks:
  - name: ensure apache is at the latest version
    yum: pkg=httpd state=latest
  - name: replace default index.html file
    copy: src=/static_files/index.html dest=/var/www/html/ mode=0644
    notify:
    - restart apache
  - name: ensure apache is running (and enable it at boot)
    service: name=httpd state=started enabled=yes
  handlers:
    - name: restart apache
      service: name=httpd state=restarted

其次,创建目录/static_files:


mkdir /static_files

您将在其中存储自定义 index.html 文件:


<!DOCTYPE html>
 <html lang="en">
 <head>
 <meta charset="utf-8"/>
 </script>
 </head>
 <body>
 <h1>Apache was started in this host via Ansible</h1><br>
<h2>Brought to you by linux-console.net</h2>
 </body>
 </html>

也就是说,现在是时候使用此剧本来执行前面提到的任务了。您会注意到,Ansible 将按主机一次检查每项任务,并报告此类任务的状态:


ansible-playbook /etc/ansible/playbooks/apache.yml

现在让我们看看当我们打开浏览器并将其指向 192.168.0.29192.168.0.30 时会发生什么:

让我们更进一步,手动停止并禁用 node1node2 上的 Apache:


systemctl stop httpd
systemctl disable httpd
systemctl is-active httpd
systemctl is-enabled httpd

然后再跑,


ansible-playbook /etc/ansible/playbooks/apache.yml

这次,任务报告 Apache Web 服务器已在每台主机上启动并启用:

请考虑以上示例来了解 Ansible 的强大功能。虽然在少量服务器上执行这些任务相对容易,但如果您需要在多台(可能数百台)计算机上执行相同的操作,则可能会变得非常乏味且耗时。

概括

在本文中,我们描述了如何使用 Ansible 在多个远程主机上同时运行命令和执行复杂的任务。官方文档和 GitHub 存储库提供了大量有关如何使用 Ansible 完成几乎任何可以想象的任务的示例和指南。

当您开始学习如何使用 Ansible 在远程 Linux 主机上自动执行任务时,我们希望听到您的想法。我们也随时欢迎您提出问题、意见和建议,因此请随时使用下面的表格与我们联系。