库存 ansible yaml 文件中需要提及哪些常见变量?

库存 ansible yaml 文件中需要提及哪些常见变量?
  • 我尝试建立一条管道来安装我的产品。
  • 我的产品安装在一个至少有 8 台机器的实验室中(内部实验室)。
  • 我在本地有多个实验室,在云端也有多个实验室
  • 每台机器都有一个角色,例如:一台 Center-DB 机器,一台 Center-Queue 机器或一台 Center-App 机器,一台 Middle 机器和一台 Client 机器等...因此,一些实验室是:1 个中心 - 1 个 Middle - 1 个 Client。或 3 个中心 (App, DB, Queue) - 2 个 Middle - 3 个 Client
  • 有些机器有一个服务比如 DB,还有一些像:DB、IIS 和消息代理
  • 实验室位于安全的 VLAN 中,这意味着为了从远程运行脚本,我需要使用其 IP 而不是其 FQDN 连接到机器并提供凭据。
  • 证书对于所有机器都相同。
  • 此外,安装文件中还有一个选项,可以安装安全的产品(带有证书和端口 443)或不安全的产品。
  • 在安装过程中,我需要首先将其复制到每台机器特定安装文件,然后使用特定参数安装它们。

除了库存 ansible yaml 文件中的主机和 IP 地址列表之外,是否可以添加变量或键,例如:

  • “证书”
  • “协议”,
  • “文件”,
  • “机器类型”等等……?

或者应该将它们放在不同的文件中,例如角色(任务)。请帮我决定哪些信息应该放在哪里。我的示例 yaml 文件如下:

---
cred:
    user: a
    pass: 1
center:
    dbs:
        - db:
              fqdn: center-db.foo.com
              cn: center-db
              files:
                  - C:\folder\Server.msi
              ip: 1.1.1.1
    queues: 
        - queue: 
              fqdn: center-queue.foo.com
              cn: center-queue
              files:
                  - C:\folder\Server.msi
              ip: 2.2.2.2
    apps:
        - app:
              fqdn: center-app.foo.com
              cn: center-app
              files:
                  - C:\folder\Server.msi
                  - C:\folder\Center-Client.msi
                  - C:\folder\files
              ip: 3.3.3.3
                  

               clients:
                  - client:
                        db:
                            cn: Client-DB
                        app:
                            fqdn: Client-APP.foo.com
                            cn: Client-APP
                            files:
                                - C:\folder\Server.msi
                                - C:\folder\Client-Client.msi
                            ip: 4.4.4.4

答案1

Ansible 允许以多种方式构建库存变量和任务。根据各种 Ansible 插件的期望,制定自己的逻辑放置位置意见。

实验室位于安全的 VLAN 中,这意味着为了从远程运行脚本,我需要使用其 IP 而不是其 FQDN 连接到机器并提供凭据。

错误。DNS 适用于每个环境。也许将区域委托hiddai.lab.example.net给测试实验室 DNS 服务器,主机在此区域中使用 FQDN。

也就是说,ansible_host可以提供变量来覆盖连接插件要使用的主机名或 IP 地址。

不要使用为其他用户分配的 IP 地址。1.1.1.1 不是您的,而是 Cloudflare DNS。请使用您的真实 IP 地址或文档测试网络,例如 192.0.2.0/24 198.51.100.0/24 203.0.113.0/24。

此外,我需要决定我的产品是否能在我的实验室里安全安装(哪种协议 - HTTPS 还是 HTTP?)

始终安全,因此使用 HTTPS。实验室设置可以在 PKI、个人简单 CA、自签名证书方面更加宽松。

除了库存 ansible yaml 文件中的主机和 IP 地址列表之外,是否可以添加变量或键,例如:“凭据”、“协议”、“文件”、“机器类型”等...

否,将主机列表与角色级应用程序配置数据分开。这样可以实现多个清单。多个实验室、准备和生产清单之间的数据重复最少。

将清单限制为连接到主机所需的内容:主机名、用户、可能还有凭证、连接插件。将应用程序详细信息放在其他地方,例如 group_vars。

    cred:
        user: a
        pass: 1

说到凭证,我认为一个字符的密码太短了,无法接受。甚至不要用它作为假例子。最好用更好的方法替换密码验证,比如基于密钥或证书的验证。或者至少是长单词密码,例如unluckily-pretense-occupy-quartered

您的文件路径似乎是 Windows。阅读Ansible 的 winrm 文档并考虑您的授权选项。

将凭据存储在清单中意味着任何拥有清单文件的人都可以运行命令。适当保护文件。考虑将凭据存储在单独的密钥文件中,或存储在您可以通过 Ansible 查找访问的某个秘密系统中。

您的 vars 文件是 YAML,但不属于结构Ansible 的静态 YAML 库存插件期望。也许是这样的,因为 inventory/lab.yml 我已经根据互联网 RFC 将一些值更改为实际示例。

---
all:
    children: 
        windows:
            # Group containing only Windows hosts allow for 
            # Windows-specific auth and connection variables
            vars:
                ansible_user: a
                ansible_password: unluckily-pretense-occupy-quartered
                ansible_connection: winrm
                ansible_winrm_transport: credssp
            children:
                db:
                    # FQDN as inventory_hostname should resolve if in DNS
                    # Ansible pieces out the top label for you as special var inventory_hostname_short
                    hosts: 
                        center-db.hiddai.lab.example.net:
                            # ansible_host overrides what to connect to
                            # Such as when there is no DNS
                            ansible_host: 203.0.113.23
            children:
                queue:
                    hosts:
                        center-queue.hiddai.lab.example.net:
                            ansible_host: 203.0.113.83

            children:
                app:
                    hosts:
                        center-app.hiddai.lab.example.net:
                            ansible_host: 203.0.113.62
                            
            children:
                client:
                    hosts:
                        client-app.hiddai.lab.example.net:
                            ansible_host: 203.0.113.28
                            db: center-db

我不清楚此示例中的“中心”是什么,软件产品、部署名称还是客户端名称?由于 Ansible 库存在内部实际上是扁平的,因此我将其折叠起来。如果需要,可以将其作为变量或组添加回来。

关于主机特定的应用程序配置数据,请考虑 group_vars。这些可以与您的清单文件相关,文件名与组名匹配。

库存/group_vars/windows.yml

---
base_dir: 'C:\folder\'
files_common: 
  - Server.msi

库存/group_vars/app.yml

---
files_additional:
  - files
  - Center-Client.msi

库存/group_vars/client.yml

---
files_additional:
  - Client-Client.msi

注意我为这些文件发明了几个变量。由于名称不同,你可以稍后将它们合并到一个列表中,因此{{ files_common + files_additional }}

理想情况下,编写并使用 Ansible 角色,这些角色具有自己的变量和任务。考虑适合大多数用例的角色默认值。例如,win_package 任务用于安装这些 msi 包,并默认从 https 服务器下载它们。但将源包文件设为变量,以便可以覆盖它。

而剧本就是将这些主机模式映射到角色。我不确定只给出通用名称的情况下该如何称呼您的应用,因此我为角色添加了前缀“thing”。play.yml:

---

hosts: db
roles:
- thingdb

hosts: queue
roles:
- thingqueue

hosts: app
roles:
- thingapp

hosts: client
roles:
- thingclient

使用以下脚本运行ansible-playbook play.yml -i inventory/lab.yml

不包括:角色。我不知道你想要完成什么,而且这个答案有点长。

相关内容