当前位置: 首页 > 知识库问答 >
问题:

Ansible库存:替换问题

尹臻
2023-03-14

我有一个这样的清单:

[all:vars]
env_cidr_prefix='172.25'
antother_var="foo"

[VPN_SERVER]
vpn-server ansible_host="{{ env_cidr_prefix}}.0.1" 

在ansible playbook期间,库存只保存私有ip地址。我不想用公共ip替换“ansible_host=”的内容

- name: grab the vpn public_ip
  set_fact: PUBLIC_IP="{{ instance_eip.public_ip }}"
  when: inventory_hostname |search("vpn-server")

- name: update inventory with the vpn public ip
  replace:
     path: "{{ inventory_file }}"
     regexp: "{{ ansible_host }}"
     replace: "{{ PUBLIC_IP }}"
  when: inventory_hostname |search("vpn-server")
ansible_host="172.25.0.1"
ansible_host="{{ env_cidr_prefix}}.0.1" 
ok: [vpn-server] => {
    "changed": false,
    "invocation": {
        "module_args": {
            "after": null,
            "attributes": null,
            "backup": false,
            "before": null,
            "content": null,
            "delimiter": null,
            "directory_mode": null,
            "encoding": "utf-8",
            "follow": false,
            "force": null,
            "group": null,
            "mode": null,
            "owner": null,
            "path": "/home/toluna/ansible/openvpn/env.properties",
            "regexp": "172.25.0.11",
            "remote_src": null,
            "replace": "1.1.1.1",
            "selevel": null,
            "serole": null,
            "setype": null,
            "seuser": null,
            "src": null,
            "unsafe_writes": null,
            "validate": null
        }
    },
    "msg": ""
}

注意,我不能使用add_host模块,因为剧本在不同的阶段运行

有没有更好的方法做这件事?谢谢

共有1个答案

莫振
2023-03-14

好的,经过测试,我想我明白你想要实现什么。

这里有几个部分:

库存文件如下所示:

vpn-server ansible_host="{{ env_cidr_prefix}}.0.1" 
- name : Test
  hosts: "{{ variable_vpn_ip | default('vpn-server') }}"

并将其称为从一个您将特别更改的变量中读取,或者:

ansible-playbook play.yml -e "variable_vpn_ip=172.25.0.1"
 类似资料:
  • 我试图使用多个清单文件和动态清单与Ansible1.4和开发。Ansible返回不匹配的主机。 我有一个模拟的场景,在一个目录中有两个主机文件测试,目录的内容被列出。

  • 正确的方法是什么?

  • 目前,我正在使用执行以下操作: 如果我想从我的项目中移除依赖项,那么使用标准JRE库的的工作和最小化实现是什么呢? 注: 的工作方式如下: resolvedString=“敏捷的棕色狐狸跳过了懒惰的狗。”

  • 问题内容: 目前,我正在这样做: 考虑到我想从项目中删除依赖的事实,使用标准JRE库将是一种可行且简单的实现方式吗? 注意事项 : 像这样工作: 产生resolveString =“快速的棕狐跳过了懒狗。 问题答案: 如果性能不是优先事项,则 可以使用类的方法: 一个更高性能但更丑陋的版本,只是为了好玩:) 根据我的测试,它大约是regex版本的2倍,比apache commons版本的3倍快。因

  • 问题内容: 如果给定其他配置文件,则rebar不会自动重建文件。因此,我尝试在Makefile级别上执行此操作: 希望的意图很明显:当我使用需要特定配置文件的目标时,请检查上次是否使用了相同的文件;运行并记录我们现在使用的配置。 但这不起作用,并且文件会不断重新编译: 尽管config.tmp包含“ normal”: 我想念什么? 问题答案: 在定义变量时,您缺少用于实际调用外部程序的部分。

  • 我正在使用Ansible来设置EC2实例并部署一个应用程序。有一个hosts脚本,它收集标签、相关服务器和分组信息。我想把这些动作作为一个剧本来运行,所以 如果需要,将创建新实例 主机脚本加载清单(包括服务器的事实) 部署剧本有效 但我还没找到一个命令让它翻倍。