天天看點

【OpenStack 虛拟機初始化user-data & Cloud-init】

示例:
import httplib
import json
import base64

tenant_id='xxx'
token='xxx'
compute_host="xxx"
compute_port="8774"
name="xzcloud"
flavorRef="984017df-6cac-4020-8cdd-f284d89a331c"
imageRef="45f8ac31-0c1c-4f7c-8144-0c561d4de98f"
user_data="""#!/bin/bash
env
echo "export AAAAAA=1234567890" >> ~/.bashrc
echo "export BBBBBB=0123456789" >> ~/.bashrc
source ~/.bashrc
env
"""

user_data = base64.encodestring(user_data)

conn = httplib.HTTPConnection(compute_host+":"+compute_port)
headers = {"Content-type":"application/json","X-Auth-Token":token}
params = ({
    "server": {
        "availability_zone": "nova",    # 寫死
        "name": name,                   # 虛拟機名字
        "flavorRef": flavorRef,         # 虛拟機規格ID,虛拟機預置之後提供
        "user_data": user_data,         # 虛拟機啟動之後需要執行的腳本,需要base64編碼
        "config_drive": True,           # 寫死
        "imageRef": imageRef            # 虛拟機鏡像ID,虛拟機預置之後提供
    }
})
conn.request("POST", "/v2/"+tenant_id+"/servers", body=json.JSONEncoder().encode(params), headers=headers)
response = conn.getresponse()
data = response.read()
data = json.loads(data,encoding='UTF-8')
print data      

有的時候我們希望在boot虛拟機的時候能夠對虛拟機做些配置, 比如配置網絡, 寫入檔案, 下載下傳一些包并安裝等等, openstack中提供了實作這些的方法, 就是user-data 和Cloud-init。

user-data

    在說user-data之前, 要先說下nova 的metadata api, 所謂metadata就是關于虛拟機的中繼資料,提供這個api主要是為了能夠在虛拟機啟動的時候能夠實作一些資訊的初始化。

    在虛拟機内部使用curl指令, 可以得到如下結果,  它們是表示不同版本, 每個版本中包含meta-data和user-data, meta-data 中是包括虛拟機的各種基本資訊, 如ip,磁盤,記憶體,hostname,public key, 安全組等設定, user-data主要是做一些參數設定, 和一些腳本, 如python腳本, 當用heat boot虛拟機,可以看到這樣的user-data例子, user-data是能夠實作instance個性化定制的基礎, 它書寫的格式有很多, 詳細看cloud-init章節。

[html] view plain copy

【OpenStack 虛拟機初始化user-data & Cloud-init】
【OpenStack 虛拟機初始化user-data & Cloud-init】
  1. $ curl 169.254.169.254  
  2. 1.0  
  3. 2007-01-19  
  4. 2007-03-01  
  5. 2007-08-29  
  6. 2007-10-10  
  7. 2007-12-15  
  8. 2008-02-01  
  9. 2008-09-01  
  10. 2009-04-04  
  11. latest  

    關于metadata的相關資訊, 也可以詳細看EC2 文檔  Instance Metadata and User Data

Cloud-init

    資料準備好, 完成最後action的工作就必須cloud-init出馬了, 它能夠把這些資料在虛拟機boot的時候執行起來。關于cloud-init相關介紹與其所使用的user-data格式, 請看Ubuntu Cloudinit。

接下來将實際使用這些技術做個測試。

保證能夠與nova metadata api連通

    回到OpneStack本身,要把user-data使用起來,要先保證能夠在建立的虛拟機内部能夠連接配接到nova的metadata api IP 位址,metadata app IP 沿用了亞馬遜所用的169.254.169.254.  在OpenStack生産環境中, 我們是沒有這個IP的, 需要利用以下指令把到169.254.169.254的請求路由到nova的metadata api實際的監聽IP和端口上, 如下所示

【OpenStack 虛拟機初始化user-data & Cloud-init】
【OpenStack 虛拟機初始化user-data & Cloud-init】
  1. sudo iptables -t nat -A PREROUTING -d 169.254.169.254/32 -p tcp -m tcp--dport 80 -j DNAT --to-destination 10.11.0.16:8775  

10.11.0.16  是metadata api listen ip address

注意兩個相關的配置項

