Blog

  • python list 去重

    比较容易记忆的是用内置的set

    l1 = ['b','c','d','b','c','a','a']
    l2 = list(set(l1))
    print l2

    还有一种据说速度更快的,没测试过两者的速度差别

    l1 = ['b','c','d','b','c','a','a']
    l2 = {}.fromkeys(l1).keys()
    print l2

    这两种都有个缺点,祛除重复元素后排序变了:

    ['a', 'c', 'b', 'd']

    如果想要保持他们原来的排序:

    用list类的sort方法

    l1 = ['b','c','d','b','c','a','a']
    l2 = list(set(l1))
    l2.sort(key=l1.index)
    print l2

    也可以这样写

    l1 = ['b','c','d','b','c','a','a']
    l2 = sorted(set(l1),key=l1.index)
    print l2

    也可以用遍历

    l1 = ['b','c','d','b','c','a','a']
    l2 = []
    for i in l1:
        if not i in l2:
            l2.append(i)
    print l2
    上面的代码也可以这样写
    l1 = ['b','c','d','b','c','a','a']
    l2 = []
    [l2.append(i) for i in l1 if not i in l2]
    print l2

    这样就可以保证排序不变了:

    ['b', 'c', 'd', 'a']

    参考:

    http://blog.csdn.net/zhengnz/article/details/6265282
  • 使用iptables遇到nf_conntrack table full

    环境 centos 6.6

    在/var/log/messages看到报错

    kernel: nf_conntrack: table full, dropping packet.

    nf_conntrack 默认最大值 65536

    cat /proc/sys/net/ipv4/ip_conntrack_max | wc -l

    超过这个 65536 便会报错。

    现在将值改为 655360 并且永久生效

    首先修改/etc/sysctl.conf

    net.nf_conntrack_max = 655360
    net.netfilter.nf_conntrack_max = 655350
    net.netfilter.nf_conntrack_tcp_timeout_established = 1200

    然后修改/etc/sysconfig/iptables-config
    注意如下两行

    IPTABLES_MODULES="ip_conntrack"
    IPTABLES_SYSCTL_LOAD_LIST=".nf_conntrack"

    之后重新 iptables.

  • ansible tasks判断一个主机是不是在某group

    hosts文件里是这样写的

    [backup_tar]
    host1
    host2

    [backup_notar]
    host3
    host4

    针对 backup_tar 中的 hosts 只执行某条 task

    - cron: name="backup" minute=0 hour=4
            user="root" job="/bin/sh /root/mysql_backup.sh full >> /dev/null 2>&1" backup=yes
      when: inventory_hostname in groups['backup_tar']
    

    参考:https://groups.google.com/forum/#!topic/ansible-project/lr7nXyGw0UY

  • ansible直接通过ip操作机器

    如果要了解一两个 ip 的一些简单的情况如 ls -l /data0/ | wc -l,以前是要写到文件里的。

    ansible -i hosts all -m shell -a "ls -l /data0/ | wc -l"

    也可以这样,一台机器最后面要有一个逗号

    ansible all -i 192.168.1.1, -m shell -a "ls -l /data0/ | wc -l"

    两台机器用逗号隔开,并且不能有空格

    ansible all -i 192.168.1.1,192.168.1.2 -m shell -a "ls -l /data0/ | wc -l"

    参考: http://stackoverflow.com/questions/17188147/how-to-run-ansible-without-specifying-the-inventory-but-the-host-directly?answertab=votes#tab-top

    题外话:

    除了上面的 shell 模块,还有 command, script 可以在被管理机器上方便执行 shell.

    ansible all -i hosts -l 192.168.1.183 -m script -a uptime.sh
  • centos4机器被ansible管理

    使用 ansible 管理 centos4 的机器会报错, 默认安装的 python 是 2.3.4 ,需要在 centos4 上的机器添加 python2.7 的环境,以便于被 ansible 管理。

    下载安装

    wget http://python.org/ftp/python/2.7.5/Python-2.7.5.tgz --no-check-certificate
    tar xzf Python-2.7.5.tgz 
    cd Python-2.7.5
    ./configure --enable-shared
    make
    make altinstall

    接下来创建一个记录 python lib 目录的配置文件,/etc/ld.so.conf.d/python27.conf 里记录

    /usr/local/lib

    并用 ldconfig 加载到系统

    ldconfig -v -f /etc/ld.so.conf.d/python27.conf

    保证 yum 可用

    cp /usr/bin/python /usr/bin/python2.3.4
    vim /usr/bin/yum 第一行改为
    #!/usr/bin/python2.3.4
    

    系统级别

    ln -nfs /usr/local/bin/python2.7 /usr/bin/python

    参考:
    http://stivesso.blogspot.jp/2014/08/ansible-hosts-install-alternate.html

  • python dict sort

    python 字典(dict)的特点就是无序的,按照键(key)来提取相应值(value),如果我们需要字典按值排序的话,那可以用下面的方法来进行:

    1 下面的是按照value的值从大到小的顺序来排序。

    dic = {'a':31, 'bc':5, 'c':3, 'asd':4, 'aa':74, 'd':0}
    dict= sorted(dic.iteritems(), key=lambda d:d[1], reverse = True)
    print dict

    输出的结果:

    [('aa', 74), ('a', 31), ('bc', 5), ('asd', 4), ('c', 3), ('d', 0)]

    下面我们分解下代码
    print dic.iteritems() 得到[(键,值)]的列表。
    然后用sorted方法,通过key这个参数,指定排序是按照value,也就是第一个元素d[1的值来排序。reverse = True表示是需要翻转的,默认是从小到大,翻转的话,那就是从大到小。

    2 对字典按键(key)排序:

    dic = {'a':31, 'bc':5, 'c':3, 'asd':4, 'aa':74, 'd':0}

    dict= sorted(dic.iteritems(), key=lambda d:d[0]) d[0]表示字典的键
    print dict

    http://www.cnpythoner.com/post/266.html