ansible(一)——基本安装使用

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 [email protected]

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 [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

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.判断某个服务是否正常启动

模块主页: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执行成功的前提是需要有相关的服务支持

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进行连接

你可能感兴趣的:(ansible,基本使用)