Chapter 9. Using the Ceph block device Python module
Chapter 9. Using the Ceph block device Python module The rbd python module provides file-like access to Ceph block device images. In order to use this built-in tool, import the rbd and rados Python modules. Prerequisites A running Red Hat Ceph Storage cluster. Root-level access to the node. Procedure Connect to RADOS and open an IO context: cluster = rados.Rados(conffile='my_ceph.conf') cluster.connect() ioctx = cluster.open_ioctx('mypool') Instantiate an :class:rbd.RBD object, which you use to create the image: To perform I/O on the image, instantiate an :class:rbd.Image object: This writes 'foo' to the first 600 bytes of the image. Note that data cannot be :type:unicode - librbd does not know how to deal with characters wider than a :c:type:char . Close the image, the IO context and the connection to RADOS: To be safe, each of these calls must to be in a separate :finally block: This can be cumbersome, so the Rados , Ioctx , and Image classes can be used as context managers that close or shut down automatically. Using them as context managers, the above example becomes:
cluster = rados.Rados(conffile='my_ceph.conf') cluster.connect() ioctx = cluster.open_ioctx('mypool') rbd_inst = rbd.RBD() size = 4 * 1024**3 # 4 GiB rbd_inst.create(ioctx, 'myimage', size) image = rbd.Image(ioctx, 'myimage') data = 'foo' * 200 image.write(data, 0) image.close() ioctx.close() cluster.shutdown() import rados import rbd cluster = rados.Rados(conffile='my_ceph_conf') try: ioctx = cluster.open_ioctx('my_pool') try: rbd_inst = rbd.RBD() size = 4 * 1024**3 # 4 GiB rbd_inst.create(ioctx, 'myimage', size) image = rbd.Image(ioctx, 'myimage') try: data = 'foo' * 200 image.write(data, 0) finally: image.close() finally: ioctx.close() finally: cluster.shutdown() with rados.Rados(conffile='my_ceph.conf') as cluster: with cluster.open_ioctx('mypool') as ioctx: rbd_inst = rbd.RBD() size = 4 * 1024**3 # 4 GiB rbd_inst.create(ioctx, 'myimage', size) with rbd.Image(ioctx, 'myimage') as image: data = 'foo' * 200 image.write(data, 0)