我正在创建 Ansible 剧本,它将在 AWS 中创建我们系统的基础设施。显然,这涉及到使用 ec2.py 的动态清单。
我首先创建一个实用程序服务器,然后创建一个 Web 服务器,并且我为每个服务器都创建了一个单独的剧本。Web 服务器上有一些文件,需要使用模板添加实用程序服务器的私有 IP。
检索实用程序服务器的私有 IP 以供在 Web 服务器的剧本中使用的最佳方法是什么?
答案1
服务器的 IP 是主机可发现信息的一部分。除非您明确禁用,否则运行剧本时会自动检索这些信息gather_facts
。
即使如此,你也可以明确使用setup
模块来收集事实。
这些值随后可在接下来的任务中使用。
举个例子:
$ ansible -c local -m setup -a 'filter=ansible_*address*' localhost
127.0.0.1 | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"172.17.0.1",
"192.168.122.1",
"192.168.0.12",
"172.18.0.1"
],
"ansible_all_ipv6_addresses": [
"fe80::e8b5:946f:410b:aff5"
]
},
"changed": false
}
答案2
存在三个问题:
- 您需要来自另一台服务器的信息以便在当前正在配置的服务器中使用。
- 您需要信息的另一台服务器托管在 AWS 中。
- 您需要访问其信息的其他服务器有一个变量名。
解决方案3是在命令行中使用 extra-vars 指定变量,如下所示:ansible-playbook -i ./ec2.py --extra-vars “chaos=test” aws_playground.yaml
解决方案2是从 hostvars 的 groups 变量中找到所需的主机名。与上面的 3 结合使用时,您需要类似以下内容:- 调试:var=hostvars[groups['tag_Name_'+chaos+'_util'][0]].ansible_all_ipv4_addresses[0]
解决方案1是在处理您正在配置的服务器之前先从其他服务器收集事实。下面是一个将所有这些信息收集到一个地方的剧本:
# Called like: ansible-playbook -i ./ec2.py --extra-vars "chaos=test" aws_playground.yaml
- name: Collect our facts on util
hosts: "tag_Name_{{ chaos }}_util"
tasks: [ ]
- name: Set up a web server
hosts: "tag_Name_{{ chaos }}_web"
tasks:
- debug: var=hostvars[groups['tag_Name_'+chaos+'_util'][0]].ansible_all_ipv4_addresses[0]