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