1.ansible是新出现的自动化运维工具,基于Python开发,
集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点
实现了批量系统配置、批量程序部署、批量运行命令等功能。
2.ansible是基于模块工作的,本身没有批量部署的能力。
真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。
主要包括:
(1)、连接插件connection plugins:负责和被监控端实现通信;
(2)、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
(3)、各种模块核心模块、command模块、自定义模块;
(4)、借助于插件完成记录日志邮件等功能;
(5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。
实验环境:
server21 172.25.70.2 ansible端,服务端
server3 172.25.70.3 客户端
**注意:**
Ansible是用Python开发的,使用ansible需要操作系统有Python,建议Python版本2.6以上。
Ansible安装所依赖插件较多,具体安装过程如下:
注:所有的软件包全部在/usr/local/目录下进行安装
基本安装
安装gcc,用于编译Python源码
yum install gcc
安装zlib(如果没安装,在安装setuptools时可能会出现的错误RuntimeError:Compression requires the (missing) zlib module)
yum install zlib zlib-devel -y
安装openssl(如果不安装,使用easy_install时可能会出现的错误:error:Could not find suitable distribution for Requirement.parse('jinja2'))
本实践未使用这种安装方式,就如下一个一个模块来安装(具体命令:easy_install pycrypto pyyaml jinja2 markupsafe ecdsa paramiko simplejson)
yum install openssl openssl-devel gcc zlib zlib-devel -y
(1)、python2.7安装
https://www.python.org/ftp/python/2.7.8/Python-2.7.8.tgz
# tar xvzf Python-2.7.8.tgz
# cd Python-2.7.8
# ./configure --prefix=/usr/local
# make
# make install
## 将python头文件拷贝到标准目录,以避免编译ansible时,找不到所需的头文件
# cd /usr/local/include/python2.7
# cp -a ./* /usr/local/include/
## 备份旧版本的python,并符号链接新版本的python
# cd /usr/bin
# mv python python.old
# ln -s /usr/local/bin/python2.7 /usr/local/bin/python
# rm -f /usr/bin/python && cp /usr/local/bin/python2.7 /usr/bin/python
这两条命令均执行不然后面测试会报错文件/usr/bin/python不存在
## 修改yum脚本,使其指向旧版本的python,已避免其无法运行
# vim /usr/bin/yum
#!/usr/bin/python --> #!/usr/bin/python2.4
(2)、setuptools模块安装
https://pypi.python.org/packages/source/s/setuptools/setuptools-7.0.tar.gz
# tar xvzf setuptools-7.0.tar.gz
# cd setuptools-7.0
# python setup.py install
(3)、pycrypto模块安装
https://pypi.python.org/packages/source/p/pycrypto/pycrypto-2.6.1.tar.gz
[root@server2 setuptools-7.0]# cd
[root@server2 ~]# ls
pycrypto-2.6.1.tar.gz Python-2.7.8.tgz setuptools-7.0.tar.gz
Python-2.7.8 setuptools-7.0
[root@server2 ~]# tar zxf pycrypto-2.6.1.tar.gz
[root@server2 ~]# cd pycrypto-2.6.1
[root@server2 pycrypto-2.6.1]# python setup.py install
(4)、PyYAML模块安装
[root@server2 ~]# tar zxf PyYAML-3.11\(1\).tar.gz
[root@server2 ~]# cd PyYAML-3.11
[root@server2 PyYAML-3.11]# ls
CHANGES ext lib3 PKG-INFO setup.cfg tests
examples lib LICENSE README setup.py
[root@server2 PyYAML-3.11]# python setup.py install
(5)、Jinja2模块安装
[root@server2 ~]# tar xvzf MarkupSafe-0.9.3.tar.gz
[root@server2 ~]# cd MarkupSafe-0.9.3
[root@server2 MarkupSafe-0.9.3]# ls
AUTHORS MANIFEST.in MarkupSafe.egg-info README.rst setup.py
LICENSE markupsafe PKG-INFO setup.cfg
[root@server2 MarkupSafe-0.9.3]# python setup.py install
[root@server2 ~]# tar xvzf Jinja2-2.7.3.tar.gz
[root@server2 ~]# cd Jinja2-2.7.3
[root@server2 Jinja2-2.7.3]# ls
artwork docs jinja2 Makefile README.rst setup.py
AUTHORS examples Jinja2.egg-info MANIFEST.in run-tests.py
CHANGES ext LICENSE PKG-INFO setup.cfg
[root@server2 Jinja2-2.7.3]# python setup.py install
(6)、paramiko模块安装
[root@server2 ~]# tar xvzf ecdsa-0.11.tar.gz
[root@server2 ~]# cd ecdsa-0.11
[root@server2 ecdsa-0.11]# ls
ecdsa LICENSE MANIFEST.in NEWS PKG-INFO README.md setup.py
[root@server2 ecdsa-0.11]# python setup.py install
[root@server2 ~]# tar xvzf paramiko-1.15.1.tar.gz
[root@server2 ~]# cd paramiko-1.15.1
[root@server2 paramiko-1.15.1]# ls
demos MANIFEST.in PKG-INFO setup_helper.py tests
docs paramiko README setup.py
LICENSE paramiko.egg-info setup.cfg test.py
[root@server2 paramiko-1.15.1]# python setup.py install
(7)、simplejson模块安装
[root@server2 ~]# tar xvzf simplejson-3.6.5.tar.gz
[root@server2 ~]# cd simplejson-3.6.5
[root@server2 simplejson-3.6.5]# ls
CHANGES.txt LICENSE.txt README.rst setup.py
conf.py MANIFEST.in scripts simplejson
index.rst PKG-INFO setup.cfg simplejson.egg-info
[root@server2 simplejson-3.6.5]# python setup.py install
(8)、ansible安装
[root@server2 ~]# tar xvzf ansible-1.7.2.tar.gz
[root@server2 ~]# cd ansible-1.7.2
[root@server2 ansible-1.7.2]# ls
bin docs lib plugins ticket_stubs
CHANGELOG.md docsite library README.md VERSION
CODING_GUIDELINES.md examples Makefile RELEASES.txt
CONTRIBUTING.md hacking MANIFEST.in setup.py
COPYING legacy packaging test
[root@server2 ansible-1.7.2]# python setup.py install
ansible的基础配置:
[root@server2 ansible-1.7.2]# cd examples/
[root@server2 examples]# ls
ansible.cfg DOCUMENTATION.yml hosts issues playbooks scripts
[root@server2 examples]# mkdir /etc/ansible
[root@server2 examples]# cp hosts ansible.cfg /etc/ansible/
[root@server2 examples]# ls -l /etc/ansible/
total 12
-rw-r--r-- 1 root root 7172 8月 16 23:44 ansible.cfg
-rw-r--r-- 1 root root 965 8月 16 23:44 hosts
[root@server2 examples]# pwd
/root/ansible-1.7.2/examples
默认配置文件位置为/etc/ansible/ansilble.cfg,配置文件位置可以修改。
Ansible 按照如下位置和顺序来查找ansible.cfg 文件:
1.ANSIBLE_CONFIG 环境变量所指定的文件。
2../ansible.cfg(当前目录下的ansible.cfg)。
3.~/.ansible.cfg(家目录下的.ansible.cfg)。
4./etc/ansible/ansible
配置ssh登录
[root@server2 examples]# ssh-keygen
[root@server2 ~]# ssh-copy-id server2
The authenticity of host 'server2 (172.25.70.2)' can't be established.
ECDSA key fingerprint is 73:38:80:eb:76:e9:67:50:6c:2e:33:42:3e:23:a6:94.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@server2's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'server2'"
and check to make sure that only the key(s) you wanted were added.
[root@server2 ~]# scp -r .ssh/ server3:/root
The authenticity of host 'server3 (172.25.70.3)' can't be established.
ECDSA key fingerprint is 6c:df:26:2b:73:6c:15:cc:55:3b:48:9c:0b:52:cc:3f.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'server3,172.25.70.3' (ECDSA) to the list of known hosts.
root@server3's password:
id_rsa 100% 1679 1.6KB/s 00:00
id_rsa.pub 100% 406 0.4KB/s 00:00
known_hosts 100% 362 0.4KB/s 00:00
authorized_keys 100% 406 0.4KB/s 00:00
[root@server2 ~]# getenforce
Disabled
[root@server2 ~]# ssh 172.25.70.3
Last login: Thu Aug 16 21:56:04 2018 from 172.25.70.250
[root@server3 ~]# logout
Connection to 172.25.70.3 closed.
在客户端(server3):
[root@server3 Python-2.7.8]# cd
[root@server3 ~]# getenforce ##查看selinux状态
Disabled
[root@server3 ~]# ssh root@172.25.70.2 ##可以免密链接
Last login: Thu Aug 16 21:55:30 2018 from 172.25.70.250
[root@server2 ~]# logout
Connection to 172.25.70.2 closed.
修改ansible的hosts文件
在末尾添加:
vim /etc/ansible/hosts 如果文件中写的是名字得添加解析/etc/hosts
进行测试可以Ping的通:
[root@server2 ~]# ansible all -m ping
vim /etc/ansible/ansible.cfg
1> 禁用每次执行ansbile命令检查ssh key host
host_key_checking = False
2> 开启日志记录
log_path = /var/log/ansible.log
3> ansible连接加速配置
将179,181,182注释,在180行写入
在172.25.70.2的机器:
vim /etc/ansible/hosts
在末尾添加:
[testhosts] #testhosts 是服务器组的名字,用来统一管理服务器
127.0.0.1
xbw.com #xbw.com是172.25.70.3 这台服务器,也可以直接写IP地址。
如果写成域名的形式,则需要修改一下dns的指向或者/etc/hosts ,让dns可以找到xbw.com的IP指向了哪个服务器。
vim /etc/hosts
加入:172.25.70. xbw.com
执行w命令,查看服务器的状态:
ansible testhosts -m command -a ‘w‘
ansible拷贝文件或者目录
在服务端创建文件
vi /tmp/test.sh
#!/bin/bash
echo `date` > /tmp/ansible_test.txt
利用ansible可以方便地将本地的目录或者文件同步到远程服务器,
具体命令:
ansible testhosts -s -m copy -a 'src=/tmp/test.sh dest=/tmp/test.sh mode=0755'
可以批量执行该脚本:
已经创建了/tmp/ansible_test.txt文件了,并在该文件中成功写入了结果。测试成功
ansible实现远程任务执行
利用ansible的cron模块,给远程的服务器批量增加任务计划
每个星期天都重新创建一个文件/tmp/day.txt