Sharing

2013年7月30日 星期二

apt-get update fail!

最近為了 apt-get update 老是失敗很苦惱, 會遇到以下幾個 error

Case 1:
W: Failed to fetch http://eu-west-1.ec2.archive.ubuntu.com/ubuntu/dists/precise-backports/multiverse/i18n/Index  No Hash entry in Release file /var/lib/apt/lists/partial/eu-west-1.ec2.archive.ubuntu.com_ubuntu_dists_precise-backports_multiverse_i18n_Index

Case 2:
Err http://ppa.launchpad.net precise/main i386 Packages
  404  Not Found

Case 3:
Get:56 http://free.nchc.org.tw precise-security/main TranslationIndex [726 kB]                                   E: Unable to parse package file /var/lib/apt/lists/partial/free.nchc.org.tw_ubuntu_dists_precise-security_main_i18n_Index (1)   

Case 4:
78% [62 Packages bzip2 0 B] [66 Packages 212 kB/1,640 kB 13%]                                                              469 kB/s 5sbzip2: (stdin) is not a bzip2 file.

網路上也有人遇到類似的問題, 但因為時間不同, 原因也不一定相同, 不過玩多了總會有心得
               
1. 原來的 repository 不太穩, 造成下載有問題, 可以試試看換另一個 respository

2. 公司內的 proxy cache 作怪
     i. 把 proxy 關掉
         /etc/apt/apt.conf
         /etc/apt/apt.conf.d/80proxy
     ii. 把 repository server 換成 ftp protocol ex: ftp://ftp.csie.chu.edu.tw/Ubuntu/archive/

3. 你新增的 ppa link 有問題
    把這個目錄下的檔案內容都先用 "#" mark 起來, 再一個一個開啟, 試試看那一個打開後就會讓 apt-get update 失敗
    /etc/apt/source.list.d/

4. 你所在的網路就是十分不穩, 加上一個 proxy 可能會有幫助
    在這個檔案內 /etc/apt/apt.conf.d/80proxy, 加上下面這行

    Acquire::http::Proxy "http://:8080";

    8080 是 proxy server 的 port number, 一般是 8080, 視情況改掉

5. apt-get 的內容亂掉了, 那就請參考

https://help.ubuntu.com/community/PackageManagerTroubleshootingProcedure
https://answers.launchpad.net/ubuntu/+source/update-manager/+question/207473
https://help.ubuntu.com/community/AptGet/Howto


