我正在尝试从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.193
和54.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