使用with_项连接字符串,并将其分配给Ansible中的变量

使用with_项连接字符串,并将其分配给Ansible中的变量,ansible,ansible-2.x,ansible-inventory,ansible-facts,Ansible,Ansible 2.x,Ansible Inventory,Ansible Facts,在启动ec2_实例时,我需要将两个IP保存到vars_文件中的一个变量中,稍后在部署期间使用这些实例 这就是我保存单服务器ip的方式: - name: Save server public IP to vars file lineinfile: line="server_public_ip{{':'}} {{ item.public_ip }}" dest="{{ansible_env.HOME}}/dynamic_ips_{{ec2_environment}}"

在启动ec2_实例时,我需要将两个IP保存到vars_文件中的一个变量中,稍后在部署期间使用这些实例

这就是我保存单服务器ip的方式:

- name: Save server public IP to vars file
  lineinfile: line="server_public_ip{{':'}} {{ item.public_ip }}"
              dest="{{ansible_env.HOME}}/dynamic_ips_{{ec2_environment}}"
  with_items: server.instances  #server is registered in previous task
我在动态\u ips文件中的输出是
服务器\u公共\u ip:xxx.xxx.xx.x

现在我已经启动了2台服务器并注册为服务器

我需要将此保存为服务器公共IP:xxx.xx.x.xx,xxx.x.xx.x

我试图声明一个空字符串并向其附加IP,类似这样,但我得到了错误

set_fact:
   ips: ""
set_fact:
   ips: " {{ ips }} + {{ item.public_ip}} "
with_items: servers.instances  #servers is registered in previous task
lineinfile: line="server_public_ips{{':'}} {{ ips }}"
            dest="{{ansible_env.HOME}}/dynamic_ips_{{ec2_environment}}"
我认为可以使用lineinfle insertafter和regex来完成

最后,我需要在另一台服务器上执行此操作

- name: Restrict access to outside world
  command: iptables INPUT {{ item }} ACCEPT
  with_items: {{ server_public_ips }}.split(,) #grant access for each ip 
  command: iptables INPUT DROP

当servers.instances是一个列表时,实际上应该可以工作。

此代码中有很多语法错误。。。为什么首先需要在静态文件中存储动态IP?您应该在运行时查询它们。@KonstantinSuvorov如何在运行时查询IP。我只有ec2实例名。是否可以在运行时使用实例名获取IP?我还有两个同名的实例。非常感谢您的帮助。servers.instances是列表吗?服务器是json。那么,使用from_json方法将json转换为dict
set_fact:
   ips: " {{servers.instances | join(',') }} "