另外把一般修復的流程寫成 script, 最後一行 dist-upgrade 視個人需要打開, 打開後會主動更新 linux kernel
#!/bin/bash
sudo cp -arf /var/lib/dpkg /var/lib/dpkg.backup
sudo cp /var/lib/dpkg/status-old /var/lib/dpkg/status
sudo cp /var/lib/dpkg/available-old /var/lib/dpkg/available
sudo rm -rf /var/lib/dpkg/updates/*
sudo rm -rf /var/lib/apt/lists
sudo mkdir /var/lib/apt/lists
sudo mkdir /var/lib/apt/lists/partial
sudo apt-get clean
sudo apt-get update
sudo dpkg --clear-avail
sudo dpkg --configure -a
sudo apt-get install -f
sudo apt-get update
#sudo apt-get dist-upgrade


2013年7月26日 星期五

Debugging Tool in Chrome Browser

今天為了追一個問題, 必須要親手下去看 HTTP Header / Content, 對我這個沒有什麼 Web Application Programming 經驗的人來說, 真的是很痛苦呀, 不過辛好 Chrome 有一個內建的 Tool, 可以幫助你把所有的內容 Dump 出來, 真的是很好用.

工具 --> 開發人員工具




選了之後下面就會出現一個視窗, 就可以顯示當下的網頁的狀況, 如果你需要紀錄完整的流程, 就可以到 Network Tab, 然後點一下下面那個圓點 "Preserve Log",  他會變成紅色的.




然後就可以選每個頁面, 看他的 Headers, Content, 另外他還有時間軸方便你知道 Loading 進來的順序.

2013年7月24日 星期三

Puppet Server & Client Installation


先安裝 puppetlab repository

$ wget http://apt.puppetlabs.com/puppetlabs-release-precise.deb
$ sudo dpkg -i puppetlabs-release-precise.deb
$ sudo apt-get update

Puppet Master


安裝 package
$ sudo apt-get install puppetmaster

設定檔 /etc/puppet/puppet.conf
如果 server 的 hostname 不是 puppet 要記得多加 certname, 設定成和 hostname 相同
[main]
logdir=/var/log/puppet
vardir=/var/lib/puppet
ssldir=/var/lib/puppet/ssl
rundir=/var/run/puppet
factpath=$vardir/lib/facter
templatedir=$confdir/templates

[master]
# These are needed when the puppetmaster is run by passenger
# and can safely be removed if webrick is used.
ssl_client_header = SSL_CLIENT_S_DN
ssl_client_verify_header = SSL_CLIENT_VERIFY

certname=controller0

重啟 puppet
$ service puppetmaster restart

Puppet Client


安裝 package
$ sudo apt-get install puppet

設定檔 /etc/puppet/puppet.conf 基本上不需要改, 但要在 /etc/hosts 內新增 puppet
192.168.100.1   puppet    # your puppet server ip

重啟 puppet
$ service puppetmaster restart


Sign the certificate


接下來要讓 Server & Client 連結起來, 按照文件, 理論上 client 應該會主動發出認証 certificate
你列出所有的 certificate 應該會看到剛剛那台 client, 但前面沒有 + 號

controller0:~$ puppet cert list
  "dev-client1.client.tw.trendnet.org" (SHA256) 05:41:E3:29:FD:5E:88:77:9E:52:08:CC:45:29:B2:BC:D0:94:CE:98:F6:14:96:F3:1F:B2:92:9F:3D:61:DF:8A
  "controller0.client.tw.trendnet.org" (SHA256) 0B:B5:09:BF:C6:7C:42:D5:5C:61:8C:F0:FC:F9:23:2C:77:37:35:CB:74:CE:50:96:23:C0:6F:9F:31:B2:03:75

如果沒有看到 client, 可以在 client 下這個指令, 就應該會看到了

$  puppet agent -t
Info: Creating a new SSL certificate request for dev-client1.client.tw.trendnet.org
Info: Certificate Request fingerprint (SHA256): 05:41:E3:29:FD:5E:88:77:9E:52:08:CC:45:29:B2:BC:D0:94:CE:98:F6:14:96:F3:1F:B2:92:9F:3D:61:DF:8A

再來在 Server 把看到需要認証的 certificate 過一過

controller0:~$ puppet cert sign controller0.client.tw.trendnet.org
Notice: Signed certificate request for controller0.client.tw.trendnet.org
Notice: Removing file Puppet::SSL::CertificateRequest controller0.client.tw.trendnet.org at '/var/lib/puppet/ssl/ca/requests/controller0.client.tw.trendnet.org.pem'
controller0:~$ puppet cert sign dev-client1.client.tw.trendnet.org
Notice: Signed certificate request for dev-client1.client.tw.trendnet.org
Notice: Removing file Puppet::SSL::CertificateRequest dev-client1.client.tw.trendnet.org at '/var/lib/puppet/ssl/ca/requests/dev-client1.client.tw.trendnet.org.pem'


再看一下 certificate list, 前面都有加號囉!
root@controller0:~# puppet cert list --all
+ "controller0.client.tw.trendnet.org" (SHA256) F4:43:1D:7B:DD:63:BD:86:94:E1:61:32:66:2F:CE:B8:02:EF:AE:65:C6:52:84:B3:F6:5A:30:79:17:99:78:90
+ "dev-client1.client.tw.trendnet.org" (SHA256) F0:40:8F:95:32:26:7F:0A:F8:83:CA:49:C3:52:54:EE:46:08:A2:5E:7C:5B:9E:66:F9:6A:05:C0:F8:0B:B9:04

測試一下
$ puppet agent -t
Info: Caching certificate for controller0.client.tw.trendnet.org
Info: Retrieving plugin
Info: Caching catalog for controller0.client.tw.trendnet.org
Info: Applying configuration version '1374649756'
Notice: /Stage[main]/Hosts/File[/tmp/hosts]/ensure: defined content as '{md5}c6c50c6c77f3b358f3cfb122f537a94b'
Info: Creating state file /var/lib/puppet/state/state.yaml
Notice: Finished catalog run in 0.11 seconds

如果不小心把環境搞亂了, certificate 也爛掉了, 可以參考 trouble shooting 那篇, 還滿有用的


Reference:
http://docs.puppetlabs.com/guides/installation.html#debian-and-ubuntu
http://shapeshed.com/connecting-clients-to-a-puppet-master/
http://finninday.net/wiki/index.php/Zero_to_puppet_in_one_day

troubleshooting:
http://bitcube.co.uk/content/puppet-errors-explained

2013年7月11日 星期四

Logrotate not rotate the log?!

logrotate 幫忙你定期整理 log, 像是壓縮起來, 或是清理掉過期的檔案, 才能避免硬碟因為過多的 log 而再也不能寫入, 鳥哥的文章也寫的很清楚
http://linux.vbird.org/linux_basic/0570syslog.php#rotate

但 logrotate 也是有不能處理的狀況

狀況 1:log 檔的檔名不固定

最近在使用 graphite-carbon, 他內部有自己 rotate log 檔的機制, 所以當你打開 /var/log/carbon/ 時, 他的檔案可能像這樣
但他沒有做壓縮, 也沒有定期清除過期的檔案, 所以你還是想加一條 rule 進去 logrotate

/var/log/carbon$ ll
total 575048
drwxr-xr-x 2 www-data www-data     12288 Jul 11 00:03 ./
drwxr-xr-x 3 www-data www-data      4096 Jun  4 04:23 ../
-rw-r--r-- 1 www-data www-data     10673 Jul 11 03:47 console.log
-rw-r--r-- 1 www-data www-data     75481 Jul 10 23:59 console.log.2013_7_10
-rw-r--r-- 1 www-data www-data     83080 Jul  9 23:58 console.log.2013_7_9
-rw-r--r-- 1 www-data www-data     13303 Jul  8 23:59 console.log.2013_7_8
-rw-r--r-- 1 www-data www-data    300053 Jul 11 03:47 creates.log
-rw-r--r-- 1 www-data www-data   2356541 Jul 10 23:59 creates.log.2013_7_10
-rw-r--r-- 1 www-data www-data   2930068 Jul  9 23:59 creates.log.2013_7_9
-rw-r--r-- 1 www-data www-data    198027 Jul  8 23:59 creates.log.2013_7_8
-rw-r--r-- 1 www-data www-data   1799225 Jul 11 03:47 listener.log
-rw-r--r-- 1 www-data www-data  11544506 Jul 10 23:59 listener.log.2013_7_10
-rw-r--r-- 1 www-data www-data  11706873 Jul  9 23:59 listener.log.2013_7_9
-rw-r--r-- 1 www-data www-data    568164 Jul  8 23:59 listener.log.2013_7_8
-rw-r--r-- 1 www-data www-data  45003650 Jul 11 03:47 query.log
-rw-r--r-- 1 www-data www-data 278004661 Jul 10 23:59 query.log.2013_7_10
-rw-r--r-- 1 www-data www-data 234139329 Jul  9 23:59 query.log.2013_7_9
-rw-r--r-- 1 www-data www-data     12797 Jul  8 23:59 query.log.2013_7_8

所以我試著加入這個 rule, 執行 logrotate -f graphite-carbon, 結果看起來很理想, 會把檔案壓縮起來

/var/log/carbon/*/*.log.*[!gz] {
        daily
        rotate 1
        compress
        missingok
        nocreate
}

