首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从静态库存动态生成bmc主机名?

从静态库存动态生成bmc主机名?
EN

Stack Overflow用户
提问于 2022-05-20 13:49:28
回答 2查看 36关注 0票数 2

我有一份看上去像:

代码语言:javascript
复制
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,如下所示:

代码语言:javascript
复制
- 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进行交互。这是一个棘手的问题,因为这通常需要密码验证。我想写这样的东西:

代码语言:javascript
复制
- hosts: all
  gather_facts: false
  tasks:
    - delegate_to: "{{ bmc_addr }}"
      command: >-
        racadm set iDRAC.IPMILan.Enabled Enable

...but这是行不通的,因为访问bmc所需的凭据与访问主机所需的凭据不一样。我希望能在我的库存中做这样的事情:

代码语言:javascript
复制
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库存“工具在主库存被修改时运行。

EN

回答 2

Stack Overflow用户

发布于 2022-05-20 16:25:55

让我们试试add_host模块:

代码语言:javascript
复制
- name: add hosts
  hosts: all
  gather_facts: no
  tasks:
  - add_host:
      hostname: "{{ hostvars[item].bmc_addr }}"
      groups:
      - nodes_bmc
    loop: "{{ play_hosts }}"

现在,你需要一个新的剧本,这样你就有了所有的主持人。

代码语言:javascript
复制
- name: Show all hosts
  hosts: all
  gather_facts: no
  tasks:
  - debug:
      var: play_hosts
    run_once: yes

运行您的库存(但是node_bmc组中的任何主机):

代码语言:javascript
复制
$ 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   
票数 1
EN

Stack Overflow用户

发布于 2022-05-20 16:58:50

现在,这是一种完全不同的方式。

您将有两个文件在您的库存:

nodes_bmc)

  • A chmod +x generate_bmc.sh

文件下的hosts:部分,它必须是可执行的:chmod +x generate_bmc.sh

该文件将简单地如下:

代码语言:javascript
复制
#!/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文件中,有一行:

代码语言:javascript
复制
inventory = /the/directory/that/has/those/two/files

您可以使用ansible-inventory --list对此进行测试。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72320033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档