gpt4 book ai didi

azure - 如何使用ansible循环挂载多个磁盘

转载 作者:行者123 更新时间:2023-12-03 00:59:29 24 4
gpt4 key购买 nike

我最近刚刚开始使用 Ansible。我正在尝试在使用 terraform 连接的 azure VM 上安装 4 个磁盘。每个磁盘都传递了一个 LUN 编号,我正在使用该 LUN 编号和 grep 获取每个磁盘的设备名称(sdc、sdd 等)。

    - name: get volume name
shell: echo "/dev/$(ls -l /dev/disk/azure/scsi1 |grep {{ item.lun }}|egrep -o "([^\/]+$)")"
register: volumename
- parted:
device: "{{ volumename.stdout }}"
number: 1
state: present
- filesystem:
fstype: xfs
dev: "{{ volumename.stdout }}"
- mount:
fstype: xfs
opts: noatime
src: "{{ volumename.stdout }}"
path: "{{ item.mountpoint }}"
state: mounted
- command: blkid -s UUID -o value {{ volumename.stdout }}
register: volumename_disk

- blockinfile:
path: /etc/fstab
state: present
block: |
UUID={{ volumename_disk.stdout }} {{ volumename.stdout }} xfs defaults,noatime,nofail 0 0

loop:
- { lun: 'lun0', mountpoint: '/apps/mysql/binlog', diskname: 'binlog' }
- { lun: 'lun1', mountpoint: '/apps/mysql/innodb', diskname: 'innodb' }
- { lun: 'lun2', mountpoint: '/apps/mysql/data', diskname: 'data' }
- { lun: 'lun3', mountpoint: '/apps/mysql', diskname: 'backup' }
tags: test

我不断收到“volumename 变量未定义”错误。有什么方法可以将volumename设置为全局,以便下一个剧本可以访问它或者我如何改进此代码?

最佳答案

首先,我不是 ansible 专家,但您想要做的是:

  • 对多个任务使用相同的循环。

我认为这是不可能的。另一件事是,loop-变量仅适用于具有匹配缩进的任务,在您的情况下:blockinfile

您可以做的是为您想要执行的任务创建一个自己的任务文件,并将其包含在您的剧本中(循环包含)。这是由 @Konstantin 在以下示例中完成的:Multiple ansible task with same loop

额外:
Reason why it is NOT available
如果可以对多个任务使用单个循环,那么您必须确保将其应用于所有任务,例如:

- block:
task1
...
task2
...
loop:
- { lun: 'lun0', mountpoint: '/apps/mysql/binlog', diskname: 'binlog' }
- { lun: 'lun1', mountpoint: '/apps/mysql/innodb', diskname: 'innodb' }
<小时/>

示例:

(根据您的评论创建了一个示例,我认为这不是一个好的解决方案,但它是一个解决方案)使用 set_fact 创建一个列表,然后将此列表传递给另一个 playbook。
使用我现有的示例:

my_tasks.yml:

---
- command: echo "{{ item.lun}}"
register: volumename
- set_fact:
volumenames: "{{ volumenames|default([]) + [ { 'name': volumename.stdout } ] }}"

- debug:
msg: "VOLUMENAME is: {{ volumename.stdout }}"

playbook.yml:

---
- hosts: localhost
tasks:
- include_tasks: my_tasks.yml
loop:
- { lun: 'lun0', mountpoint: '/apps/mysql/binlog', diskname: 'binlog' }
- { lun: 'lun1', mountpoint: '/apps/mysql/innodb', diskname: 'innodb' }
- { lun: 'lun2', mountpoint: '/apps/mysql/data', diskname: 'data' }
- { lun: 'lun3', mountpoint: '/apps/mysql', diskname: 'backup' }

- import_playbook: playbook2.yml myvar='{{ volumenames }}'

playbook2.yml

---
- hosts: localhost
tasks:
- debug:
msg: "{{ myvar }}"


关于azure - 如何使用ansible循环挂载多个磁盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63100027/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com