/etc/nova/nova.conf

【OpenStack 虛拟機初始化user-data & Cloud-init】
【OpenStack 虛拟機初始化user-data & Cloud-init】
  1. metadata_listen=10.11.0.16  

/etc/neutron/metadata_agent.ini

【OpenStack 虛拟機初始化user-data & Cloud-init】
【OpenStack 虛拟機初始化user-data & Cloud-init】
  1. nova_metadata_ip = 10.11.0.16  

Nova boot :上傳user-data,并cloud-init注入資料

    把我們需要的腳本、參數配置等等寫入文本檔案, 通過--user-data 上傳到nova metadata server上,然後利用鏡像的cloud init注入資料, nova中文法為:

【OpenStack 虛拟機初始化user-data & Cloud-init】
【OpenStack 虛拟機初始化user-data & Cloud-init】
  1. nova boot  --user-data /filepath/filename ...  

   首先找個已安裝cloud init包的鏡像,本文使用Fedora 20, 可以在http://cloud.fedoraproject.org/ 下載下傳,

   第一步:glance 建立image

【OpenStack 虛拟機初始化user-data & Cloud-init】
【OpenStack 虛拟機初始化user-data & Cloud-init】
  1. glance image-create --name F20 --disk-format=qcow2 --container-format=bare --is-public=true --file=Fedora-x86_64-20-20131211.1-sda.qcow2  

    第二步:建立user-data file 

   下面為user-data的一個例子, 為一段腳本,其他格式可參見文章末尾的參考資料

[plain] view plain copy

【OpenStack 虛拟機初始化user-data & Cloud-init】
【OpenStack 虛拟機初始化user-data & Cloud-init】
  1. #!/bin/bash  
  2. echo "one test about user data" >>userdata  
  3. chmod 777 userdata  
  4. useradd -m me  
  5. echo -e 'me\tALL=(ALL)\tNOPASSWD: ALL' >> /etc/sudoers  

     第三步:boot虛拟機, 注入初始化資料

                     注意:本例中利用--key-name參數傳入公鑰, 實作無密碼ssh, 使用者名為fedora,本例中root_key為一keypair,用nova keypair-add 添加。

【OpenStack 虛拟機初始化user-data & Cloud-init】
【OpenStack 虛拟機初始化user-data & Cloud-init】
  1. nova boot --key-name root_key  --user-data ./user-data.txt --flavor 2 --image aad51d83-6398-4d18-89c8-5302993363b5 test_f20  

     第四步:ssh 進入虛拟機進行驗證

【OpenStack 虛拟機初始化user-data & Cloud-init】
【OpenStack 虛拟機初始化user-data & Cloud-init】
  1. [root@chen ~]# ssh [email protected]  
  2. Last login: Thu Apr  3 02:07:24 2014 from 10.20.1.3  
  3. [fedora@test-f20 ~]$ curl 169.254.169.254/latest/user-data  
  4. [fedora@test-f20 ~]$ cat /userdata  
  5. one test about user data  
  6. [fedora@test-f20 ~]$ ll /userdata  
  7. -rwxrwxrwx. 1 root root 25 Apr  3 02:07 /userdata  
  8. [fedora@test-f20 ~]$ su me  
  9. Password:  

            也可以check下/etc/sudoers

 其他相關參考資料:

user-data的支援格式:https://help.ubuntu.com/community/CloudInit

OpenStack解決非UEC鏡像的虛拟機cloud-init不工作不能自動修改主機名稱不能注入user data

下面這篇文章講了如何以cirros為例安裝cloud init包,并使用的例子http://eccp.csdb.cn/blog/?p=68

file/meta/user-data注入資料http://docs.openstack.org/grizzly/openstack-compute/admin/content/instance-data.html#inserting_sshkeys

參考資料:

http://cloudinit.readthedocs.io/:http://cloudinit.readthedocs.io/en/latest/index.html

雲平台openstack中,cloudinit安裝使用:http://www.it165.net/os/html/201404/7848.html

用cloud-init制作的鏡像root無法登陸問題:http://linuxfun.me/?p=1552

Basic Hardening with User Data / Cloud-Init:http://openstack.prov12n.com/basic-hardening-with-user-data-cloud-init/

繼續閱讀