循环输入文件/变量中的可解析ec2主机名



我正在尝试从Ansible为AWS EC2实例分配主机名,它是从Terraform和Jenkins提供的。我已经从Terraform中提取了主机名输出,并存储为input.txt文件,我想调用input.txt文件来传递主机名值。

我试过下面的剧本,但结果并不理想
预期输出应为

  • host1: test1
  • host2: test2
---
- hosts: main
become: true

tasks:
- name: Configure hostname
win_hostname:
name: "{{ item }}"
register: result
with_items: "{{lookup( 'file', 'input.txt').split('n') }}"

这就产生了

TASK [Configure hostname] ****************************************************
changed: [13.57.245.193] => (item=test1)
changed: [54.193.219.112] => (item=test1)
changed: [13.57.245.193] => (item=test2)
changed: [54.193.219.112] => (item=test2)

input.txt

test1
test2

在这种情况下,您不必循环,以一组主机为目标实际上会在所有主机上执行相同的任务
如果您确实向任务添加了一个循环,则同一任务将在所有主机上重复循环中项目数的倍数,即:此处,循环中有两个主机和两个项目:2x2=4

尽管你真的应该考虑使用一种更稳健的方法,比如在Terraform中标记你的EC2,然后在动态EC2清单中使用标签中的信息,但你可以做的是使用Ansible当前目标主机的位置,将其与input.txt文件中的位置相匹配。

这可以在ansible_play_hosts_all特殊变量的帮助下实现。

给定任务:

- name: Configure hostname
win_hostname:
name: "{{ _hostnames[_position | int] }}"
register: hostname_result
vars:
_hostnames: "{{ lookup('file', 'input.txt').split('n') }}"
_position: "{{ ansible_play_hosts_all.index(inventory_hostname) }}"

您将获得您期望分配给主机的主机名。

这里的问题似乎是它从2主机运行

---
- hosts: main

main似乎具有13.57.245.19354.193.219.112。您应该从库存文件中删除其中一个


如果这不是一个选项,您可以像以下一样配置main主机

[main]
test1 ansible_host=13.57.245.193
test2 ansible_host=54.193.219.112

然后你为任务

- name: Configure hostname
win_hostname:
name: "{{ inventory_hostname }}"
register: result

相关内容

  • 没有找到相关文章

最新更新