gpt4 book ai didi

ansible - 如何基于网络(子网)成员在 Ansible 中创建条件副本

转载 作者:行者123 更新时间:2023-12-04 18:59:48 30 4
gpt4 key购买 nike

如果文件的一个版本在特定子网中具有接口(interface),我想将其复制到服务器,或者如果在该子网中没有接口(interface),则将文件的一个版本复制到服务器。下面是一个工作,但我认为不是最佳解决方案。我希望有一种更好的方法可以满足以下标准...

  • 保持动态(使用事实,我不想为每台服务器手动设置变量,并为子网中而不是子网中的服务器手动创建组)
  • 较少重复(可以在一项任务中处理吗?)
  • 不必列出所有可能的接口(interface)名称(例如 eth0、eth1、...、bond0、bond1、...等)

  • 工作版...
    - name: copy file version 1 to server
    copy:
    src: files/myfile.vs1
    dest: /etc/myfile
    when: (ansible_eth0.network == "192.168.0.0") or
    (ansible_eth1.network == "192.168.0.0") or
    (ansible_eth2.network == "192.168.0.0")
    ...

    - name: copy file version 2 to server
    copy:
    src: files/myfile.vs2
    dest: /etc/myfile
    when: (ansible_eth0.network != "192.168.0.0") and
    (ansible_eth1.network != "192.168.0.0") and
    (ansible_eth2.network != "192.168.0.0")
    ...

    最佳答案

    一些 jinja2 忍者技巧,你在这里:

    - copy:
    src: >-
    {{ (
    ansible_interfaces |
    map('regex_replace','^','ansible_') |
    map('extract',hostvars[inventory_hostname]) |
    selectattr('ipv4','defined') |
    selectattr('ipv4.network','equalto','192.168.0.0') |
    list |
    count > 0
    ) | ternary('files/myfile.vs1','files/myfile.vs2')
    }}
    dest: /etc/myfile

    解释:
  • ansible_interfaces 获取可用接口(interface)列表
  • 在所有接口(interface)的名称前加上 ansible_成为(ansible_eth0 等)
  • 从主机自己的hostvars中提取所有接口(interface)的事实
  • 仅选择 ipv4 的那些接口(interface)定义
  • 仅选择 ipv4.network 的那些接口(interface)等于 192.168.0.0
  • 转换为列表
  • 计数
  • 如果有一个或多个这样的接口(interface)返回 files/myfile.vs1
  • 返回 files/myfile.vs2否则

  • 附言 >-用于定义多行字符串并删除任何换行符,否则 src将设置为 files/myfile.vs2\n .

    关于ansible - 如何基于网络(子网)成员在 Ansible 中创建条件副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40389857/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com