我有这样的广告资源:
[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
模块,因为剧本在不同的阶段运行
有更好的方法吗? 感谢
答案 0 :(得分:0)
好的,经过测试,我想我明白你想要实现的目标。
这里有几个部分:
库存文件是这样的:
vpn-server ansible_host="{{ env_cidr_prefix}}.0.1"
您正在尝试替换文件中不存在的172.25.0.1
字面值。您有"{{ env_cidr_prefix}}.0.1"
而不是172.25.0.1
。
选项:
如果您想要替换这种方式,可以在角色中使用Jinja2文件,以与尝试相同的方式替换变量和库存文件。
覆盖Jenkins的/ etc / hosts文件(我真的不太喜欢)并使用主机名。
在剧本中使用您的主机变量,例如:
主持Playbooks:
- name : Test
hosts: "{{ variable_vpn_ip | default('vpn-server') }}"
并将其称为从您将更改的变量中读取或:
ansible-playbook play.yml -e "variable_vpn_ip=172.25.0.1"