ansible(一)——基本安装使用
单位用的ansible,也用了salt,当然也用了puppet,所以自动化管理工具,基本上几个重量级的都用到了,所以这边总结就开始利用三者对比使用的总结
step0:简介
- Ansible是一种集IT系统的配置管理、应用部署、流程设置的开源软件工具,与其他管理软件工具有多方面的差异。目标是提供面对广泛的自动化挑战如何获得大型生产力的优势。当Ansible提供更强大的生产力逐步替代其他许多核心性能的自动化解决方案,它也在寻求解决其他还没解决的IT挑战,这些包括如何时复杂多层级工作流程清晰化、清楚统一的OS配置、在单一框架下应用软件的部署。
- Ansible追寻保持IT工作流程描述的可理解性和能够快速部署。这意味着需要容易构建、容易理解 – 例如新用户能够快速融入新的IT项目。长期存在自动化的内容即使是项目结束数个月之后也能够容易理解。Ansible追寻使事情强大满足专家使用,同时也能满足不同水平级别用户需求,保证较快把IT项目推向市场,在IT配置需要变更时候能够易于较快、较少错误。
- Ansible是基于最小性质、一致性、安全性、高可靠性设计的,同时对于管理员、开发者、IT经理的学习曲线都非常低。
- Ansible和该领域许多其他的工具的最主要区别就是他们的架构:
- Ansible默认管理远端机器是通过SSH,可以使用paramiko库(基于Python)或OS-native OpenSSH,当使用OpenSSH时也支持Kerberized SSH和堡垒主机。 是否需要其他方式的传输,传输方式是可以以插件方式添加的,例如基于0MQ加速传输就是这种方式。也提供本地连接类型(无网络)。
- Ansible不需要root用户权限,如果需要可以通过sudo来访问。
- Ansible不需要指定的SSH密钥或专用帐号,可以使用任何OS授权用户或遵从你的操作系统允许的模型提供的帐号 当需要的时候,Ansible将传输模块到远程节点,将运行在远程用户授权的模式下,并且不会留下任何安装信息在这些远程节点上。
- Ansible不需要任何在管理机器运行的服务软件,只需要授权用户有执行权限就可以。
- Ansible不需要在任何远端机器上安装任何代理软件。 不需要维护除SSH端口之外的任何端口和额外的PKI架构。 这些访问控制服务器(或源控制)不能推送内容到远程系统(除了命令他们)也在远程系统上没有授权 当Ansible不管理远程机器时候,远程这些机器没有任何资源损耗。
- Ansible集这些特性于一身,使它成为高安全环境、高性能情况下的理想选择,同时关注管理代理的稳定性或性能,通常这些特性在所有的计算机领域都是有用的。
以上内容摘自ansible中国工作组 http://www.ansible.cn/wordpress/?p=27
Ansible Vs. puppet Vs. Saltstack 对比
/ | 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
step1:安装
1.拓扑
node134:master
node131:slave
2.安装
rpm -Uvh http://ftp.linux.ncsu.edu/pub/epel/6/i386/epel-release-6-8.noarch.rpm
yum install ansible
Mac 下的安装
当用Mac os进行管理的时候,使用了密码管理会提示 to use the 'ssh' connection type with passwords, you must install the sshpass program
centos或者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
3.配置文件
/etc/ansible/hosts — 默认资源文件
/usr/share/ansible/ — 默认模块库
/etc/ansible/ansible.cfg — 默认配置文件
~/.ansible.cfg — 用户配置文件,如果使用优先级高于ansible.cfg配置文件
具体配置文件参考:http://docs.ansible.com/intro_configuration.html#pipelining
step2:远程执行命令
ansible是基于ssh协议之上进行远程管理,所以无须安装客户端,直接只要能ssh连接过去,就可以进行管理了
1.配置管理客户端和秘钥登录
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 root@192.168.122.131
2、批量发送公钥
为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 $user@192.168.1.$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
3、批量定义inventory
直接利用for循环进行批量的写入
for i in $(seq 200 240);do echo 192.168.1.$i >> /etc/ansible/hosts;done
4.测试远程执行命令
# ansible all -a 'pwd' -f 10 #10个线程
192.168.122.131 | success | rc=0 >>
/root
192.168.122.134 | success | rc=0 >>
/root
step3:利用模块管理远程主机
# 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
1.创建定时任务
这边以定时任务模块举例,创建定时任务 模块主页: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
2.判断某个服务是否正常启动
# 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执行成功的前提是需要有相关的服务支持
3.批量安装包
# 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也是下面要学习的重点
4、查看节点信息
ansible all -m setup
这里的信息即为gather信息,后面可以使用这些信息做一些判断
step4:执行原理
参考了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接口,上面已经介绍了,到此也就大体了解上层的执行过程了。
step5:FAQ
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进行连接