在 ansible 中从 json 中提取数据
Extracting data from json within ansible
我有一个在 AWS 中创建一些 IAM 用户的 ansible 剧本。
我希望剧本 return 为每个创建的帐户提供用户名和访问密钥详细信息。
注册任务的输出非常简单:
- name: Create IAM users
iam:
iam_type: user
name: "{{ item }}"
state: present
access_key_state: create
with_items:
- "user1"
- "someotheruser"
- "user3"
register: users
我发现用那个输出做一些事情很棘手。
它产生的Json如下:(这里稍微截断以减少长度)
ok: [localhost] => {
"users": {
"changed": true,
"msg": "All items completed",
"results": [
"user_meta": {
"access_keys": [
{
"access_key_id": "key1",
"access_key_selector": "HMAC",
"create_date": "2016-05-19T08:37:11.007Z",
"secret_access_key": "secretkey1",
"status": "Active",
"user_name": "user1"
}
],
}
},
{
"user_meta": {
"access_keys": [
{
"access_key_id": "key2",
"access_key_selector": "HMAC",
"create_date": "2016-05-19T08:37:13.391Z",
"secret_access_key": "secretkey2",
"status": "Active",
"user_name": "someotheruser"
}
],
}
},
{
"user_meta": {
"access_keys": [
{
"access_key_id": "key3",
"access_key_selector": "HMAC",
"create_date": "2016-05-19T08:37:16.243Z",
"secret_access_key": "secretkey3",
"status": "Active",
"user_name": "user3"
}
],
}
}
]
}
}
我想在剧本完成时整齐地显示它,我最接近得到我所追求的是使用调试如下:
- debug: var="users.results[0].user_meta.access_keys"
- debug: var="users.results[1].user_meta.access_keys"
- debug: var="users.results[2].user_meta.access_keys"
然而,这感觉很蹩脚。如果我添加用户 4 和 5 会怎样?
我希望能够引用整个结果数组,这样无论我向剧本中添加多少用户,它都能正常工作。
有办法实现吗?
作为旁注,我也尝试使用 from_json,例如
- debug: msg="{{ (users.stdout|from_json).results }}"
但我不知道我是否遇到了 ansible 2.0.1.0 的错误,或者我是否使用错误但我只能得到 "type error. expected string or buffer"
很高兴收到任何想法。
您也可以遍历已注册的变量。
像这样的东西应该可以工作:
- name : debug access keys
debug : var="{{ item.user_meta.access_keys }}"
with_items: users.results
万一其他人想做同样的事情...
我发现对我来说最好的解决方案是使用 'length' 计算数组中对象的数量,然后设置调试应该迭代的范围。
我从返回值中减去“1”,因为数组中的第一个对象被“0”引用。
- name: Record Users Access Keys
debug: var=users.results[{{ item }}].user_meta.access_keys
with_sequence: start=0 end={{users.results|length -1}}
希望对希望做类似事情的人有所帮助。
Ansiballer 的回答对我有用,但如果其他人正在寻找更简单的方法,您可以使用 json_query:
- name: show access keys
debug:
var: item
loop: "{{ users | json_query('results[*].user_meta.access_keys') }}"
您可能需要安装 jmespath 才能正常工作(apt-get install python-jmespath
或类似)
我有一个在 AWS 中创建一些 IAM 用户的 ansible 剧本。 我希望剧本 return 为每个创建的帐户提供用户名和访问密钥详细信息。
注册任务的输出非常简单:
- name: Create IAM users
iam:
iam_type: user
name: "{{ item }}"
state: present
access_key_state: create
with_items:
- "user1"
- "someotheruser"
- "user3"
register: users
我发现用那个输出做一些事情很棘手。 它产生的Json如下:(这里稍微截断以减少长度)
ok: [localhost] => {
"users": {
"changed": true,
"msg": "All items completed",
"results": [
"user_meta": {
"access_keys": [
{
"access_key_id": "key1",
"access_key_selector": "HMAC",
"create_date": "2016-05-19T08:37:11.007Z",
"secret_access_key": "secretkey1",
"status": "Active",
"user_name": "user1"
}
],
}
},
{
"user_meta": {
"access_keys": [
{
"access_key_id": "key2",
"access_key_selector": "HMAC",
"create_date": "2016-05-19T08:37:13.391Z",
"secret_access_key": "secretkey2",
"status": "Active",
"user_name": "someotheruser"
}
],
}
},
{
"user_meta": {
"access_keys": [
{
"access_key_id": "key3",
"access_key_selector": "HMAC",
"create_date": "2016-05-19T08:37:16.243Z",
"secret_access_key": "secretkey3",
"status": "Active",
"user_name": "user3"
}
],
}
}
]
}
}
我想在剧本完成时整齐地显示它,我最接近得到我所追求的是使用调试如下:
- debug: var="users.results[0].user_meta.access_keys"
- debug: var="users.results[1].user_meta.access_keys"
- debug: var="users.results[2].user_meta.access_keys"
然而,这感觉很蹩脚。如果我添加用户 4 和 5 会怎样? 我希望能够引用整个结果数组,这样无论我向剧本中添加多少用户,它都能正常工作。
有办法实现吗?
作为旁注,我也尝试使用 from_json,例如
- debug: msg="{{ (users.stdout|from_json).results }}"
但我不知道我是否遇到了 ansible 2.0.1.0 的错误,或者我是否使用错误但我只能得到 "type error. expected string or buffer"
很高兴收到任何想法。
您也可以遍历已注册的变量。
像这样的东西应该可以工作:
- name : debug access keys
debug : var="{{ item.user_meta.access_keys }}"
with_items: users.results
万一其他人想做同样的事情...
我发现对我来说最好的解决方案是使用 'length' 计算数组中对象的数量,然后设置调试应该迭代的范围。
我从返回值中减去“1”,因为数组中的第一个对象被“0”引用。
- name: Record Users Access Keys
debug: var=users.results[{{ item }}].user_meta.access_keys
with_sequence: start=0 end={{users.results|length -1}}
希望对希望做类似事情的人有所帮助。
Ansiballer 的回答对我有用,但如果其他人正在寻找更简单的方法,您可以使用 json_query:
- name: show access keys
debug:
var: item
loop: "{{ users | json_query('results[*].user_meta.access_keys') }}"
您可能需要安装 jmespath 才能正常工作(apt-get install python-jmespath
或类似)