微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 Ansible 将 IP 添加到从 10.x.x.66..10.x.x.83 迭代的 18 个 VM 上的 Linux 主机文件

如何解决如何使用 Ansible 将 IP 添加到从 10.x.x.66..10.x.x.83 迭代的 18 个 VM 上的 Linux 主机文件

所以,我有一个使用主机文件模板的剧本来更新或恢复 18 个特定 Linux 虚拟机上的主机文件文件末尾的条目如下所示:

10.x.x.66 fooconnect

上面的例子是在 18 个虚拟机中的第 1 个,第 18 个虚拟机看起来像:

10.x.x.83 fooconnect

通常,该主机名会解析为 VIP。但是,我们在一些负载测试中发现,将每个前端 VM 直接指向后端 VM 可能是有益的。因此,我的目标是拥有一个剧本,可以更新主机名解析为上述范围的内容,或者将其恢复为 VIP(恢复仅使用模板完成——这部分工作正常)。

我不确定的是如何在 Ansible 中实现这一点。有没有办法使用 jinja2 模板“for 循环”来遍历 IP?或者也许使用带有一些循环魔法的 lineinfile ?

这是我的 Ansible 角色示例。目前我正在使用一个脏 shell 命令来创建我的 IP 列表......欢迎提出更好的实现方法的建议。

- name: Add a line to a hosts file using a template
  template:
    src: "{{ srcfile }}"
    dest: "{{ destfile }}"
    owner: "{{ own_var }}"
    group: "{{ grp_var }}"
    mode: "{{ mode_var }}"
    backup: yes

- name: Get the IPs
  shell: "COUNTER=66;for i in {66..83};do echo 10.x.x.$i;((COUNTER++));done"
  register: pobs_ip

- name: Add a line
  lineinfile:
    path: /etc/hosts
    line: "{{item}}    fooconnect"  #Ideally would want "item" to just be one IP and not 
    insertafter: EOF                #the entire list as it would be like this.
  loop: "{{pobsips}}"

VARs 文件

pobsips:
  - "{{pobs_ip.stdout}}"

解决方法

我们可以临时使用 shellset_fact 来临时创建 IP 地址范围,而不是使用 range 任务。一旦我们在“列表”中获得了 IP 地址范围,我们就可以用它循环 lineinfile 并实现这一点。

示例:

    - name: create a range of IP addresses in a variable my_range
      set_fact:
        my_range: "{{ my_range|default([]) + [ '10.1.1.' ~ item ] }}"
      loop: "{{ range(66,84)|list }}"
    - name: Add a line to /etc/hosts
      lineinfile:
        path: /etc/hosts
        line: "{{ item }} fooconnect"
        insertafter: EOF
      loop: "{{ my_range }}"

更新答案:

如果我们想在每个主机的 /etc/hosts 文件中添加仅 1 行,并且 IP 地址递增,还有另一种方法。

  • 为此,我们可以使用 ipaddr filteripmath 来获取给定 IP 地址的下一个 IP 地址。
  • 使用 ansible_play_hosts 获取正在运行播放的主机列表
  • 设置索引变量 index_varwhen 条件以仅在 ansible_hostnameinventory_hostname 匹配时更新文件。
  • 使用 serialrun_once 标志连续运行 playbook,并且每次仅在主机上运行一次。

让我们考虑一个示例清单文件,例如:

[group_1]
host1
host2
host3
host4
...

然后在剧本中:

- hosts: group_1
  serial: 1

  vars:
    start_ip: 10.1.1.66

  tasks:
    - name: Add a line to /etc/hosts
      lineinfile:
        path: "/tmp/hosts"
        line: "{{ start_ip|ipmath(my_idx) }} fooserver"
        insertafter: EOF
      loop: "{{ ansible_play_hosts }}"
      loop_control:
        index_var: my_idx
      run_once: true
      when: item == inventory_hostname      

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。