如何在 Ansible 中使用静态和动态清单?


Ansible 是一个强大的自动化工具,允许您管理和配置系统、部署软件以及编排更高级的 IT 任务,例如持续部署或零停机滚动更新。Ansible 的关键组件之一是清单文件,它描述了剧本中命令、模块和任务运行的主机和主机组。

在本文中,我们将探讨如何在 Ansible 中使用静态和动态清单,并附带示例及其输出。

静态清单

静态清单是管理和组织服务器的最简单方法。它们以 INI 或 YAML 格式定义。这是一个 INI 格式的静态清单示例:

[webservers]
webserver1.example.com
webserver2.example.com

[dbservers]
dbserver1.example.com

在这个例子中,我们有两个组:webservers 和 dbservers。每个组包含该组中服务器的主机名。

您可以在剧本中使用这些组来为不同的任务定位特定的服务器。例如:

- hosts: webservers
  tasks:
    - name: ensure apache is at the latest version
      ansible.builtin.yum:
        name: httpd
        state: latest

在这个剧本中,确保 Apache 为最新版本的任务将只在 webservers 组中的服务器上运行。

更多静态清单示例

在静态清单中使用变量

您可以在静态清单文件中定义变量。这些变量可以在您的剧本中使用。这是一个示例:

[webservers]
webserver1.example.com http_port=80 max_clients=200

[dbservers]
dbserver1.example.com mysql_port=3306

在这个例子中,http_port 和 max_clients 变量是为 webserver1.example.com 定义的,mysql_port 变量是为 dbserver1.example.com 定义的。您可以像这样在您的剧本中使用这些变量:

- hosts: webservers
  tasks:
    - name: ensure apache is running on the right port
      ansible.builtin.template:
        src: /srv/httpd.j2
        dest: /etc/httpd.conf

在 httpd.j2 模板文件中,您可以像这样使用 http_port 变量:

Listen {{ http_port }}

在静态清单中使用子组

您还可以在静态清单文件中定义子组。这是一个示例:

[atlanta]
host1
host2

[raleigh]
host3
host4

[southeast:children]
atlanta
raleigh

在这个例子中,atlanta 和 raleigh 是 southeast 组的子组。您可以在剧本中使用 southeast 组来定位 atlanta 和 raleigh 组中的所有主机。

在静态清单中使用别名

在静态清单中,您可以为主机分配别名。这对于使您的剧本更易读很有用。这是一个示例:

[webservers]
web1 ansible_host=webserver1.example.com
web2 ansible_host=webserver2.example.com

[dbservers]
db1 ansible_host=dbserver1.example.com

在这个例子中,web1 和 web2 分别是 webserver1.example.com 和 webserver2.example.com 的别名。同样,db1 是 dbserver1.example.com 的别名。您可以像这样在您的剧本中使用这些别名:

- hosts: web1
  tasks:
    - name: ensure apache is at the latest version
      ansible.builtin.yum:
        name: httpd
        state: latest

在单独的文件中定义变量

如果您有很多变量,那么在一个单独的文件中定义它们可能会更清晰。以下是如何操作:

[webservers]
webserver1.example.com
webserver2.example.com

[dbservers]
dbserver1.example.com

创建一个名为 group_vars/webservers 的单独文件:

http_port: 80
max_clients: 200

在这个例子中,http_port 和 max_clients 变量是为 webservers 组中的所有主机定义的。您可以像以前一样在您的剧本中使用这些变量。

动态清单

静态清单易于理解和使用,但是随着您管理的服务器数量的增加,它们可能变得难以管理。这就是动态清单的用武之地。

动态清单是动态生成清单数据的脚本。当您使用云提供商时,它们特别有用,因为服务器的数量可能会频繁变化。

以下是如何使用 AWS 动态清单的示例:

首先,您需要安装 boto 库,它允许 Python 与 AWS 交互:

pip install boto

接下来,您需要创建一个检索您的 AWS 实例的脚本。Ansible 提供了一个用于此目的的脚本。

您还需要为脚本创建一个配置文件,它可能如下所示:

[ec2]
regions = us-west-2
destination_variable = public_dns_name
vpc_destination_variable = ip_address

此配置文件告诉脚本从 us-west-2 区域检索实例,并将 public_dns_name 和 ip_address 作为目标变量。

然后,您可以在剧本中使用该脚本作为清单:

ansible-playbook -i ec2.py playbook.yml

在此命令中,-i ec2.py 告诉 Ansible 使用 ec2.py 脚本作为清单。

更多动态清单示例

在 AWS 动态清单中使用标签

您可以使用标签来进一步过滤动态清单中的 AWS 实例。以下是如何操作:

首先,将标签添加到您的 AWS 实例。您可以添加一个名为 Type,值为 WebServer 的标签。

接下来,修改您的 ec2.ini 配置文件以包含 tags 选项:

[ec2]
regions = us-west-2
destination_variable = public_dns_name
vpc_destination_variable = ip_address
tags = Type:WebServer

此配置文件现在将只检索具有值为 WebServer 的 Type 标签的实例。

使用 Azure 动态清单

您还可以使用 Azure 动态清单。以下是如何操作:

首先,您需要安装 azure 库:

pip install azure

接下来,您需要创建一个检索您的 Azure VM 的脚本。Ansible 提供了一个用于此目的的脚本。

您还需要为脚本创建一个配置文件,它可能如下所示:

[azure]
subscription_id = your_subscription_id
client_id = your_client_id
secret = your_secret
tenant = your_tenant_id

然后,您可以在剧本中使用该脚本作为清单:

ansible-playbook -i azure_rm.py playbook.yml

在此命令中,-i azure_rm.py 告诉 Ansible 使用 azure_rm.py 脚本作为清单。

使用 Google Cloud Platform (GCP) 动态清单

您还可以使用 GCP 动态清单。以下是如何操作:

首先,您需要安装 google-auth 库:

pip install google-auth

接下来,您需要创建一个检索您的 GCP 实例的脚本。Ansible 提供了一个用于此目的的脚本。

您还需要为脚本创建一个配置文件,它可能如下所示:

[gce]
project = your_project_id
auth_kind = serviceaccount
service_account_file = /path/to/your/service/account/file.json

然后,您可以在剧本中使用该脚本作为清单:

ansible-playbook -i gce.py playbook.yml

在此命令中,-i gce.py 告诉 Ansible 使用 gce.py 脚本作为清单。

使用 Docker 动态清单

您也可以使用 Docker 动态清单。以下是如何操作:

首先,您需要安装 docker 库:

pip install docker

接下来,您需要创建一个检索您的 Docker 容器的脚本。Ansible 提供了一个用于此目的的脚本。

然后,您可以在剧本中使用该脚本作为清单:

ansible-playbook -i docker.py playbook.yml

在此命令中,-i docker.py 告诉 Ansible 使用 docker.py 脚本作为清单。

结论

您选择在 Ansible 中使用静态清单还是动态清单将取决于您的具体用例。静态清单简单直接,但是随着服务器数量的增加,它们可能变得难以管理。另一方面,动态清单更复杂,但可以更容易地处理大量服务器,尤其是在这些服务器托管在云提供商上的情况下。

更新于:2023年7月13日

464 次浏览

启动您的职业生涯

通过完成课程获得认证

开始
广告
© . All rights reserved.