在Ansible标准输出中提取关键值并作为变量使用



我想从标准输出中获取一个键的值,并将其用作变量。这是我的剧本:

---
- name: Get bastion host info
hosts: localhost
connection: local
vars:
rgname: 'newrg'
bastionname: 'bhname'
tasks:
- name: Get bastion host info
shell: >
az network bastion show --name "{{ bastionname }}" --resource-group "{{ rgname }}"
register: bastionhost
- set_fact:
bh: "{{ bastionhost.stdout | regex_search ('dnsName(.+)', '\1') | first }}"
- name: Add bastion dnsName to group_vars file
ansible.builtin.lineinfile:
path: /home/user/group_vars/pprod.yml
line: 'ansible_ssh_common_args: ''-o ProxyCommand="ssh -W %h:%p -q user@"{{ bh }}""'''
create: yes

当我运行剧本时,这里是标准输出:

"stdout": "{n  "dnsName": "bst-38b12345-fb01-60c0-ba73-dfb8f18a5f09.bastion.azure.com",n  "etag": "W/\"402a91d0-74c2-41de-8d45-91eadab53d4a\"",n  "id": "/subscriptions/1234578-1234-1234-5678-65e084b98765/resourceGroups/newrg/providers/Microsoft.Network/bastionHosts/bhname",n  "ipConfigurations": [n    {n      "etag": "W/\"402a91d0-74c2-41de-8d45-91eadab53d4a\"",n      "id": "/subscriptions/1234578-1234-1234-5678-65e084b98765/resourceGroups/newrg/providers/Microsoft.Network/bastionHosts/bhname/bastionHostIpConfigurations/bastion_ip_config",n      "name": "bastion_ip_config",n      "privateIpAllocationMethod": "Dynamic",n      "provisioningState": "Succeeded",n      "publicIpAddress": {n        "id": "/subscriptions/1234578-1234-1234-5678-65e084b98765/resourceGroups/newrg/providers/Microsoft.Network/publicIPAddresses/pip",n        "resourceGroup": "newrg"n      },n      "resourceGroup": "newrg",n      "subnet": {n        "id": "/subscriptions/1234578-1234-1234-5678-65e084b98765/resourceGroups/newrg/providers/Microsoft.Network/virtualNetworks/vnet/subnets/AzureBastionSubnet",n     "resourceGroup": "newrg"n      },n      "type": "Microsoft.Network/bastionHosts/bastionHostIpConfigurations"n    }n  ],n  "location": "southeastasia",n  "name": "bhname",n  "provisioningState": "Succeeded",n  "resourceGroup": "newrg",n  "tags": null,n  "type": "Microsoft.Network/bastionHosts"n}",

剧中的台词:

"line": "ansible_ssh_common_args: '-o ProxyCommand="ssh -W %h:%p -q user@"": "bst-38b12345-fb01-60c0-ba73-dfb8f18a5f09.bastion.azure.com",""'",

文件中的结果:

user@Azure:~$ cat group_vars/pprod.yml
ansible_ssh_common_args: '-o ProxyCommand="ssh -W %h:%p -q user@"": "bst-38b12345-fb01-60c0-ba73-dfb8f18a5f09.bastion.azure.com",""'
user@Azure:~$

查看如何仅提取dnsName值(不带引号和逗号),以便pprod。Yml将有:

ansible_ssh_common_args: '-o ProxyCommand="ssh -W %h:%p -q user@bst-38b12345-fb01-60c0-ba73-dfb8f18a5f09.bastion.azure.com"'

谢谢你的帮助。谢谢你

编辑:共享调试输出。我在一个文件中捕获json,以便更容易引用(敏感数据被屏蔽掉):