然而隔幾天再來看的時候, 卻發現沒有發揮作用, 查了半天後才發現這是 logrotate 的機制
http://serverfault.com/questions/388066/logrotate-not-working
http://serverfault.com/questions/375004/logrotate-not-rotating-the-logs

在做 rotate 之前, 他會檢查 /var/lib/logrotate/status 內的日期, 如果距離上一次檢查的日期不到你指定的時間, ex daily => 一天以上, 那他是不會被 rotate 的, 所以你加入新機制的第一天, 在 status 內因為沒有紀錄, 所以他是不會發揮作用的, 第一天他唯一做的事是在 status 內加上一筆 record, 第二天之後才會正常運作. 那因為 carbon 每天產生的 log 檔名不是一致的, 所以在 status 內不可能有紀錄, 總要再多等一天才會被壓縮起來, 如果不能接受的話就可以改用 cron.daily 來執行, 就可以達到原本想要的效果

logrotate Debug 指令

# 執行一次並且把結果寫入 status, -v 把詳細的過程印出來
/usr/sbin/logrotate -v /etc/logrotate.conf
# 模擬執行一次,
/usr/sbin/logrotate -d /etc/logrotate.conf



2013年7月10日 星期三

Sharing - The backend as a service ecosystem map

SOAP client in Python

