如何解决获取逻辑卷当前空间的函数?
我正在为 1 个 ansible 角色而苦苦挣扎。 我正在尝试使用 2 个变量、要添加到卷的额外空间以及挂载点(例如“/disco1”和“1.5g”)来创建角色
使用 lvextend 扩展我的逻辑卷可以工作,但是当您需要添加更多空间时,您需要获得正确的逻辑卷总大小并添加要添加的额外空间。 角色的任务:
---
- name: Set device name fact
set_fact:
device_path : "{{ item.device}}"
with_items: "{{ansible_mounts}}"
when: "fs_name in item.mount"
- name: Set device name fact
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]}}"
- name: Get current lv space
shell: lvs --noheadings -o lv_size '{{ vg_name }}/{{lv_name}}'| sed 's/g//'
register: lv_size
no_log: true
- name: debug lv size
debug:
msg: "{{lv_size.stdout_lines}}"
- name: extend fs
lvol:
vg: "{{vg_name}}"
lv: "{{lv_name}}"
size: "{{lv_size.stdout_lines | int + fs_size_add |int }}"
resizefs: yes
默认文件:main.yml
---
fs_name: /disco1
fs_size_add: '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
defaults/main.yml
---
fs_name: /disco1
fs_size_add: '0.4'
解决方法
您的问题在这一行:@Test
fun testOne() = runBlockingTest {
val liveData = MutableLiveData<Int>().apply { value = 1 }
val viewModel = mock(MyViewModel::class.java)
doReturn(liveData).`when`(viewModel).scoreLiveData
scenario = launchFragmentInContainer(
factory = MainFragmentFactory(viewModel),fragmentArgs = null,themeResId = R.style.Theme_TDDScoreKeeper,initialState = Lifecycle.State.STARTED
)
scenario.moveToState(Lifecycle.State.RESUMED)
scenario.recreate() // Simulates if the phone ran low on resources and the app had to be recreated.
}
@Test
fun testTwo() {
val liveData = MutableLiveData<Int>().apply { value = 1 }
val viewModel = mock(MyViewModel::class.java)
doReturn(liveData).`when`(viewModel).scoreLiveData
scenario = launchFragmentInContainer(
factory = MainFragmentFactory(viewModel),initialState = Lifecycle.State.STARTED
)
scenario.withFragment {
this.liveDataObserver()
}
}
-
size: "{{lv_size.stdout_lines | int + fs_size_add | int }}"
是一个lv_size.stdout_lines
。当您尝试将其转换为list
时,它会变成int
。检查 documentation。 -
0
是一个'1.4G'
,不能转换为string
,因为它包含一个字符 (int
)。所以那个也是G
。 -
0
选项实际上采用size
,而不是string
。如果它得到int
,它会将其转换为int
并将其视为兆字节。
根据 documentation,应该可以使用百分比来增加这样的逻辑卷的大小 string
来扩展卷以使用所有可用空间。
您需要使用 ansible 2.1 或更高版本才能正常工作。
有关详细信息,请参阅 lvcreate(8) man-page 和 examples in the documentation。
如果您不能使用百分比,您可以通过以下方式计算逻辑卷的新大小:
size: "+100%FREE"
- 如果无法解析当前大小,则会失败。例如。如果是 MB 而不是 GB。
-
- shell: | lvs --noheadings -o lv_size '{{ vg_name }}/{{lv_name}}' | grep -oP '\d+,\d+(?=g)' | sed "s/,/./" register: vsize - fail: msg: "Current volume size could not be parsed. Not in GB?" when: vsize.stdout | length == 0 - set_fact: nsize: "{{ (vsize.stdout | float) + (fs_size_add | float) }}" - debug: msg: | current size: {{ vsize.stdout }} new size: {{ nsize }}
需要是可解析的fs_size_add
。例如。float
,但不是1.4
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。