[root@localhost ~]#
[root@localhost ~]# cat bastion.json
{
"changed": true,
"cmd": "az network bastion show --name "bastion-name" --resource-group "rg-name"n",
"delta": "0:00:01.032269",
"end": "2021-03-05 21:34:10.861829",
"invocation": {
"module_args": {
"_raw_params": "az network bastion show --name "bastion-name" --resource-group "rg-name"n",
"_uses_shell": true,
"argv": null,
"chdir": null,
"creates": null,
"executable": null,
"removes": null,
"stdin": null,
"stdin_add_newline": true,
"strip_empty_ends": true,
"warn": true
}
},
"rc": 0,
"start": "2021-03-05 21:34:09.829560",
"stderr": "WARNING: Command group 'network bastion' is in preview and under development. Reference and support levels: https://aka.ms/CLI_refstatus",
"stderr_lines": [
"WARNING: Command group 'network bastion' is in preview and under development. Reference and support levels: https://aka.ms/CLI_refstatus"
],
"stdout": "{n  "dnsName": "bst-38b12345-fb01-60c0-ba73-dfb8f18a5f09.bastion.azure.com",n  "etag": "W/\"123a10d0-66c2-55de-8d12-65aeiou45d8b\"",n  "id": "/subscriptions/70b030a1-10f6-9876-9ea8-11e084b12345/resourceGroups/rg-name/providers/Microsoft.Network/bastionHosts/bastion-name",n  "ipConfigurations": [n    {n      "etag": "W/\"123a10d0-66c2-55de-8d12-65aeiou45d8b\"",n      "id": "/subscriptions/70b030a1-10f6-9876-9ea8-11e084b12345/resourceGroups/rg-name/providers/Microsoft.Network/bastionHosts/bastion-name/bastionHostIpConfigurations/bastion_ip_config",n      "name": "bastion_ip_config",n      "privateIpAllocationMethod": "Dynamic",n      "provisioningState": "Succeeded",n      "publicIpAddress": {n        "id": "/subscriptions/70b030a1-10f6-9876-9ea8-11e084b12345/resourceGroups/rg-name/providers/Microsoft.Network/publicIPAddresses/bastion-publicip",n        "resourceGroup": "rg-name"n      },n      "resourceGroup": "rg-name",n      "subnet": {n        "id": "/subscriptions/70b030a1-10f6-9876-9ea8-11e084b12345/resourceGroups/rg-name/providers/Microsoft.Network/virtualNetworks/vnet-name/subnets/AzureBastionSubnet",n     "resourceGroup": "rg-name"n      },n      "type": "Microsoft.Network/bastionHosts/bastionHostIpConfigurations"n    }n  ],n  "location": "southeastasia",n  "name": "bastion-name",n  "provisioningState": "Succeeded",n  "resourceGroup": "rg-name",n  "tags": null,n  "type": "Microsoft.Network/bastionHosts"n}",
"stdout_lines": [
"{",
"  "dnsName": "bst-38b12345-fb01-60c0-ba73-dfb8f18a5f09.bastion.azure.com",",
"  "etag": "W/\"123a10d0-66c2-55de-8d12-65aeiou45d8b\"",",
"  "id": "/subscriptions/70b030a1-10f6-9876-9ea8-11e084b12345/resourceGroups/rg-name/providers/Microsoft.Network/bastionHosts/bastion-name",",
"  "ipConfigurations": [",
"    {",
"      "etag": "W/\"123a10d0-66c2-55de-8d12-65aeiou45d8b\"",",
"      "id": "/subscriptions/70b030a1-10f6-9876-9ea8-11e084b12345/resourceGroups/rg-name/providers/Microsoft.Network/bastionHosts/bastion-name/bastionHostIpConfigurations/bastion_ip_config",",
"      "name": "bastion_ip_config",",
"      "privateIpAllocationMethod": "Dynamic",",
"      "provisioningState": "Succeeded",",
"      "publicIpAddress": {",
"        "id": "/subscriptions/70b030a1-10f6-9876-9ea8-11e084b12345/resourceGroups/rg-name/providers/Microsoft.Network/publicIPAddresses/bastion-publicip",",
"        "resourceGroup": "rg-name"",
"      },",
"      "resourceGroup": "rg-name",",
"      "subnet": {",
"        "id": "/subscriptions/70b030a1-10f6-9876-9ea8-11e084b12345/resourceGroups/rg-name/providers/Microsoft.Network/virtualNetworks/vnet-name/subnets/AzureBastionSubnet",",
"        "resourceGroup": "rg-name"",
"      },",
"      "type": "Microsoft.Network/bastionHosts/bastionHostIpConfigurations"",
"    }",
"  ],",
"  "location": "southeastasia",",
"  "name": "bastion-name",",
"  "provisioningState": "Succeeded",",
"  "resourceGroup": "rg-name",",
"  "tags": null,",
"  "type": "Microsoft.Network/bastionHosts"",
"}"
]
}[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# vi getjsonvalue.yml
[root@localhost ~]#
[root@localhost ~]# cat getjsonvalue.yml
---
- name: Get json data and write to file
hosts: localhost
connection: local
tasks:
- name: Get bastion host info
shell: cat bastion.json
register: bastionhost
- debug: msg={{ bastionhost.stdout | from_json }}
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# ansible-playbook getjsonvalue.yml
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'
PLAY [Get json data and write to file] *********************************************************************************************************************************
TASK [Gathering Facts] *************************************************************************************************************************************************
ok: [localhost]
TASK [Get bastion host info] *******************************************************************************************************************************************
changed: [localhost]
TASK [debug] ***********************************************************************************************************************************************************
ok: [localhost] => {
"msg": {
"changed": true,
"cmd": "az network bastion show --name "bastion-name" --resource-group "rg-name"n",
"delta": "0:00:01.032269",
"end": "2021-03-05 21:34:10.861829",
"invocation": {
"module_args": {
"_raw_params": "az network bastion show --name "bastion-name" --resource-group "rg-name"n",
"_uses_shell": true,
"argv": null,
"chdir": null,
"creates": null,
"executable": null,
"removes": null,
"stdin": null,
"stdin_add_newline": true,
"strip_empty_ends": true,
"warn": true
}
},
"rc": 0,
"start": "2021-03-05 21:34:09.829560",
"stderr": "WARNING: Command group 'network bastion' is in preview and under development. Reference and support levels: https://aka.ms/CLI_refstatus",
"stderr_lines": [
"WARNING: Command group 'network bastion' is in preview and under development. Reference and support levels: https://aka.ms/CLI_refstatus"
],
"stdout": "{n  "dnsName": "bst-38b12345-fb01-60c0-ba73-dfb8f18a5f09.bastion.azure.com",n  "etag": "W/\"123a10d0-66c2-55de-8d12-65aeiou45d8b\"",n  "id": "/subscriptions/70b030a1-10f6-9876-9ea8-11e084b12345/resourceGroups/rg-name/providers/Microsoft.Network/bastionHosts/bastion-name",n  "ipConfigurations": [n    {n      "etag": "W/\"123a10d0-66c2-55de-8d12-65aeiou45d8b\"",n      "id": "/subscriptions/70b030a1-10f6-9876-9ea8-11e084b12345/resourceGroups/rg-name/providers/Microsoft.Network/bastionHosts/bastion-name/bastionHostIpConfigurations/bastion_ip_config",n      "name": "bastion_ip_config",n      "privateIpAllocationMethod": "Dynamic",n      "provisioningState": "Succeeded",n      "publicIpAddress": {n        "id": "/subscriptions/70b030a1-10f6-9876-9ea8-11e084b12345/resourceGroups/rg-name/providers/Microsoft.Network/publicIPAddresses/bastion-publicip",n        "resourceGroup": "rg-name"n      },n      "resourceGroup": "rg-name",n      "subnet": {n        "id": "/subscriptions/70b030a1-10f6-9876-9ea8-11e084b12345/resourceGroups/rg-name/providers/Microsoft.Network/virtualNetworks/vnet-name/subnets/AzureBastionSubnet",n     "resourceGroup": "rg-name"n      },n      "type": "Microsoft.Network/bastionHosts/bastionHostIpConfigurations"n    }n  ],n  "location": "southeastasia",n  "name": "bastion-name",n  "provisioningState": "Succeeded",n  "resourceGroup": "rg-name",n  "tags": null,n  "type": "Microsoft.Network/bastionHosts"n}",
"stdout_lines": [
"{",
"  "dnsName": "bst-38b12345-fb01-60c0-ba73-dfb8f18a5f09.bastion.azure.com",",
"  "etag": "W/\"123a10d0-66c2-55de-8d12-65aeiou45d8b\"",",
"  "id": "/subscriptions/70b030a1-10f6-9876-9ea8-11e084b12345/resourceGroups/rg-name/providers/Microsoft.Network/bastionHosts/bastion-name",",
"  "ipConfigurations": [",
"    {",
"      "etag": "W/\"123a10d0-66c2-55de-8d12-65aeiou45d8b\"",",
"      "id": "/subscriptions/70b030a1-10f6-9876-9ea8-11e084b12345/resourceGroups/rg-name/providers/Microsoft.Network/bastionHosts/bastion-name/bastionHostIpConfigurations/bastion_ip_config",",
"      "name": "bastion_ip_config",",
"      "privateIpAllocationMethod": "Dynamic",",
"      "provisioningState": "Succeeded",",
"      "publicIpAddress": {",
"        "id": "/subscriptions/70b030a1-10f6-9876-9ea8-11e084b12345/resourceGroups/rg-name/providers/Microsoft.Network/publicIPAddresses/bastion-publicip",",
"        "resourceGroup": "rg-name"",
"      },",
"      "resourceGroup": "rg-name",",
"      "subnet": {",
"        "id": "/subscriptions/70b030a1-10f6-9876-9ea8-11e084b12345/resourceGroups/rg-name/providers/Microsoft.Network/virtualNetworks/vnet-name/subnets/AzureBastionSubnet",",
"        "resourceGroup": "rg-name"",
"      },",
"      "type": "Microsoft.Network/bastionHosts/bastionHostIpConfigurations"",
"    }",
"  ],",
"  "location": "southeastasia",",
"  "name": "bastion-name",",
"  "provisioningState": "Succeeded",",
"  "resourceGroup": "rg-name",",
"  "tags": null,",
"  "type": "Microsoft.Network/bastionHosts"",
"}"
]
}
}
PLAY RECAP *************************************************************************************************************************************************************
localhost                  : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
[root@localhost ~]#

mdaniel's:

- set_fact:
bh: "{{ (bastionhost.stdout | from_json).dnsName }}"

最新更新