我有一份看上去像:
all:
children:
nodes:
vars:
bmc_user: root
bmc_pass: secret
hosts:
node1.example.com:
bmc_addr: node1-bmc.example.com
node2.example.com:
bmc_addr: node2-bmc.example.com对于运行类似ipmitool的任务,我只需将任务委托给localhost,如下所示:
- hosts: all
gather_facts: false
tasks:
- delegate_to: localhost
command: >-
ipmitool -I lanplus -H {{ bmc_addr }} -U {{ bmc_user }} -P {{ bmc_pass }} power off有时,我需要使用ssh与bmc进行交互。这是一个棘手的问题,因为这通常需要密码验证。我想写这样的东西:
- hosts: all
gather_facts: false
tasks:
- delegate_to: "{{ bmc_addr }}"
command: >-
racadm set iDRAC.IPMILan.Enabled Enable...but这是行不通的,因为访问bmc所需的凭据与访问主机所需的凭据不一样。我希望能在我的库存中做这样的事情:
all:
children:
nodes:
vars:
bmc_user: root
bmc_pass: secret
hosts:
node1.example.com:
bmc_addr: node1-bmc.example.com
node2.example.com:
bmc_addr: node2-bmc.example.com
nodes_bmc:
vars:
ansible_user: root
ansible_ssh_pass: secret
hosts:
node1-bmc.example.com:
node2-bmc.example.com:...but I希望从nodes_bmc组中的bmc_addr值动态填充nodes_bmc组中的主机,而不是手动指定它们。
我一直对此感到困惑,我想出的唯一解决方案是编写一些工具来读取ansible库存,然后生成一个包含必要条目的新静态清单。这看起来很笨重,并且需要确保"generate库存“工具在主库存被修改时运行。
发布于 2022-05-20 16:25:55
让我们试试add_host模块:
- name: add hosts
hosts: all
gather_facts: no
tasks:
- add_host:
hostname: "{{ hostvars[item].bmc_addr }}"
groups:
- nodes_bmc
loop: "{{ play_hosts }}"现在,你需要一个新的剧本,这样你就有了所有的主持人。
- name: Show all hosts
hosts: all
gather_facts: no
tasks:
- debug:
var: play_hosts
run_once: yes运行您的库存(但是node_bmc组中的任何主机):
$ ansible-playbook -i hosts.yml ./add_hosts.yml
PLAY [add hosts] ***********************************************************************************************************
TASK [add_host] ************************************************************************************************************
ok: [node1.example.com] => (item=node1.example.com)
ok: [node1.example.com] => (item=node2.example.com)
PLAY [Show all hosts] ******************************************************************************************************
TASK [debug] ***************************************************************************************************************
ok: [node1-bmc.example.com] => {
"play_hosts": [
"node1-bmc.example.com",
"node2-bmc.example.com",
"node1.example.com",
"node2.example.com"
]
}
PLAY RECAP *****************************************************************************************************************
node1-bmc.example.com : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node1.example.com : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 发布于 2022-05-20 16:58:50
现在,这是一种完全不同的方式。
您将有两个文件在您的库存:
nodes_bmc)
chmod +x generate_bmc.sh
文件下的hosts:部分,它必须是可执行的:chmod +x generate_bmc.sh
该文件将简单地如下:
#!/bin/bash
# Figure out where we are
here=$( dirname $0 )
# Write header
cat << 'end_header'
{
"nodes_bmc": {
"hosts": [
end_header
# Get hosts from inventory file
hosts=$( ansible-inventory --list -i ${here}/hosts.yml | grep '"bmc_addr":' | cut -d: -f2 | sed 's/,$//' )
# Or, if you have jq installed:
# hosts=$( ansible-inventory --list -i ${here}/hosts.yml | jq "._meta.hostvars[].bmc_addr" )
last=$( echo $hosts | sed 's/.* //' )
# Write hosts
for host in ${hosts}
do
echo -n " "$host
[ "${host}" != "${last}" ] && echo ","
done
echo
# Close output
cat << 'end_footer'
]
}
}
end_footer在您的ansible.cfg文件中,有一行:
inventory = /the/directory/that/has/those/two/files您可以使用ansible-inventory --list对此进行测试。
https://stackoverflow.com/questions/72320033
复制相似问题