繁体   English   中英

从ansible_facts重新格式化IP,无需过滤器

[英]Reformat ip from ansible_facts without filter

我正在尝试动态更新和重新格式化主机IP地址以供模板使用。 我需要获取主机IP,并将其从典型格式重新格式化为不支持过滤器的格式。

我对ansible很陌生。

但是,根据我的收集...

  1. 我应该能够从我的剧本中获取主机ip“事实”。 我正在努力使其能够运行的语法中,但我非常有信心这是我将能够做到的。

  2. 有了IP后,我需要将其从11.22.33.44重新格式化为11 \\\\。22 \\\\。33 \\\\。44。

到目前为止,我什至无法掌握正确的ip语法,更不用说重新格式化了。 关于格式,我已经对过滤器进行了搜索,但是没有找到任何(明确的)描述来表明过滤器方法可以按照我需要的方式进行格式化(尽管...我怀疑它存在)。

name: "test gathering a fact"
   debug: var= "{{ hostvars[groups['webservers'][0]]['ansible_eth0']['ipv4']['address'] }}"

我期望...

11.22.33.44

但我得到:

错误! 加载YAML时的语法错误。 找不到预期的密钥

该错误似乎出在'/home/my_playbook.yml'中:第14行,第13列,但可能在文件的其他位置,具体取决于确切的语法问题。

令人反感的行似乎是:

  -  name: "test gathering a fact"
        debug: var= "{{ hostvars[groups['webservers'][0]]['ansible_eth0']['ipv4']['address'] }}"
        ^ here

我们可能是错的,但是这看起来可能是缺少引号的问题。 当模板表达式括号开始值时,请始终用引号引起来。 例如:

with_items:
  - {{ foo }}

应写为:

with_items:
  - "{{ foo }}""

有了IP后,我需要将其从11.22.33.44重新格式化为11 \\\\。22 \\\\。33 \\\\。44。

- debug:
    msg: >-
      {{ the_host.ansible_default_ipv4.address | regex_replace('\.', '\\\\.') }}
    # watch out if you choose not to use the `>-` syntax
    # as then yaml quoting will become a real PITA
    vars:
      the_host: '{{ hostvars[groups.webservers[0]] }}'

对于不总是使用eth0 (这是一些现代的ubuntu风格,freebsd等),使用ansible_default_ipv4.address而不是ansible_eth0.ipv4.address也可能会更快乐。 也就是说,您可能关心的是计算机的网络身份,而不是(特别是)将什么地址绑定到名为eth0的NIC上。

缩进是错误的。 代替

- name: "test gathering a fact"
     debug: var= ...

正确的语法是

- name: "test gathering a fact"
  debug: var= ...

我更喜欢使用点符号:

  - name: first debug
    debug:
      msg: "{{ hostvars[groups['webservers'][0]].ansible_enp0s25.ipv4.address }}"

该代码在输出中返回:

TASK [first debug] **********************************************************************
ok: [localhost] => {
    "msg": "192.168.65.105"
}

因此,将它们合并到本剧本中:

---
- hosts: all
  gather_facts: true

  tasks:
  - name: first debug
    debug:
      msg: "{{ hostvars[groups['webservers'][0]].ansible_enp0s25.ipv4.address }}"

  - name: second debug
    debug:
      msg: >-
        {{ hostvars[groups['webservers'][0]].ansible_enp0s25.ipv4.address | regex_replace('\.', '\\\\.') }}

给出以下输出:

PLAY [all] ******************************************************************************

TASK [Gathering Facts] ******************************************************************
ok: [localhost]

TASK [first debug] **********************************************************************
ok: [localhost] => {
    "msg": "192.168.65.105"
}

TASK [second debug] *********************************************************************
ok: [localhost] => {
    "msg": "192\\\\.168\\\\.65\\\\.105"
}

PLAY RECAP ******************************************************************************
localhost                  : ok=3    changed=0    unreachable=0    failed=0   

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM