[ovirt-users] Add multiple files to a VM via cloud-init

Juan Hernandez jhernand at redhat.com
Thu Nov 6 05:21:14 EST 2014


On 11/06/2014 11:06 AM, Branimir Pejakovic wrote:
> 
> On Mon, Nov 3, 2014 at 8:52 PM, Branimir Pejakovic <branimirp at gmail.com
> <mailto:branimirp at gmail.com>> wrote:
> 
> 
> 
>     On Fri, Oct 31, 2014 at 11:00 PM, Juan Hernandez
>     <jhernand at redhat.com <mailto:jhernand at redhat.com>> wrote:
> 
>         On 10/31/2014 06:47 PM, Branimir Pejakovic wrote:
>         >
>         >
>         >
>         > On Thu, Oct 30, 2014 at 12:52 PM, Branimir Pejakovic
>         > <branimirp at gmail.com <mailto:branimirp at gmail.com>
>         <mailto:branimirp at gmail.com <mailto:branimirp at gmail.com>>> wrote:
>         >
>         >
>         >
>         >     On Thu, Oct 30, 2014 at 12:39 PM, Shahar Havivi <shaharh at redhat.com <mailto:shaharh at redhat.com>
>         >     <mailto:shaharh at redhat.com <mailto:shaharh at redhat.com>>> wrote:
>         >
>         >         On 30.10.14 12:30, Branimir Pejakovic wrote:
>         >         > On Thu, Oct 30, 2014 at 12:02 PM, Shahar Havivi
>         >         <shaharh at redhat.com <mailto:shaharh at redhat.com>
>         <mailto:shaharh at redhat.com <mailto:shaharh at redhat.com>>> wrote:
>         >         >
>         >         > > On 30.10.14 10:06, Branimir Pejakovic wrote:
>         >         > > > On Thu, Oct 30, 2014 at 7:22 AM, Shahar Havivi
>         >         <shaharh at redhat.com <mailto:shaharh at redhat.com>
>         <mailto:shaharh at redhat.com <mailto:shaharh at redhat.com>>>
>         >         > > wrote:
>         >         > > >
>         >         > > > > On 29.10.14 17:35, Branimir Pejakovic wrote:
>         >         > > > > > Hi list,
>         >         > > > > >
>         >         > > > > > I was wondering is there a way to add
>         multiple files
>         >         to a vm via
>         >         > > > > cloud-init
>         >         > > > > > using python SDK. I was able to add
>         /etc/resolv.conf and
>         >         > > additionally I
>         >         > > > > > would like to add config files for NICs
>         (ifcfg-ethX)
>         >         with appropriate
>         >         > > > > > values (ip,gw,netmask). I used an example
>         given here:
>         >         > > > > >
>         http://www.ovirt.org/Features/Cloud-Init_Integration . But
>         >         > > > > unfortunately I
>         >         > > > > > cannot do the same thing If I want to write
>         multiple
>         >         files to a vm in
>         >         > > > > > params.Action class.
>         >         > > > > >
>         >         > > > > > Thank you in advance!
>         >         > > > > you can use the custom script text box in oVirts
>         >         cloud-init section,
>         >         > > > > there you can add any cloud-init section -
>         adding files
>         >         examples can be
>         >         > > > > found
>         >         > > > > here:
>         >         > > > >
>         >         > > > >
>         >         > >
>         >       
>          http://cloudinit.readthedocs.org/en/latest/topics/examples.html#writing-out-arbitrary-files
>         >         > > > >
>         >         > > > >   Shahar Havivi.
>         >         > > > >
>         >         > > > >
>         >         > > > Hi Shahar,
>         >         > > >
>         >         > > > Thank you for the reply.
>         >         > > >
>         >         > > > To be honest I knew for those scripts but I want
>         to do it
>         >         in automate
>         >         > > > fashion just like in that example that I put in my
>         >         original message. I
>         >         > > have
>         >         > > > tried to specify in params.Files class multiple
>         files:
>         >         > > >
>         >         > > > vm_file1 = params.Files(file=[params.File(name =
>         'file1',
>         >         content =
>         >         > > > file1_content, type_= 'PLAINTEXT')])
>         >         > > > vm_file2 = params.Files(file=[params.File(name =
>         'file2',
>         >         content =
>         >         > > > file2_content, type_= 'PLAINTEXT')])
>         >         > > >
>         >         > > > and then give them as arguments to
>         params.CloudInit _init_
>         >         constructor
>         >         > > > (files=...)  just like in that example above but
>         it seems
>         >         that I am doing
>         >         > > > something wrong because it does not write
>         multiple files -
>         >         it writes only
>         >         > > > when you specify one file all right. The
>         exception is
>         >         "Error: 'list'
>         >         > > object
>         >         > > > has no attribute 'export'" (I tried to specify
>         those files
>         >         as a list -
>         >         > > > files=[vm_file1,vm_file2]).
>         >         > > >
>         >         > > > Thanks for any help.
>         >         > > The custom script is currently the only option to
>         add files
>         >         via Cloud-Init
>         >         > >
>         >         > > Thanks,
>         >         > >   Shahar Havivi.
>         >         > >
>         >         > >
>         >         > Hi Shahar,
>         >         >
>         >         > Granted. But the example in python
>         >         > http://www.ovirt.org/Features/Cloud-Init_Integration
>         uses
>         >         custom script :)
>         >         > I just want to know how to do the same thing in case
>         when I
>         >         want to write
>         >         > more than one file to a VM - and yes  - all those
>         multiple
>         >         files that I
>         >         > want to write are specified via custom scripts.
>         >         >
>         >         > From the link - (The "Python SDK" paragraph:
>         scontent object
>         >         holds the
>         >         > custom script):
>         >         >
>         >         >  scontent = "write_files:\n-   content: |\n       
>         search
>         >         > example.com <http://example.com>
>         <http://example.com>\n        nameserver
>         >         10.10.10.1\n        nameserver
>         >         > 10.10.10.2\n    path: /etc/resolv.conf"
>         >         >
>         >         > For example (and just for example), I want to write to
>         >         /etc/issue and
>         >         > /etc/hosts not only /etc/resolv.conf. In essence,
>         when vm goes
>         >         to run-once
>         >         > mode I want to write more than one file to a vm via
>         Python (using
>         >         > CloudInit) in automated fashion (and not touching
>         oVirt GUI at
>         >         all).
>         >         You don't need to use the GUI,
>         >         the sdks initialization have custom_script as string
>         which is
>         >         equivalent to
>         >         the text box that you see in the GUI, and you can put
>         the same
>         >         content there
>         >         (ie multiple files).
>         >         Is that sufficient enough?
>         >
>         >
>         >     Hi Shahar,
>         >
>         >     Thanks! I will try this one. I was not aware of this feature.
>         >     Although I can see that it was mentioned on the list (my bad).
>         >
>         >     Thank you for your effort! I really do appreciate it!
>         >
>         >
>         >
>         > Hi,
>         >
>         > Please if somebody can help me because I am pretty stuck. As I
>         said in
>         > previous posts I used this Python example
>         > http://www.ovirt.org/Features/Cloud-Init_Integration to set root
>         > password, hostname and resolv.conf. It worked without any
>         problems for
>         > 3.4 oVirt version and equivalent Python SDK
>         > (ovirt-engine-sdk-python-3.4.x.noarch).
>         >
>         > Then, I have tried to write through yuml scripts more conf
>         files than
>         > just resolv.conf to configure guest. I also saw this post on
>         the list:
>         >
>         http://lists.ovirt.org/pipermail/users/2014-October/028539.html. So
>         > based on that, I decided to upgraded oVirt and SDK
>         > (ovirt-engine-sdk-python-3.5.0.7-1.el6.noarch) to 3.5 version. The
>         > upgrade itself passed without any problem.
>         >
>         > From that point forward I tried to use custom_script parameter (as
>         > suggested by Shahar) inside Initialization class and CloudInit
>         class
>         > without any luck.
>         >
>         > Can somebody please provide a simple Python code to submit
>         yaml script
>         > to cloud-init?
>         >
>         > Also after the upgrade the example script I mentioned above
>         can only
>         > change hostname. It does not write resolv.conf anymore nor it
>         sets root
>         > password. I don't know if something is changed inside methods? For
>         > example, customization of virtual machine (memory,cpu,high
>         availability,
>         > pinning to a certain host etc works without any problems).
>         >
>         > Thank you!
>         >
>         > Best regards,
>         >
>         > Branimir
>         >
> 
>         The "custom_script" element doesn't work in combination with
>         cloud-init
>         and run once. To make it work you have to use cloud-init and a file
>         element containing your custom script. Here you have an example:
> 
>         #!/usr/bin/python
> 
>         import base64
>         import re
> 
>         from ovirtsdk.api import API
>         from ovirtsdk.xml import params
> 
>         # A simple function to encode using base64 and now new lines:
>         def encode(s):
>            return re.sub("\s+", "", base64.encodestring(s))
> 
>         # Connect to the server:
>         api = API(
>           url="https://engine35.example.com/ovirt-engine/api",
>           username="admin at internal",
>           password="redhat123",
>           insecure=True,
>           debug=True
>         )
> 
>         # Find the virtual machine:
>         myvm = api.vms.get(name="myvm")
> 
>         # Prepare the cloud-init custom script to write files:
>         myscript = """\
>         write_files:
>         """
> 
>         # Append one file:
>         myscript += """\
>         - encoding: b64
>           content: %s
>           owner: root:root
>           path: /etc/firstfile.txt
>           permissions: '0644'
>         """ % encode("The content of the first file")
> 
>         # Append another file:
>         myscript += """\
>         - encoding: b64
>           content: %s
>           owner: root:root
>           path: /etc/secondfile.txt
>           permissions: '0644'
>         """ % encode("The content of the second file")
> 
>         # Prepare the action to trigger initialization using cloud-init:
>         action = params.Action(
>           vm=params.VM(
>             initialization=params.Initialization(
>               cloud_init=params.CloudInit(
>                 files=params.Files(
>                   file=[
>                     params.File(
>                       name="myscript",
>                       type_="plaintext",
>                       content=myscript
>                     )
>                   ]
>                 )
>               )
>             )
>           )
>         )
> 
>         # Start the virtual machine:
>         myvm.start(action)
> 
>         # Disconnect from the server:
>         api.disconnect()
> 
>         Regarding the problem with the root password we have a bug in
>         3.5 that
>         makes this fail. See here:
> 
>           https://bugzilla.redhat.com/1156155
> 
>         The problem is that we are not passing the user name to
>         cloud-init, and
>         as a result it is changing the default cloud-init user password,
>         not the
>         root pssword. To workaround the issue you can edit the
>         "/etc/cloud/cloud.cfg" file of the VM and change the default
>         user name:
> 
>           system_info:
>           distro: ...
>           default_user:
>             name: root  <-- Change this from "fedora" or "cloud-init" to
>         root
> 
>         --
>         Dirección Comercial: C/Jose Bardasano Baos, 9, Edif. Gorbea 3,
>         planta
>         3ºD, 28016 Madrid, Spain
>         Inscrita en el Reg. Mercantil de Madrid – C.I.F. B82657941 - Red
>         Hat S.L.
> 
> 
> 
>     Hi Juan,
> 
>     Sorry for the delay. Thank you very much for this. It works perfectly.
> 
>     Best regards,
> 
>     Branimir
> 
> 
> 
> 
> Hi,
> 
> I just want to ask one more thing - is it possible to rename virtual
> disk from template_disk1 to vm1_disk1. I am asking this because I create
> vms based on the template and every machine I create has the same disk
> template name.
> 
> Of course, I have searched through list archives and found this:
> 
> http://lists.ovirt.org/pipermail/users/2014-June/024993.html
> https://bugzilla.redhat.com/show_bug.cgi?id=1105887
> 
> According to bugzilla this feature is targeted for 3.6 release. Is there
> any workaround maybe for this in 3.5 in Python SDK?
> 
> Thank you!
> 
> Best regards,
> 
> Branimir
> 

You can rename the disks after the virtual machine is created:

vm = api.vms.get(name="myvm")
index = 0
for disk in vm.disks.list():
    disk.set_alias("myvm_disk_%d" % index)
    disk.update()
    index += 1

-- 
Dirección Comercial: C/Jose Bardasano Baos, 9, Edif. Gorbea 3, planta
3ºD, 28016 Madrid, Spain
Inscrita en el Reg. Mercantil de Madrid – C.I.F. B82657941 - Red Hat S.L.


More information about the Users mailing list