单位用的ansible,也用了salt,当然也用了puppet,所以自动化管理工具,基本上几个重量级的都用到了,所以这边总结就开始利用三者对比使用的总结
以上内容摘自ansible中国工作组 http://www.ansible.cn/wordpress/?p=27
/ | Puppet | Saltstack | ansible
—- | —- | —- | —-
开发语言 | Ruby | Python | Python
是否有客户端 | 有 | 有 | 无
是否支持二次开发 | 不支持 | 支持 | 支持
服务器与远程机器是否相互验证 | 是 | 是 | 是
服务器与远程机器通信是否加密 | 是,标准 SSL 协议 | 是,使用 AES | 加密 是,使用 OpenSSH
平台支持 | 支持 AIX、BSD、HP-UX、Linux、 MacOSX、Solaris、 Windows | 支持 BSD、Linux、Mac OS X、Solaris、 Windows | 支持 AIX、BSD、 HP-UX、 Linux、Mac OSX、Solaris
是否提供 web ui | 提供 | 提供 | 提供,不过是商业版本
配置文件格式 | Ruby 语法格式 | YAML | YAML
命令行执行 | 不支持,但可通过配置模块实现 | 支持 | 支持
如果去国外找找,Ansible在国外的流行程度甚至超过salt
Distribution : CentOS 6.5 minimal
ansible version : 1.5.5
Init system : sysvinit
1、时间同步
2、关闭selinux
node134:master
node131:slave
rpm -Uvh http://ftp.linux.ncsu.edu/pub/epel/6/i386/epel-release-6-8.noarch.rpm
yum install ansible
当用Mac os进行管理的时候,使用了密码管理会提示
to use the 'ssh' connection type with passwords, you must install the sshpass programcentos或者Ubuntu都可以用包管理工具进行管理,但是Mac上homebrew却因为安全原因不支持这个包,所以必须手动或者安装非官方的包
第一种方式:手动安装
cd ~/Downloads
curl -O -L http://downloads.sourceforge.net/project/sshpass/sshpass/1.05/sshpass-1.05.tar.gz
tar xvzf sshpass-1.05.tar.gz
cd sshpass-1.05
./configure
make
sudo make install
```
第二种方式,安装Mac os包管理器之外第三方包
brew install https://raw.github.com/eugeneoden/homebrew/eca9de1/Library/Formula/sshpass.rb
/etc/ansible/hosts — 默认资源文件
/usr/share/ansible/ — 默认模块库
/etc/ansible/ansible.cfg — 默认配置文件
~/.ansible.cfg — 用户配置文件,如果使用优先级高于ansible.cfg配置文件
具体配置文件参考:http://docs.ansible.com/intro_configuration.html#pipelining
ansible是基于ssh协议之上进行远程管理,所以无须安装客户端,直接只要能ssh连接过去,就可以进行管理了
cp hosts hosts.bak
vim hosts
[test] //group_name,名称可以自定义,可以将不同的作用的机器放在不同的组里
192.168.122.134
192.168.122.131
[test]
192.168.122.134 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=skstserver
#ssh无秘钥登录
ssh-keygen -t rsa -P ''
ssh-copy-id -i .ssh/id_rsa.pub [email protected]
为ansible开始管理节点传递公钥
如果是可以直接使用root的环境,则直接使用这个脚本
vim tra_pub.exp
#!/usr/bin/expect -f
set timeout -1
set user root
set passwd "123456"
for { set i 201 } { $i < 208 } { incr i } {
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected].$i
expect {
"yes/no" { send "yes\r";exp_continue }
"id_rsa" { send "yes\r";exp_continue }
"*assword" { send "$passwd\r" }
}
}
expect eof
如果需要使用普通用户进行切换的环境则可以使用以下的脚本
#!/usr/bin/expect -f
set timeout -1
set user test
set passwd "123456"
for { set i 100 } { $i < 120 } { incr i } {
spawn ssh -l $user 172.41.30.$i
expect {
"yes/no" { send "yes\r";exp_continue }
"id_rsa" { send "yes\r";exp_continue }
"*assword" { send "$passwd\r" ;exp_continue }
"test@" {
send "sudo su -\r"
expect {
"password for test" { send "$passwd\r";exp_continue }
}
}
}
}
expect eof
exit 0
直接利用for循环进行批量的写入
for i in $(seq 200 240);do echo 192.168.1.$i >> /etc/ansible/hosts;done
# ansible all -a 'pwd' -f 10 #10个线程
192.168.122.131 | success | rc=0 >>
/root
192.168.122.134 | success | rc=0 >>
/root
# tree /usr/share/ansible/ -L 1 \\所有模块库存放位置
/usr/share/ansible/
├── cloud
├── commands
├── database
├── files
├── internal
├── inventory
├── messaging
├── monitoring
├── net_infrastructure
├── network
├── notification
├── packaging
├── source_control
├── system
├── utilities
└── web_infrastructure
16 directories, 0 files
这边以定时任务模块举例,创建定时任务
模块主页:http://docs.ansible.com/cron_module.html# ansible test -m cron -a 'name="create test crontab" minute="*1" job="/usr/sbin/ntpdate pool.ntp.org &> /dev/null"' 192.168.122.131 | success >> { "changed": true, "jobs": [ "create test crontab" ] } 192.168.122.134 | success >> { "changed": true, "jobs": [ "create test crontab" ] }
检测结果
# ansible all -a 'crontab -l'
#Ansible: create test crontab
*1 * * * * /usr/sbin/ntpdate pool.ntp.org &> /dev/null
#Ansible: create test crontab
*1 * * * * /usr/sbin/ntpdate pool.ntp.org &> /dev/null
模块主页:http://docs.ansible.com/service_module.html
# ansible all -m service -a 'name=httpd state=started' 192.168.122.131 | FAILED >> { "failed": true, "msg": "cannot find 'service' binary or init script for service, possible typo in service name?, aborting" } 192.168.122.134 | success >> { "changed": true, "name": "httpd", "state": "started" }
\因为再122.134上,有安装的httpd的启动脚本,而131上没有,所以module执行成功的前提是需要有相关的服务支持
# ansible all -a 'rpm -q vsftpd' \\查看远程机器上是否安装了vsftpd的包
192.168.122.131 | FAILED | rc=1 >>
package vsftpd is not installed
192.168.122.134 | FAILED | rc=1 >>
package vsftpd is not installed
```
#利用yum的module来进行
# ansible all -m yum -a 'name=vsftpd state=present'
\\安装过程取决于网络安装的速度
```
#检测结果
# ansible all -a 'rpm -q vsftpd'
192.168.122.131 | success | rc=0 >>
vsftpd-2.2.2-11.el6_4.1.x86_64
192.168.122.134 | success | rc=0 >>
vsftpd-2.2.2-11.el6_4.1.x86_64
ansible的功能远远不止如此,重头的playbook也是下面要学习的重点
ansible all -m setup
这里的信息即为gather信息,后面可以使用这些信息做一些判断
参考了the5fire博客的内容
大概的流程,只是针对playbook来说(Ad-Hoc的执行是直接掉得runner)。
1.首先ansbile-playbook接受到参数: playbook.yml,然后读取这个yml文件,根据这个yml文件生成Playbook对象,代码: class Playbook 。
2.在这个Playbook中加载yml文件,在执行时生成Play对象,在Play对象中又包含了Task对象,一个Task对象可以算是一个最小的执行单元。
3.到了Task这一步之后就应该调用runner接口了,这个接口的调用还是在Playbook这个类中: Playbook._run_task_internal 。而这个runner接口,上面已经介绍了,到此也就大体了解上层的执行过程了。
1、"msg": "Error: ansible requires a json module, none found!"
原因是python版本过低,要不升级python要不就安装python-simplejson
```
2、paramiko: The authenticity of host '192.168.122.132' can't be established.
The ssh-rsa key fingerprint is 397c139fd4b0d763fcffaee346a4bf6b.
Are you sure you want to continue connecting (yes/no)?
如果know_hosts中没有目标机器,那么ansible第一次连接的时候会报一个异常
如果不希望提示这个异常,直接编辑
# vim ansible.cfg
host_key_checking = False #取消注释
```
3、FAILED: not a valid DSA private key file
需要你在最后添加参数-k,也就是-k, --ask-pass ask for SSH password
另外默认ansible是使用key验证的,如果使用密码登陆的服务器,使用ansible的话,要不修改ansible.cfg配置文件的ask_pass = True给取消注释,
要不就在运行命令时候加上-k,这个意思是-k, --ask-pass ask for SSH password
```
4、Error: ssh encountered an unknown error during the connection
命令行碰到这个问题,两种办法可以解决,
a、inventory的每个item记录后面加上 ansible_ssh_user=root,当然环境不允许root的,需要进行sudo了
b、命令行上加上-u user进行连接