Ansible 函数获取逻辑卷的当前空间?

Ansible 函数获取逻辑卷的当前空间?,ansible,lvm,Ansible,Lvm,我正在努力扮演一个负责任的角色。 我正在尝试创建一个包含2个变量、要添加到卷的额外空间以及装入点的角色,例如“/disc1”和“1.5g” 使用lvextend扩展我的逻辑卷是可行的,但是当您需要添加更多空间时,您需要获得正确的逻辑卷总大小,并添加要添加的额外空间。 该角色的任务: --- -名称:设置设备名称事实 设定事实: 设备路径:“{{item.device}” 带_项:“{{ansible_mounts}” 当:“项中的fs_名称。装入” -名称:设置设备名称事实 设定事实: 设备名称

我正在努力扮演一个负责任的角色。 我正在尝试创建一个包含2个变量、要添加到卷的额外空间以及装入点的角色,例如“/disc1”和“1.5g”

使用lvextend扩展我的逻辑卷是可行的,但是当您需要添加更多空间时,您需要获得正确的逻辑卷总大小,并添加要添加的额外空间。 该角色的任务:

---
-名称:设置设备名称事实
设定事实:
设备路径:“{{item.device}”
带_项:“{{ansible_mounts}”
当:“项中的fs_名称。装入”
-名称:设置设备名称事实
设定事实:
设备名称:“{{item.device.split('/')[-1]}”
带_项:“{{ansible_mounts}”
当:“项中的fs_名称。装入”
-名称:设置卷组事实
设定事实:
vg_名称:“{{device_name.split('-')[0]}”
-名称:设置逻辑卷事实
设定事实:
lv_名称:“{{device_name.split('-')[1]}”
-名称:获取当前lv空间
shell:lvs--noheaders-o lv_size'{{vg_name}}/{{lv_name}}}'| sed's/g/'
寄存器:lv_大小
没有日志:正确
-名称:调试lv大小
调试:
msg:“{lv_size.stdout_line}”
-名称:扩展fs
lvol:
vg:“{{vg_name}}”
lv:{{lv_name}}”
大小:{{lv_size.stdout_line | int+fs_size_add | int}}”
resizefs:是的
默认文件:main.yml

---
fs\U名称:/DISC1
fs_大小_添加:“1.4G”
问题是,我无法将当前磁盘大小正确地作为一个整数来添加所需的大小和当前大小

经过所有的努力,在用户toydarian的巨大帮助下,我的角色是:

tasks/main.yml

---
- name: Set device name fact
  set_fact:
   device_path : "{{ item.device}}"
  with_items: "{{ansible_mounts}}"
  when: "fs_name in item.mount"


- set_fact:
   device_name : "{{ item.device.split('/')[-1]}}"
  with_items: "{{ansible_mounts}}"
  when: "fs_name in item.mount"

- name: Set Volume group fact
  set_fact:
   vg_name : "{{ device_name.split('-')[0]}}"


- name: Set Logical volume fact
  set_fact:
   lv_name : "{{ device_name.split('-')[1]}}"
- shell: |
    lvs --noheadings -o lv_size '{{ vg_name }}/{{lv_name}}' |  grep -oPi '\d+.\d+(?=G)'
  register: vsize

  #- fail:
  #   msg: "Current volume sie could not be parsed. Not in correct GB format?"
  #when: vsize_stdout | length == 0

- set_fact:
    nsize: "{{ (vsize.stdout | float) + (fs_size_add  | float) }}"
- debug:
    msg: |
      current size: "{{vsize.stdout}}"
      new size: "{{nsize}}"



- name: extend fs
  lvol:
    vg: "{{vg_name}}"
    lv: "{{lv_name}}"
    size: "{{ nsize}}G"
    resizefs: yes
---
fs_name: /disco1
fs_size_add: '0.4'
默认值/main.yml

---
- name: Set device name fact
  set_fact:
   device_path : "{{ item.device}}"
  with_items: "{{ansible_mounts}}"
  when: "fs_name in item.mount"


- set_fact:
   device_name : "{{ item.device.split('/')[-1]}}"
  with_items: "{{ansible_mounts}}"
  when: "fs_name in item.mount"

- name: Set Volume group fact
  set_fact:
   vg_name : "{{ device_name.split('-')[0]}}"


- name: Set Logical volume fact
  set_fact:
   lv_name : "{{ device_name.split('-')[1]}}"
- shell: |
    lvs --noheadings -o lv_size '{{ vg_name }}/{{lv_name}}' |  grep -oPi '\d+.\d+(?=G)'
  register: vsize

  #- fail:
  #   msg: "Current volume sie could not be parsed. Not in correct GB format?"
  #when: vsize_stdout | length == 0

- set_fact:
    nsize: "{{ (vsize.stdout | float) + (fs_size_add  | float) }}"
- debug:
    msg: |
      current size: "{{vsize.stdout}}"
      new size: "{{nsize}}"



- name: extend fs
  lvol:
    vg: "{{vg_name}}"
    lv: "{{lv_name}}"
    size: "{{ nsize}}G"
    resizefs: yes
---
fs_name: /disco1
fs_size_add: '0.4'

您的问题在这一行:
size:{{lv_size.stdout_line | int+fs_size_add | int}}”

  • lv\u大小。标准输出线
    是一个
    列表
    。当您尝试将其转换为
    int
    时,结果将是
    0
    。检查一下
  • '1.4G'
    是一个
    字符串
    ,无法转换为
    int
    ,因为它包含一个字符(
    G
    )。所以一个也是
    0
  • size
    选项实际上采用的是
    字符串,而不是
    int
    。如果它得到一个
    int
    ,它将把它转换成
    字符串
    ,并将其视为兆字节
根据,应该可以使用百分比来增加逻辑卷的大小,例如
大小:“+100%空闲”
来扩展卷以使用所有可用空间。
您需要使用ansible 2.1版或更高版本才能正常工作。
有关更多详细信息,请参阅和

如果不能使用百分比,则可以通过以下方式计算逻辑卷的新大小:

-shell:|
lvs--noheaders-o lv_size'{{vg_name}}/{{lv_name}}}{124; grep-oP'\d+,\d+(?=g)'| sed“s/,/.”
寄存器:vsize
-失败:
msg:“无法分析当前卷大小。不是GB吗?”
当:vsize.stdout | length==0
-设定事实:
nsize:{(vsize.stdout | float)+(fs_size_add | float)}”
-调试:
味精:|
当前大小:{{vsize.stdout}
新大小:{{nsize}
  • 如果无法分析当前大小,则将失败。例如,如果以MB而不是GB为单位
  • fs\u size\u add
    需要是一个可解析的
    float
    。例如
    1.4
    ,但不是
    1.4G

请告诉我们哪些代码不起作用。你只说你在做什么,而不说实际问题是什么。我第一眼看到一个错误:
stdout\u行
是一个
列表
(),如果您尝试将其强制转换为
int
,您将看到。问题是,当我解析为int时,我得到一个0,因此当我尝试扩展磁盘时,它尝试收缩到0空间,而不是强制转换1.00 GB。您是对的,它正在作为字符串处理。无论如何,我不能使用+100%免费,因为这将使用所有的VG空间。我需要在变量1.4上设置一个特定的大小,然后获取磁盘的当前空间,并在当前磁盘大小上添加1.4。在这种情况下,您需要以GB为单位获取当前大小,解析其中的数字,将其转换为
float
,向其添加
1.4
float
,而不是
int
),然后设置
大小:{{new_size}}G
是的,我发现,问题是我无法以任何方式将当前空间作为整数,我使用了ansible事实与ansible_lvm和size_G,但我无法访问所需的卷。当您想要访问确切的卷时,需要写入硬编码的卷名,您不能在ansible事实中设置一个变量,如:{{ansible_lvm.lvs.latest.size_g}“查看我的最新编辑,这解释了如何计算新的卷大小如果输出是
3.00G
,您将需要
grep-oP'\d+。\d+(?=g)
并且根本不需要
sed