Ansible IP地址变量 - 主机部分

时间:2014-08-20 17:11:24

标签: shell variables ip ansible

我有以下问题:

我在Ansible的命令行上编写用于设置IP地址的playbook。让我们说10.10.10.x.我需要获取我的公共IP的最后一部分,比如x.x.x.15并将其分配给私有:10.10.10.15。这有变量吗?我能抓到一些吗?我试过使用类似的东西:

shell: "ip addr show | grep inet ...." 
register: host_ip

但这不是我需要的。它可以工作,但仅限于有限数量的服务器。

整个事情应该是这样的:

"shell: /dir/script --options 10.10.10.{{ var }}"

{{ var }}应该是公共IP的主机部分。

修改

谢谢!这是我的最终解决方案:

- name: Get the host part of the IP 
  shell: host {{ ansible_fqdn }} | awk '{print $4}' 
  register: host_ip 

{{ host_ip.stdout.split('.')[3] }}

稍后在剧本中使用它。

3 个答案:

答案 0 :(得分:11)

您可以使用ansible facts而不是使用系统实用程序,但您会发现接口名称因服务器而异。

您特别提到了我公共IP的最后一部分

如果您的意思是 公共IP ,您将需要使用外部服务来获取它,因为您的服务器可能位于NAT后面。这是一个选项

shell: wget -qO- http://ipecho.net/plain ; echo
register: host_ip

这会给你的公共IP,接下来你可以做的最后一个八位字节:

{{ host_ip.stdout.split('.')[3] }}

答案 1 :(得分:11)

如jarv所述,可以使用facts获得。

这可以通过以下方式完成:

有关所有ipv4地址的列表:

{{ ansible_default_ipv4.address }}

对于默认的ipv4地址:

{{ ansible_eth0.ipv4.address }} 

如果您知道IP地址在eth0接口上:

.split('.')[3]

然后,您可以将{{ ansible_default_ipv4.address.split('.')[3] }}方法附加到变量以获取适当的输出,例如layoutManager.setStackFromEnd(true);

答案 2 :(得分:0)

这是一种类似的方法:

- name: Get the local IP
  local_action:
      module: uri
      url: http://checkip.amazonaws.com/
      return_content: yes
  register: ip_lookup
- set_fact:
      local_ip: "{{ ip_lookup.content | regex_replace('\n','') }}"
- debug: var=local_ip