Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1092157
  • 博文数量: 186
  • 博客积分: 4939
  • 博客等级: 上校
  • 技术积分: 2075
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-08 17:15
文章分类

全部博文(186)

文章存档

2018年(1)

2017年(3)

2016年(11)

2015年(42)

2014年(21)

2013年(9)

2012年(18)

2011年(46)

2010年(35)

分类: 系统运维

2015-02-06 11:28:30

    现在用Puppet为主,但它对ad-hoc(临时性的,俗称的一锤子买卖)的任务管理比较弱,比如常见的情况,把所有的http重启,puppet对此无能为力(当然也有workaround,比如在httpd.conf加个注释,然后notify给service)。现在来看下Ansible,无需深入,它跟for... 然后ssh 到每个机器差不多,但又跟puppet类似加了很多可编程和控制的东西。若是你用Puppet为主,建议不要深究,大概了解即可。

   废话不多,先来安装,这里用了python的virtual environment. 

Setup Ansible in your folder

  1. sudo yum -y install python-pip.noarch python-devel.x86_64 
  2. sudo pip-python install virtualenv
  3. mkdir ~/Ansible
    cd ~/Ansible 
    virtualenv .venv
    source .venv/bin/activate 
    pip install ansible

  4. ssh-agent | head -2 > ~/.ssh/.agent.env 
    source ~/.ssh/.agent.env
    ssh-add ~/.ssh/id_rsa


  1. git clone git://github.com/kennethreitz/autoenv.git ~/.autoenv
  2. echo "source ~/.autoenv/activate.sh" >> ~/.bash_profile
  3. source ~/.autoenv/activate.sh

  1. cat > ~/Ansible/.active_ansible <<\EOF
  2. source ~/Ansible/.venv/bin/activate # Activeate virtualenv
  3. source ~/.ssh/.agent.env # Load ssh-agent env
  4. export ANSIBLE_HOSTS=~/Ansible/inventory
  5. export ANSIBLE_HOST_KEY_CHECKING=False # Set ansible config
  6. export ANSIBLE_FORKS=20 # Specify ansible parallel processes
  7. # export ANSIBLE_PRIVATE_KEY_FILE=~/.ssh/id_rsa
  8. EOF

    echo "source ~/Ansible/.active_ansible" > .env

使用:
[ Ansible]$ virtualenv .venv

New python executable in .venv/bin/python
Installing setuptools.............done.
Installing pip...............done.

然后
source .venv/bin/activate

现在建立机器list.

$ cat inventory

1.amq.prod

2.amq.prod

1.amq.sbx

现在测试一下。
例1:
ansible all -i inventory -s -m shell -a "ifconfig|grep eth0"

结果:

1.amq.sbx | success | rc=0 >>

eth0      Link encap:Ethernet  HWaddr 00:0C:29:D5:5D:56  


2.amq.sbx | success | rc=0 >>

eth0      Link encap:Ethernet  HWaddr 00:0C:29:DF:AE:BB  


1.amq.prod | success | rc=0 >>

eth0      Link encap:Ethernet  HWaddr 00:50:56:9E:CC:AF  


-i从指定文件读取机器列表,或者使用ansible默认的列表。
-m module 使用shell,对比command,shell的module可以接受|,>等。
-s  使用sudo,当然还有-u指定user.

例2:
ansible all -s -m shell -a 'apt-get install nginx state=installed'
 
使用apt 模块来安装nginx,其state是installed,这个类似puppet的provider。all就是使用列表中的全部机器,当然还可以划分role,比如web/DB等机器。

例3:
ansible webservers -m service -a "name=httpd state=started"

把role为webservers的机器的httpd启动起来。

例4:SCP

ansible all -s -m  copy -a "src=TestTimeZone.class dest=/tmp/ mode=755 owner=zapp" -i stg2.yaml
# -U 指定用zapp来执行

ansible all -s -m shell -U zapp -a "cd /tmp && java TestTimeZone" -i stg2.yaml


其他术语VS puppet

1.playbook
多个task组合起来,完成一系列task功能。类似puppet的class等。以下是一个playbook,拷贝ssh key的分发。

  1. # temp.yaml
  2. ---
  3. - hosts: all
  4. gather_facts: False
  5. vars:               
  6. authorized_keys: authorized_keys
  7. ssh_dir: /home/hfu/.ssh
  8. owner: hfu
  9. group: Ops
  10. tasks:
  11. - name: set attributes of .ssh
  12. action: file path={{ ssh_dir }} owner={{ owner }} group={{ group }} mode=0700 state=directory
  13. - name: put public key in ~/.ssh/
  14. action: copy src={{ authorized_keys }} dest={{ ssh_dir }}/authorized_keys owner={{ owner }} group={{ group }} mode=0600

ansible-playbook temp.yaml -f 100 -k -i inventory

这样可以把key分发到机器上,以后无需密码登陆。当然可以用ssh-copy-id更加快捷

Usage: /usr/bin/ssh-copy-id [-i [identity_file]] [user@]machine

#附加例子如下:

---

- hosts: all

  gather_facts: False

  vars:

    owner: zapp

    group: zapp

  tasks:

  - name: scp files...

    action: copy src=/tmp/{{ item[0]}} dest=/tmp/{{ item[1] }}/ owner={{ owner }} group={{ group }} mode=0755

    #action: copy src=/tmp/{{ item.name }} dest=/tmp/{{ item.id }}/ owner={{ owner }} group={{ group }} mode=0755

    #with_items:

    #  - { id: '03', name: 'utils.py' }

    #  - { id: '03', name: 'clone_tenant.py' }

    #  - { id: '04', name: 'utils.py' }

    #  - { id: '04', name: 'clone_tenant.py' }

    with_nested:

        - [ 'utils.py', 'clone_tenant.py' ]

        - [ '03' ,'04', '05']



2. handler

跟task类似,但可以call其他的task,类似Puppet的notify/subscribed。

3. facts,这个不多说了,见名知意。

当然你可以参考这个 了解跟多。
阅读(3618) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~