在 stackoverflow 上可以找到一篇比較,  看起來最容易上手的是 SUDS,

http://stackoverflow.com/questions/206154/whats-the-best-soap-client-library-for-python-and-where-is-the-documentation-f/206964#206964

在 PyPi 上找到的 Package 卻有幾個變種
https://pypi.python.org/pypi?%3Aaction=search&term=suds&submit=search

PackageWeight*Description
suds 0.48Lightweight SOAP client
suds-jurko 0.4.1.jurko.45Lightweight SOAP client (Jurko's fork)
suds-philpem 0.4.35Lightweight SOAP client (philpem's fork-and-merge)
suds-vingd 0.4.35Lightweight SOAP client (philpem's fork-and-merge)

suds 最後更新的時間是 2010/09/15, 也有點久, 難怪會有很多變種, 不過我要做的事很單純, 試用了之後也沒問題, 就先使用了. 推薦給只需要簡單功能的 DevOp 工作人員們!

2013年7月4日 星期四

Setup Ubuntu 12.04 PXE Boot Server in VirtublBox

基本上是參考這篇, 但 Ubuntu 12.04 有些 package 名字己經改變
https://help.ubuntu.com/community/PXEInstallMultiDistro

Tftp Server


安裝 Tftp 之後設定檔都不需要修改就可以直接使用, 這個套件是幫助 PXE boot 的過程中把開機檔傳送出去, ex: initrd.gz

$ sudo apt-get -y install tftpd-hpa

DHCP Server


安裝 dhcp server 是為了 PXE boot 過程中可以配置 ip 給 client, 一般就是和 Tftp server 裝在同一台, 但也有方式可以裝在不同台. 另外要注意一個網段內只能有一台 DHCP Server,不然就會打架. 在公司內設定的話, 我是給 Server 兩張網卡, 一張是用 Bridge 接到原來公司的網路, 就可以對外, 另一張用 internal network, 預計是在 intnet 提供 PXE boot 服務, 這樣就不會和公司的 DHCP server 衝突.






第一張網卡用 dhcp 拿到公司的 ip, 第二張我就設定成 192.168.100.1

$ cat /etc/network/interfaces 
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet dhcp
iface eth0 inet6 dhcp

auto eth1
iface eth1 inet static
        address 192.168.100.1
        netmask 255.255.255.0


在 Ubuntu 12.04, dhcp3 的名字改成 isc-dhcp-server

$ sudo apt-get -y install isc-dhcp-server


/etc/dhcp/dhcpd.conf 的內容
在 192.168.100.x 的網段提供 100~200, 並且設定開機檔為 "pxelinux.0"

# The ddns-updates-style parameter controls whether or not the server will
# attempt to do a DNS update when a lease is confirmed. We default to the
# behavior of the version 2 packages ('none', since DHCP v2 didn't
# have support for DDNS.)
ddns-update-style none;

# option definitions common to all supported networks...
# option domain-name "example.org";
# option domain-name-servers ns1.example.org, ns2.example.org;

option domain-name "home.local";
option domain-name-servers 192.168.100.1;

default-lease-time 600;
max-lease-time 7200;

# If this DHCP server is the official DHCP server for the local
# network, the authoritative directive should be uncommented.
authoritative;

allow booting;
allow bootp;

subnet 192.168.100.0 netmask 255.255.255.0 {
        range 192.168.100.100 192.168.100.200;
        option routers 192.168.100.1;
        option subnet-mask 255.255.255.0;
        option broadcast-address 192.168.100.255;
        filename "pxelinux.0";
        next-server 192.168.100.1;
} 



設定好後記得重開

sudo service isc-dhcp-server restart

如果想要知道有沒有設定成功, 可以先拿一台已經裝好的機器, 加入第二張網卡, 也設定在 intnet, 開機後設定第二張網卡用 dhcp 拿 ip, 如果重啟網路有拿到 ip 就表示沒問題. 也可以看 Server 的 /var/log/syslog

Jul  4 17:26:01 ubuntu dhcpd: DHCPDISCOVER from 08:00:27:47:b0:6e via eth1
Jul  4 17:26:02 ubuntu dhcpd: DHCPOFFER on 192.168.100.100 to 08:00:27:47:b0:6e (PXE-C) via eth1
Jul  4 17:26:02 ubuntu dhcpd: DHCPREQUEST for 192.168.100.100 (192.168.100.1) from 08:00:27:47:b0:6e (PXE-C) via eth1
Jul  4 17:26:02 ubuntu dhcpd: DHCPACK on 192.168.100.100 to 08:00:27:47:b0:6e (PXE-C) via eth1

SYSLINUX


安裝 boot loader

$ sudo apt-get -y install syslinux


NFS


安裝 nfs, 是為了在網路開機成功後, 要抓取其它的檔案使用
在這裡我把 /srv/install 開放給 192.168.100.x 這個網段使用

$ sudo apt-get -y install nfs-kernel-server
$ sudo mkdir /srv/install
$ cat /etc/exports
/srv/install  192.168.100.0/24(ro,async,no_root_squash,no_subtree_check) 
$ service nfs-kernel-server restart
# 驗証一下
$ sudo mount 192.168.100.1:/srv/install /mnt
$ sudo umount /mnt






Putting them All Together


準備安裝檔, 假設 Ubuntu 12.04 的光碟已經 mount 在 /mnt/cdrom

$ mkdir -p /srv/install/Ubuntu
$ mkdir -p /srv/install/Ubuntu/12.04
$ mkdir -p /srv/install/Ubuntu/12.04/amd64
$ cd /srv/install/Ubuntu/12.04/amd64
$ cp -R /mnt/cdrom/* .
$ cp -R /mnt/cdrom/.disk .
$ chmod 777 -R /srv/install/Ubuntu


接下來要製作 boot loader 以及 boot menu, 並且放在 tftpboot 裡
網路上有 Ubuntu 現在的設定, 就先拿來使用, 之後可以再自己修改
最後記得要修改 txt.cfg, 加上 netboot=nfs nfsroot=xxxx 的設定

$ cd /var/lib/tftpboot
$ wget http://archive.ubuntu.com/ubuntu/dists/precise/main/installer-amd64/current/images/netboot/netboot.tar.gz
$ tar xzvf netboot.tar.gz
$ head -n 6 /var/lib/tftpboot/ubuntu-installer/amd64/boot-screens/txt.cfg
default install
label install
        menu label ^Install
        menu default
        kernel ubuntu-installer/amd64/linux
        append vga=788 initrd=ubuntu-installer/amd64/initrd.gz netboot=nfs nfsroot=192.168.100.1:/srv/install/Ubuntu/12.04/amd64 -- quiet

PXE boot


接下來就驗收成果, 在 Virtual Box 內做出另一台機器, 網卡記得要有一張在 intnet 內, 介面卡類型建議選成 PCnet-FAST III, 不然可能不會成功



開機順序也可以改一下, 或是在開機時按 F12 進入開機選單







Existing DHCP Server


If you have an existing dhcp server, you should point it to your pxe server by doing something like the following

subnet 192.168.100.0 netmask 255.255.255.0 {
    #other config here
    filename "pxelinux.0";
    next-server 
    #pxe host=""
}


基本的設定了解了之後, 就可以玩很多不同的方案, 其它參考連結
http://anriqing.blogbus.com/logs/74262252.html
https://help.ubuntu.com/community/DisklessUbuntuHowto
http://digitalsanctum.com/2013/03/22/how-to-setup-a-pxe-server-on-ubuntu/
http://www.serenux.com/2010/05/howto-get-an-ubuntu-live-cd-to-boot-off-a-pxe-server/
https://help.ubuntu.com/community/PXEInstallServer