ansible是一种自动化运维工具,基于paramiko开发的,并且基于模块化工作,Ansible是一种集成IT系统的配置管理、应用部署、执行特定任务的开源平台,它是基于python语言,由Paramiko和PyYAML两个关键模块构建。集合了众多运维工具的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能.ansible是基于模块工作的,本身没有批量部署的能力.真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架.ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的.
https://www.jianshu.com/p/c82737b5485c
ansible被定义为配置管理工具,配置管理工具通常具有以下功能:
常用的自动化运维工具技术特性比较:
项目 | Puppet | SaltStack | Ansible |
---|---|---|---|
开发语言 | Ruby | Python | Python |
是否有客户端 | 有 | 有 | 无 |
是否支持二次开发 | 不支持 | 支持 | 支持 |
服务器与远程机器是否相互验证 | 是 | 是 | 是 |
服务器与远程机器的通信是否加密 | 是,标准的SSL协议 | 是,使用AES加密 | 是,使用OpenSSH |
平台支持 | AIX , BSD, HP-UX, Linux , Mac OSX , Solaris, Windows | BSD, Linux , Mac OS X , Solaris, Windows | AIX , BSD , HP-UX , Linux , Mac OS X , Solaris |
是否提供Web UI | 提供 | 提供 | 提供,但是是商业版本 |
配置文件格式 | Ruby 语法格式 | YAML | YAML |
命令行执行 | 不支持,大师可以通过配置模块实现 | 支持 | 支持 |
ansible系统由控制主机和被管理主机组成,控制主机不支持windows平台
部署简单, 只需要在控制主机上部署ansible环境,被控制端上只要求安装ssh和python 2.5以上版本,这个对于类unix系统来说相当与无需配置.
/etc/ansible/
/usr/bin/
/usr/lib/python2.7/site-packages/ansible/
/usr/lib/python2.7/site-packages/ansible
[root@server1 ~]# ls
ansible-2.7.8-1.el7.noarch.rpm
ansible-tower-setup-bundle-3.4.2-1.el7.tar.gz
libtomcrypt-1.17-25.el7.x86_64.rpm
libtommath-0.42.0-5.el7.x86_64.rpm
python2-crypto-2.6.1-13.el7.x86_64.rpm
python2-jmespath-0.9.0-1.el7.noarch.rpm
python-httplib2-0.9.2-0.1.el7.noarch.rpm
python-keyczar-0.71c-2.el7.noarch.rpm
python-paramiko-2.1.1-0.9.el7.noarch.rpm
sshpass-1.06-1.el7.x86_64.rpm
[root@server1 ~]# yum install -y *
[root@server1 ansible]# useradd devops
[root@server1 ansible]# su - devops
[devops@server1 ~]$ ls
[devops@server1 ~]$ mkdir ansible
[devops@server1 ~]$ cd ansible/
[devops@server1 ansible]$ ls
[devops@server1 ansible]$ pwd
/home/devops/ansible
[root@server2 ~]# useradd devops
[root@server2 ~]# id devops
uid=1000(devops) gid=1000(devops) groups=1000(devops)
[root@server2 ~]# passwd devops
[root@server3 ~]# useradd devops
[root@server3 ~]# id devops
uid=1000(devops) gid=1000(devops) groups=1000(devops)
[root@server3 ~]# passwd devops
[devops@server1 ~]$ ls
[devops@server1 ~]$ mkdir ansible
[devops@server1 ~]$ cd ansible/
[devops@server1 ansible]$ ls
[devops@server1 ansible]$ pwd
/home/devops/ansible
[devops@server1 ansible]$ vim ansible.cfg
1 [defaults]
2
3 inventory = inventory
[devops@server1 ansible]$ ls
ansible.cfg
[devops@server1 ansible]$ vim inventory
1 [test]
2 server2
3
4 [db]
5 server3
6
7 [webservers:children]
8 test
9 db
文件的编写是很灵活的,又很多中写法。
这里列举4种方法:
<1>一个web组,组中有两个主机,分别的server1和server2
[web]
server1
server2
<2>一个web组,组中有很多主机,主机名只要是以server开头的即可
[web]
server*
<3>一个web组,组中有100个主机,主机名是server1-server100
[web]
server[1:100]
<4>两个组,一个web组,一个db组。web组中的主机为server1,db组中的主机为server2。
[web]
server1
[db]
server2
[devops@server1 ansible]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/devops/.ssh/id_rsa):
Created directory '/home/devops/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/devops/.ssh/id_rsa.
Your public key has been saved in /home/devops/.ssh/id_rsa.pub.
The key fingerprint is:
02:79:4e:dc:5c:4e:eb:17:ed:96:77:b7:c2:55:5a:45 devops@server1
The key's randomart image is:
+--[ RSA 2048]----+
| o .E|
| o o + . . .|
| o + o o . . o|
| = . o +.|
| o S . . =.+|
| . .....+|
| o . |
| . |
| |
+-----------------+
[devops@server1 ansible]$ ssh-copy-id server2
[devops@server1 ansible]$ ssh-copy-id server3
[devops@server1 ansible]$ ansible all --list-host
hosts (2):
server3
server2
[devops@server1 ansible]$ ansible all -m ping
server2 | SUCCESS => {
"changed": false,
"ping": "pong"
}
server3 | SUCCESS => {
"changed": false,
"ping": "pong"
}
[devops@server1 ansible]$ ansible server2 -m ping
server2 | SUCCESS => {
"changed": false,
"ping": "pong"
}
[devops@server1 ansible]$ ansible server3 -m ping
server3 | SUCCESS => {
"changed": false,
"ping": "pong"
}
[devops@server1 ansible]$ ansible test -m ping
server2 | SUCCESS => {
"changed": false,
"ping": "pong"
}
[devops@server1 ansible]$ ansible db -m ping
server3 | SUCCESS => {
"changed": false,
"ping": "pong"
}