Ansible 通过遍历文件并为每个主机分配变量来自动配置

Ansible Automate configuration by iterating over files and assigning variables for each host

我需要一些帮助来确定执行此操作的最佳方法以及如何设置我的剧本以适当地为每个节点提取变量。

假设我有 3 个主机

/etc/ansible/hosts:

host1
host2
host3

我有一个包含多个条目的可变文件

vars/IPs.yaml:

---
IP: ['192.168.77.35', '192.167.77.36', '192.168.77.37']

我是运行这本剧本:

network_change.yaml:

---
- hosts: all
  vars_files:
    - vars/IPs.yaml
  tasks:
    - name: Check 10G Interface
      stat:
        path: /etc/sysconfig/network-scripts/ifcfg-card-10Gb-1
      register: teng

    - name: Change 10G Interface Settings
      lineinfile:
        path: /etc/sysconfig/network-scripts/ifcfg-card-10Gb-1
        regexp: '{{item.From}}'
        line: '{{item.To}}'
      when: teng.stat.exists
      with_items:
       - { From: 'IPADDR=', To: 'IPADDR={{IP}}'}

我在单个主机上工作得很好...但是当我有多个主机时,我不确定如何遍历 IPs.yaml 变量并在下次循环时提取下一个值运行。还有一种方法可以让我不使用字典 .yaml 变量,我可以只使用一个在换行符上有 IP 的原始文本文件吗?

基本上我想遍历并让主机在每个主机中显示这个 /etc/sysconfig/network-scripts/ifcfg-card-10Gb-1。

host1 = 'IPADDR=192.168.77.35'

host2 = 'IPADDR=192.168.77.36'

host3 = 'IPADDR=192.168.77.37'

最终目标是能够使用简单的文本文件而不是字典 yaml 文件在 100 多个主机上执行此操作,并且将包括多个变量等。所有系统都可以通过 dhcp/hostnames/IP.

用数据创建字典,例如

    - set_fact:
        _dict: '{{ dict(ansible_play_hosts|zip(IP)) }}'
      run_once: true

应该给

  _dict:
    host1: 192.168.77.35
    host2: 192.167.77.36
    host3: 192.168.77.37

然后使用这个字典和select IP,例如

    - name: Change 10G Interface Settings
      lineinfile:
        path: /etc/sysconfig/network-scripts/ifcfg-card-10Gb-1
        regexp: 'IPADDR='
        line: 'IPADDR={{ _dict[inventory_hostname] }}'
      when: teng.stat.exists

您可能想先测试一下,例如

    - name: Change 10G Interface Settings
      debug:
        msg: 'IPADDR={{ _dict[inventory_hostname] }}'

应该给

ok: [host2] => 
  msg: IPADDR=192.167.77.36
ok: [host1] => 
  msg: IPADDR=192.168.77.35
ok: [host3] => 
  msg: IPADDR=192.168.77.37

下一个选项不是创建字典,而是计算列表中的索引,例如应该给出相同的结果

    - name: Change 10G Interface Settings
      debug:
        msg: 'IPADDR={{ IP[_index|int] }}'
      vars:
        _index: '{{ ansible_play_hosts.index(inventory_hostname) }}'

问:"使用 IP 换行的原始文本文件"

A:创建文件,例如

shell> cat IP.txt 
192.168.77.35
192.167.77.36
192.168.77.37

即时创建列表,例如

    - set_fact:
        IP: "{{ lookup('file', 'IP.txt').split('\n') }}"
      run_once: true

应该给

  IP:
  - 192.168.77.35
  - 192.167.77.36
  - 192.168.77.37

更可靠的解决方案是将哈希值放入文件中,例如

shell> cat IP.txt
host1: 192.168.77.35
host2: 192.167.77.36
host3: 192.168.77.37

然后任务

    - include_vars:
        file: IP.txt
        name: _dict

应该创建字典

  _dict:
    host1: 192.168.77.35
    host2: 192.167.77.36
    host3: 192.168.77.37

但是,最简单的解决方案是将此字典存储在 IP.yml 中并将其放入目录 group_vars/all.