如何将列表中的 Ansible 注册变量存储到单独的变量中
How to store Ansible registered variables in a list into separate variables
我有一个应该在 EC2 实例中创建 LVM 卷的剧本。 EC2 实例是 class m5ad.8xlarge 实例,因此 EC2 实例附带两个 600GB 的实例存储。
我正在获取 lsblk 的输出以将输出范围缩小到实例存储设备,如下所示:-
shell: "lsblk | grep -v nvme0 | grep -v NAME | awk '{print }'"
register: lvm_out
以上给出:-
{
"lvm_out.stdout_lines": [
"nvme1n1",
"nvme2n1"
]
}
现在我需要在两个设备上 运行 pvcreate,如下所示:-
pvcreate /dev/nvme1n1 /dev/nvme2n1
我想知道是否可以使用“set_fact”,但不知道如何在这里使用它。
你们能帮忙吗
例如
- set_fact:
cmd: "pvcreate {{ lvm_out.stdout_lines|
map('regex_replace', _regex, _replace)|
join(' ') }}"
vars:
_regex: '(^.*$)'
_replace: '/dev/'
创建字符串
cmd: pvcreate /dev/nvme1n1 /dev/nvme2n1
您的确切问题应该是:“如何为列表的每个元素添加一个字符串?”
首先,您不需要 运行 shell 来获取磁盘信息。此信息可在名为 ansible_devices
的变量中收集的事实中获得。您将在下面的示例中看到,我可以使用库存 ansible 过滤器获得与您相同的列表。
现在要为字符串列表的每个元素添加一个字符串,您可以使用调用 regex_replace
过滤器的 map
过滤器。将所有内容放在以下剧本中:
---
- hosts: localhost
tasks:
- debug:
msg: >-
{{
ansible_devices.keys()
| select('match', 'nvme0')
| map('regex_replace', '^(.*)$', '/dev/\g<1>')
| join(' ')
}}
这给出了(注意:我的电脑上只有一个 nvme 磁盘,你将得到由 space 分隔的 2 个磁盘)
PLAY [localhost] ****************************************************************************************
TASK [Gathering Facts] **********************************************************************************
ok: [localhost]
TASK [debug] ********************************************************************************************
ok: [localhost] => {
"msg": "/dev/nvme0n1"
}
PLAY RECAP **********************************************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
更进一步,与上述一样,您不应该使用 shell
来启动 pvcreate
命令,而是 运行 通过 lvg
module 来启动命令。
我有一个应该在 EC2 实例中创建 LVM 卷的剧本。 EC2 实例是 class m5ad.8xlarge 实例,因此 EC2 实例附带两个 600GB 的实例存储。
我正在获取 lsblk 的输出以将输出范围缩小到实例存储设备,如下所示:-
shell: "lsblk | grep -v nvme0 | grep -v NAME | awk '{print }'"
register: lvm_out
以上给出:-
{
"lvm_out.stdout_lines": [
"nvme1n1",
"nvme2n1"
]
}
现在我需要在两个设备上 运行 pvcreate,如下所示:-
pvcreate /dev/nvme1n1 /dev/nvme2n1
我想知道是否可以使用“set_fact”,但不知道如何在这里使用它。
你们能帮忙吗
例如
- set_fact:
cmd: "pvcreate {{ lvm_out.stdout_lines|
map('regex_replace', _regex, _replace)|
join(' ') }}"
vars:
_regex: '(^.*$)'
_replace: '/dev/'
创建字符串
cmd: pvcreate /dev/nvme1n1 /dev/nvme2n1
您的确切问题应该是:“如何为列表的每个元素添加一个字符串?”
首先,您不需要 运行 shell 来获取磁盘信息。此信息可在名为 ansible_devices
的变量中收集的事实中获得。您将在下面的示例中看到,我可以使用库存 ansible 过滤器获得与您相同的列表。
现在要为字符串列表的每个元素添加一个字符串,您可以使用调用 regex_replace
过滤器的 map
过滤器。将所有内容放在以下剧本中:
---
- hosts: localhost
tasks:
- debug:
msg: >-
{{
ansible_devices.keys()
| select('match', 'nvme0')
| map('regex_replace', '^(.*)$', '/dev/\g<1>')
| join(' ')
}}
这给出了(注意:我的电脑上只有一个 nvme 磁盘,你将得到由 space 分隔的 2 个磁盘)
PLAY [localhost] ****************************************************************************************
TASK [Gathering Facts] **********************************************************************************
ok: [localhost]
TASK [debug] ********************************************************************************************
ok: [localhost] => {
"msg": "/dev/nvme0n1"
}
PLAY RECAP **********************************************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
更进一步,与上述一样,您不应该使用 shell
来启动 pvcreate
命令,而是 运行 通过 lvg
module 来启动命令。