![库存 ansible yaml 文件中需要提及哪些常见变量?](https://linux22.com/image/767811/%E5%BA%93%E5%AD%98%20ansible%20yaml%20%E6%96%87%E4%BB%B6%E4%B8%AD%E9%9C%80%E8%A6%81%E6%8F%90%E5%8F%8A%E5%93%AA%E4%BA%9B%E5%B8%B8%E8%A7%81%E5%8F%98%E9%87%8F%EF%BC%9F.png)
- 我尝试建立一条管道来安装我的产品。
- 我的产品安装在一个至少有 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
不包括:角色。我不知道你想要完成什么,而且这个答案有点长。