githubixx.iscsi_target
ansible-role-iscsi_target
此角色在 Linux 主机上使用 targetcli
配置基于 Linux-LIO 的 iSCSI 目标。此外,此角色还包含 Python 模块以与 targetcli
命令交互,可以单独用于更高级的操作。模块实现了检查、创建和删除功能。
测试过的系统:
- Ubuntu 20.04
- Ubuntu 22.04
- Archlinux
关于 LIO 和 Target 的文档可以在 这里 找到。
需求
此角色不创建任何磁盘、分区或逻辑卷(LV)。预期这些已经存在于机器上,或者由其他角色创建。例如:githubixx.lvm。
更新日志
请查看 CHANGELOG
角色变量
# iSCSI 目标通过嵌套变量 "iscsi_targets" 配置。
# 一个相当简单的设置如下示例:
#
# iscsi_targets:
# - name: "iqn.2021-11.blog.tauceti:{{ ansible_facts['nodename'] }}"
# disks:
# - name: lun_node1
# path: /dev/vdb
# type: block
# lunid: 0
# initiators:
# - name: iqn.2021-07.blog.tauceti:node1
# authentication:
# userid: node1user
# password: node1pw
# userid_mutual: node1sharedkey
# password_mutual: node1sharedsecret
# mapped_luns:
# - mapped_lunid: 0
# lunid: 0
# portals:
# - ip: "0.0.0.0"
#
# 更多信息请见 README。
iscsi_targets: []
上述配置将创建一个 iSCSI 设置,其输出将如下所示(使用 targetcli 'ls'
生成的输出):
# o- / .................................................................................... [...]
# o- backstores ......................................................................... [...]
# | o- block ............................................................. [存储对象: 1]
# | | o- lun_node1 ................................... [/dev/vdb (1.0GiB) 写入通过激活]
# | | o- alua .............................................................. [ALUA 组: 1]
# | | o- default_tg_pt_gp .................................. [ALUA 状态: 活动/优化]
# | o- fileio ............................................................ [存储对象: 0]
# | o- pscsi ............................................................. [存储对象: 0]
# | o- ramdisk ........................................................... [存储对象: 0]
# o- iscsi ....................................................................... [目标: 1]
# | o- iqn.2021-11.blog.tauceti:ubuntu .............................................. [TPGs: 1]
# | o- tpg1 .......................................................... [无生成 ACLs, 没有认证]
# | o- acls ..................................................................... [ACLs: 1]
# | | o- iqn.2021-07.blog.tauceti:node1 .................................. [已映射 LUNs: 1]
# | | o- mapped_lun0 ........................................ [lun0 block/lun_node1 (rw)]
# | o- luns ..................................................................... [LUNs: 1]
# | | o- lun0 ............................. [block/lun_node1 (/dev/vdb) (default_tg_pt_gp)]
# | o- portals ............................................................... [门户: 1]
# | o- 0.0.0.0:3260 ................................................................ [OK]
# o- loopback .................................................................... [目标: 0]
# o- vhost ....................................................................... [目标: 0]
# o- xen-pvscsi .................................................................. [目标: 0]
iscsi_targets.name
指定了 iSCSI 目标的名称(可以说是 iSCSI 服务器)。如上所示,此条目将在 targetcli
输出的 iscsi
节点下出现。
disks
用于创建一个或多个块存储对象。在这种情况下,它将被称为 lun_node1
,LUN ID 将为 0
。存储类型将是一个 block
设备,在这个例子中位于 /dev/vdb
。当然,这个设备也可以(可能应该)是一个逻辑卷。
initiators
定义了所有 iSCSI 发起者(iSCSI 客户端——如果你愿意的话,想要访问上面指定的 iSCSI 目标)。每个想要连接到 iSCSI 目标(服务器)的 iSCSI 发起者主机(客户端)都需要在这里有一个条目。iSCSI 发起者名称通常可以在每个发起者(客户端)的 /etc/iscsi/initiatorname.iscsi
中找到,前提是已经安装了 open-iscsi
软件包。authentication
对象包含 userid
和 password
,可选地也包含 userid_mutual
和 password_mutual
。
mapped_luns
将映射的 LUNs(逻辑单元)分配给发起者。通常 mapped_lunid
和 lunid
匹配 iscsi_targets.disks
中相同的 lunid
。但也可以不同。
portals
允许指定 iSCSI 目标服务应监听的 IP 地址。例如,如果指定 0.0.0.0
,则服务将在 3260
端口上监听所有接口。当然,也可以使用 Ansible 事实,例如 {{ ansible_default_ipv4.address | default(ansible_all_ipv4_addresses[0]) }}
。
#######################################
# 仅适用于 Archlinux 的设置
#######################################
# 配置 iSCSI 目标需要 "targetcli-fb" 包。对于 Archlinux
# 此包需要从 AUR 安装。这需要像 "yay"、"paru"、"pacaur"、"trizen" 或 "pikaur" 这样的 AUR 安装助手。如果在目标主机上已经安装了这样的助手,那么就不需要通过此角色安装它。
# 在这种情况下,"iscsi_archlinux_aur_helper" 需要设置为 ""(空字符串),此角色将跳过 AUR 助手的安装。
# 安装任务选择上述提到的 AUR 辅助程序之一(按顺序)来安装 iSCSI 包。
iscsi_archlinux_aur_helper: yay
# 尽管 Ansible 期望以 root 身份进行 SSH,但 makepkg 或 AUR 辅助程序不允许以 root 执行操作,它们会失败并显示 "you cannot perform this
# operation as root"。因此,建议有一个非 root 的用户,但不需要密码。如果设置了 "iscsi_archlinux_aur_helper"
# 变量,则假定 AUR 助手用户尚不存在,因此将创建该用户。该用户将成为 "wheel" 组的一部分。
iscsi_archlinux_aur_helper_user: aur_builder
依赖项
对于 Archlinux,使用 kewlfft.aur Ansible 集合来 1) 安装 AUR 助手,例如 yay,以及 2) 从 Archlinux 用户仓库安装 targetcli 工具。
示例剧本
- hosts: your-host
become: true
gather_facts: true
roles:
- githubixx.iscsi_target
vars:
iscsi_targets:
- name: "iqn.2021-11.blog.tauceti:{{ ansible_facts['nodename'] }}"
disks:
- name: lun_node1
path: /dev/vdb
type: block
lunid: 0
initiators:
- name: iqn.2021-07.blog.tauceti:node1
authentication:
userid: node1user
password: node1pw
userid_mutual: node1sharedkey
password_mutual: node1sharedsecret
mapped_luns:
- mapped_lunid: 0
lunid: 0
portals:
- ip: "0.0.0.0"
测试
此角色有一个小型测试设置,使用 Molecule、libvirt(vagrant-libvirt)和 QEMU/KVM 创建。请参阅我的博客文章 使用 Molecule、libvirt(vagrant-libvirt)和 QEMU/KVM 测试 Ansible 角色 了解设置方法。测试配置可以在 这里 找到。
之后可以执行摩尔生:
molecule converge
这将设置几个虚拟机(VM),使用不同受支持的 Linux 操作系统,并安装 iscsi_target
角色。
要进行一些测试:
molecule verify
要清理,请运行
molecule destroy
许可证
MIT/BSD
作者信息
原始作者:Ondrej Famera ansible.targetcli
附加作者:Ricardo Sanchez ansible-role-iscsi_target
附加作者(此角色版本):https://www.tauceti.blog