我在采用这种格式的输出文件(“inventory.list”)时遇到了挑战:
hostname1.env1.domain | abc | environment1
hostname2.env1.domain | abc | environment1
hostname3.env2.domain | abc | environment2
hostname4.env2.domain | abc | environment2
hostname5.env1.domain | def | environment1
hostname6.env2.domain | def | environment2
(6 rows)
Run Code Online (Sandbox Code Playgroud)
并以不同的格式将其写到另一个文件中:
[abc.environment1]
hostname1.env1.domain
hostname2.env1.domain
[abc.environment2]
hostname3.env2.domain
hostname4.env2.domain
[def.environment1]
hostname5.env1.domain
[def.environment2]
hostname6.env2.domain
Run Code Online (Sandbox Code Playgroud)
abc
和def
是分配给服务器的角色,每个角色可以有多个服务器,以及同名但在不同环境中的角色。我必须将每个主机名分成唯一的 [role.environment] 组,另外,完全删除文件的最后一行,即行计数(该文件是 sql 查询的输出)。
我可以读取文件,去除管道和空格并分配/输出角色/环境分组,没问题:
#! /bin/bash
while IFS='| ' read -r certname role env; do
printf '%s\n' "[""$role"".""$env""]"
done < "/tmp/inventory.list"
Run Code Online (Sandbox Code Playgroud)
...它巧妙地为我提供了角色/环境组名称:
[abc.environment1]
[abc.environment2]
[def.environment1]
[def.environment2]
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚如何打印出链接到每个组名下的每个角色/环境组的主机名,我也无法弄清楚如何让我的脚本忽略最后一行计数行。我猜我必须进一步将我的角色和环境字段(第二个和第三个字段)分配给它自己的数组,然后引用它来获取链接到每个唯一分组的主机名,但我不知道如何实现这一点。请问有人可以建议吗?
我有一个很长的 psql 命令要在 bash shell 脚本中执行,我想知道将它分成几行的正确方法是什么?标准的 Unix 脚本“分割线”反斜杠字符不起作用。当然,在 postgres 环境中,您可以一行接一行地继续执行,并且在您输入结束分号之前不会处理该命令,但是您不在 shell 脚本中使用它。
我的命令是这样的:
sudo -u postgres /opt/puppet/bin/psql puppetdb -t -c "select certname, r.value as role, e.value as env from certname_facts r join certname_facts e using (certname) where r.name = 'role' and e.name = 'env' order by role,env,certname" | grep -v "^$" > /home/ansible/inventory_list
Run Code Online (Sandbox Code Playgroud)
我不想更改命令,手动输入时一切正常,但我需要知道将其转换为分割线条目的正确方法,例如:
sudo -u postgres /opt/puppet/bin/psql puppetdb -t
-c "select certname, r.value as role, e.value as env
from certname_facts r join certname_faces e using (certname)
where r.name = …
Run Code Online (Sandbox Code Playgroud) 我想我最好为此开始一个新的查询,因为我原来的查询已得到完全解答(谢谢!)。
我有两个文件,它们都是 postgresql 命令的输出。第一个 (/tmp/inventory.list) 是我原始查询使用 bash arrays 将表转换为 ini 文件的主题,为此我使用 @choroba 善意建议的 array 命令。鉴于我的第二个文件(/tmp/inventory2.list)的格式与第一个文件非常相似,我认为我可以调整数组脚本来类似地处理这个文件,但我显然把一些事情搞砸了。
我的输入文件 /tmp/inventory2.list 的格式为:
environment1 | hostname1.environment1.domain
environment1 | hostname2.environment1.domain
environment1 | hostname3.environment1.domain
environment2 | hostname4.environment2.domain
environment2 | hostname5.environment2.domain
environment3 | hostname6.environment3.domain
Run Code Online (Sandbox Code Playgroud)
必须以分组格式读入并写入另一个文件:
[environment1]
hostname1.environment1.domain
hostname2.environment1.domain
hostname3.environment1.domain
[environment2]
hostname4.environment2.domain
hostname5.environment2.domain
[environment3]
hostname6.environment3.domain
Run Code Online (Sandbox Code Playgroud)
环境分组之间必须有行空间,组名称必须按字母顺序显示,主机名必须在组内按字母顺序排序。每个环境组可能有多个主机名,但每个组只能显示一次。
让事情变得复杂的是,输入文件末尾有一个空行,我无法让我的 postgresql 查询省略它(-t 或 --tuples-only 删除通常写在末尾的行计数行,但不会' t 删除最后一个空行),因此需要将其删除并且不写入新的输出文件。
我尝试调整 @choroba 的数组命令来读取此文件并正确输出它,但是尽管它对于我的第一个文件完美地工作,但我的调整不起作用。我有:
1 #! /bin/bash
2
3 unset -v envs
4 unset -v hosts
5 declare -A envs
6 declare -A hosts …
Run Code Online (Sandbox Code Playgroud)