现在用Puppet为主,但它对ad-hoc(临时性的,俗称的一锤子买卖)的任务管理比较弱,比如常见的情况,把所有的http重启,puppet对此无能为力(当然也有workaround,比如在httpd.conf加个注释,然后notify给service)。现在来看下Ansible,无需深入,它跟for... 然后ssh 到每个机器差不多,但又跟puppet类似加了很多可编程和控制的东西。若是你用Puppet为主,建议不要深究,大概了解即可。
废话不多,先来安装,这里用了python的virtual environment.
Setup Ansible in your folder
-
sudo yum -y install python-pip.noarch python-devel.x86_64
-
sudo pip-python install virtualenv
-
mkdir ~/Ansible
cd ~/Ansible
virtualenv .venv
source .venv/bin/activate
pip install ansible
-
-
ssh-agent | head -2 > ~/.ssh/.agent.env
source ~/.ssh/.agent.env
ssh-add ~/.ssh/id_rsa
-
git clone git://github.com/kennethreitz/autoenv.git ~/.autoenv
-
echo "source ~/.autoenv/activate.sh" >> ~/.bash_profile
-
source ~/.autoenv/activate.sh
-
cat > ~/Ansible/.active_ansible <<\EOF
-
source ~/Ansible/.venv/bin/activate # Activeate virtualenv
-
source ~/.ssh/.agent.env # Load ssh-agent env
-
export ANSIBLE_HOSTS=~/Ansible/inventory
-
export ANSIBLE_HOST_KEY_CHECKING=False # Set ansible config
-
export ANSIBLE_FORKS=20 # Specify ansible parallel processes
-
# export ANSIBLE_PRIVATE_KEY_FILE=~/.ssh/id_rsa
-
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的分发。
-
# temp.yaml
-
---
-
- hosts: all
-
gather_facts: False
-
vars:
-
authorized_keys: authorized_keys
-
ssh_dir: /home/hfu/.ssh
-
owner: hfu
-
group: Ops
-
tasks:
-
- name: set attributes of .ssh
-
action: file path={{ ssh_dir }} owner={{ owner }} group={{ group }} mode=0700 state=directory
-
- name: put public key in ~/.ssh/
-
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,这个不多说了,见名知意。
当然你可以参考这个 了解跟多。
阅读(3638) | 评论(0) | 转发(0) |