我一直在按照此示例手册使用 Ansible 创建机架空间服务器
http://nicholaskuechler.com/2015/01/09/build-rackspace-cloud-servers-ansible-virtualenv/
效果很好,但一次只能在一台服务器上运行,所以我试图使其更加动态,使用 with_items 循环我想要构建的服务器数量
tasks:
- name: Rackspace cloud server build request
local_action:
module: rax
credentials: "{{ credentials }}"
name: "{{ item }}"
flavor: "{{ flavor }}"
image: "{{ image }}"
region: "{{ region }}"
files: "{{ files }}"
wait: yes
state: present
networks:
- private
- public
with_items:
- server-app-01
- server-app-02
register: rax
这可以很好地创建服务器,但是当我尝试使用链接中的方法将其添加到部署组时,我收到一个错误,正如预期的那样,现在有一个“结果”键,我已经尝试了各种方法尝试以我认为文档所暗示的方式来尝试和瞄准这一点的方法:
- name: Add new cloud server to host group
local_action:
module: add_host
hostname: "{{ item.success.name }}"
ansible_ssh_host: "{{ item.success.rax_accessipv4 }}"
ansible_ssh_user: root
groupname: deploy
with_items: rax.results
(我还尝试了许多其他类型的方法来解决这个问题) 但我得到“一个或多个 undefined variable :‘列表对象’没有属性‘rax_accessipv4”
这是我通过调试从 rax 返回的对象的精简版本。这些服务器不再存在。 http://pastebin.com/NRvM7anS
谁能告诉我哪里出了问题,我开始有点生气了
最佳答案
如果您注意到rax.results.success
的类型是list
。
所以这样:主机名:“{{ item.success.name }}”
应该是
主机名:“{{ item.success[0].name }}”
或主机名:“{{ item['success'][0]['name'] }}”
.
{
"changed": true,
"msg": "All items completed",
"results": [
{
"instances": [
{
"name": "server-app-01",
"rax_accessipv4": "134.213.51.171",
"rax_accessipv6": "2a00:1a48:7808:101:be76:4eff:fe08:5251",
}
],
"item": "server-app-01",
"success": [
{
"name": "server-app-01",
"rax_accessipv4": "134.213.51.171",
"rax_accessipv6": "2a00:1a48:7808:101:be76:4eff:fe08:5251",
}
],
"timeout": []
},
......
}
关于json - 无法在循环中访问寄存器变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29542433/