安装机器redhat 6.8 自带python2.6
Ansible介绍
一、基础介绍
==========================================================================================
1、简介
ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:
(1)、连接插件connection plugins:负责和被监控端实现通信;
(2)、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
(3)、各种模块核心模块、command模块、自定义模块;
(4)、借助于插件完成记录日志邮件等功能;
(5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。
2、总体架构
3、特性
(1)、no agents:不需要在被管控主机上安装任何客户端;
(2)、no server:无服务器端,使用时直接运行命令即可;
(3)、modules in any languages:基于模块工作,可使用任意语言开发模块;
(4)、yaml,not code:使用yaml语言定制剧本playbook;
(5)、ssh by default:基于SSH工作;
(6)、strong multi-tier solution:可实现多级指挥。
4、优点
(1)、轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
(2)、批量任务执行可以写成脚本,而且不用分发到远程就可以执行;
(3)、使用python编写,维护更简单,ruby语法过于复杂;
(4)、支持sudo。
5、任务执行流程
1、安装
(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-------报错1
# make
# make install
报错1解决:
安装epel
下载epel.rpm ,安装,执行configure还是报错,缺少gcc
更换centos6的yum源,参考网页
安装:python-iniparse-0.3.1-2.1.el6.noarch.rpm,yum-3.2.29-81.el6.centos.noarch.rpm,yum-metadata-parser-1.1.2-16.el6.x86_64.rpm,yum-plugin-fastestmirror-1.1.30-40.el6.noarch.rpm
更新yum.repo
Yum clean all
Yum install
这样执行yum install gcc ok
执行完后,python 看下换成2.7版本
(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
# tar xvzf pycrypto-2.6.1.tar.gz
# cd pycrypto-2.6.1
# python setup.py install
(4)、PyYAML模块安装
http://pyyaml.org/download/libyaml/yaml-0.1.5.tar.gz
# tar xvzf yaml-0.1.5.tar.gz
# cd yaml-0.1.5
# ./configure --prefix=/usr/local
# make --jobs=`grep processor/proc/cpuinfo | wc -l`
# make install
https://pypi.python.org/packages/source/P/PyYAML/PyYAML-3.11.tar.gz
# tar xvzf PyYAML-3.11.tar.gz
# cd PyYAML-3.11
# python setup.py install
(5)、Jinja2模块安装
https://pypi.python.org/packages/source/M/MarkupSafe/MarkupSafe-0.9.3.tar.gz
# tar xvzf MarkupSafe-0.9.3.tar.gz
# cd MarkupSafe-0.9.3
# python setup.py install
https://pypi.python.org/packages/source/J/Jinja2/Jinja2-2.7.3.tar.gz
# tar xvzf Jinja2-2.7.3.tar.gz
# cd Jinja2-2.7.3
# python setup.py install
(6)、paramiko模块安装
https://pypi.python.org/packages/source/e/ecdsa/ecdsa-0.11.tar.gz
# tar xvzf ecdsa-0.11.tar.gz
# cd ecdsa-0.11
# python setup.py install
https://pypi.python.org/packages/source/p/paramiko/paramiko-1.15.1.tar.gz
# tar xvzf paramiko-1.15.1.tar.gz
# cd paramiko-1.15.1
# python setup.py install
(7)、simplejson模块安装
https://pypi.python.org/packages/source/s/simplejson/simplejson-3.6.5.tar.gz
# tar xvzf simplejson-3.6.5.tar.gz
# cd simplejson-3.6.5
# python setup.py install
(8)、ansible安装
https://github.com/ansible/ansible/archive/v1.7.2.tar.gz
# tar xvzf ansible-1.7.2.tar.gz
# cd ansible-1.7.2
# python setup.py install
2、配置
(1)、SSH免密钥登录设置
## 生成公钥/私钥
# ssh-keygen -t rsa -P ''
## 写入信任文件(将/root/.ssh/id_rsa.pub分发到其他服务器(10.158.42.236),并在所有服务器上执行如下指令):
# cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
# chmod 600 /root/.ssh/authorized_keys
Ssh 10.158.42.236 –p 10022 登录下,成功
(2)ansible配置
把ansible这个源码包里面的examples文件夹拷贝到/etc/ansible下。/etc/ansible是ansible是默认配置文件路径,但是编译安装的时候没有生成这个路径,我们需要手动建立。而examples文件夹下面是ansible默认的配置文件,及例子。
root@ansible:~/ansible# mkdir /etc/ansible
root@ansible:~/ansible# cp -r examples/* /etc/ansible/
root@ansible:~/ansible# ls /etc/ansible/
ansible.cfg DOCUMENTATION.yml hosts issues playbooks scripts
root@ansible:~/ansible#
这个ansible.cfg是ansible的主配置文件,装好之后随便看看。最新的版本是1.7
root@ansible:~/ansible# ansible --version
ansible 1.7
root@ansible:~/ansible# ansible --help >/dev/null
root@ansible:~/ansible#
ansible管理主机,DNS域名,IP都可以,先弄个主机到到本地hosts里面
root@ansible:~# echo "10.158.42.236 zidonghua" >>/etc/hosts
楼主定义了一个主机名,一个IP到/etc/ansible/hosts里面。 /etc/ansible/hosts是默认的hostfile路径
lixc@ansible:~$ grep hostfile /etc/ansible/ansible.cfg
hostfile = /etc/ansible/hosts
root@ansible:/home# echo -e "zidonghua 10.158.42.236" >/etc/ansible/hosts
检查一下
lixc@ansible:/home$ cat /etc/ansible/hosts
zidonghua
10.158.42.236
OK,和salt一样先看看机器是否连通。楼主这里用的是ssh key。所以不需要加用户密码了。通了,返回了一个json格式的结果
lixc@ansible:/home$ ansible all -m ping
salt-master | success >> {
"changed": false,
"ping": "pong"
}
10.240.162.112 | success >> {
"changed": false,
"ping": "pong"
}
注意这个地方是有个坑的,由于ansible执行的时候需要把临时模块拷贝到客户端,而默认的拷贝方式是通过tftp来的方式拷贝的,如果你的客户端没有装sftp,那么执行ansible会出错的。
lixc@salt-master:~$ dpkg -l sftp
dpkg-query: no packages found matching sft
看到没,楼主的就没装sftp。
那楼主用咋传的呢,用的是scp。 下面的这一行本来是注释起来的,把注释去掉就OK了
lixc@ansible:~$ grep "scp_if_ssh" /etc/ansible/ansible.cfg
scp_if_ssh = True
还有个坑就是,即使装了tftp也不一定能用,咋回事呢,你的ssh要启用它才OK,看下面就知道了。
root@salt-master:/home/lixc# grep "Subsystem" /etc/ssh/sshd_config
Subsystem sftp /usr/lib/openssh/sftp-server
还有个注意:需要把ansible.cfg 中的port 22改为对方服务器的端口10022
OK
拷贝个文件玩玩,
lixc@ansible:/home$ ansible salt-master -m copy -a "src=./testfile dest=/tmp"
salt-master | success >> {
"changed": true,
"dest": "/tmp/testfile",
"gid": 1000,
"group": "lixc",
"md5sum": "d41d8cd98f00b204e9800998ecf8427e",
"mode": "0644",
"owner": "lixc",
"size": 0,
"src": "/home/lixc/.ansible/tmp/ansible-tmp-1403769668.42-75871571353467/source",
"state": "file",
"uid": 1000
}
查看一下,拷贝过去了没?
lixc@ansible:/home$ ansible salt-master -a "ls /tmp/testfile"
salt-master | success | rc=0 >>
/tmp/testfile
下面说说ansible的工作流程吧,工作流程差不多是这样的
- ansible通过OPENSSH或者python的pramamiko连接客户端
- 把ansible module推送到客户端。推送到客户端哪里的呢,请看
lixc@ansible:~$ grep "remote_tmp" /etc/ansible/ansible.cfg
remote_tmp = $HOME/.ansible/tmp
lixc@ansible:~$ ansible salt-master -a "ls ~/.ansible"
salt-master | success | rc=0 >>
tmp
3.通过ssh执行客户端上的ansible module
4.执行完毕
5.删除刚刚推送过去的ansible module
3、其他模块
(1)、setup
## 用来查看远程主机的一些基本信息
Ansible all –m setup 或者ansible 10.158.42.236 -m setup
(2)、ping
## 用来测试远程主机的运行状态
# ansible all -m ping
(3)、file
## 设置文件的属性
相关选项如下:
force:需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no
group:定义文件/目录的属组
mode:定义文件/目录的权限
owner:定义文件/目录的属主
path:必选项,定义文件/目录的路径
recurse:递归设置文件的属性,只对目录有效
src:被链接的源文件路径,只应用于state=link的情况
dest:被链接到的路径,只应用于state=link的情况
state:
directory:如果目录不存在,就创建目录
file:即使文件不存在,也不会被创建
link:创建软链接
hard:创建硬链接
touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
absent:删除目录、文件或者取消链接文件
示例:
## 远程文件符号链接创建
# ansible all -m file -a "src=/etc/resolv.conf dest=/tmp/resolv.conf state=link"
## 远程文件信息查看
# ansible all -m command -a "ls -al /tmp/resolv.conf"
## 远程文件符号链接删除
# ansible all -m file -a "path=/tmp/resolv.conf state=absent"
## 远程文件信息查看
# ansible all -m command -a "ls -al /tmp/resolv.conf"
说明:如上显示,代表文件或链接已经删除。
(4)、copy
## 复制文件到远程主机
相关选项如下:
backup:在覆盖之前,将源文件备份,备份文件包含时间信息。有两个选项:yes|no
content:用于替代“src”,可以直接设定指定文件的值
dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录
directory_mode:递归设定目录的权限,默认为系统默认权限
force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes
others:所有的file模块里的选项都可以在这里使用
src:被复制到远程主机的本地文件,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用“/”来结尾,则只复制目录里的内容,如果没有使用“/”来结尾,则包含目录在内的整个内容全部复制,类似于rsync。
示例:
## 将本地文件“/etc/ansible/ansible.cfg”复制到远程服务器
# ansible all -m copy -a "src=/etc/ansible/ansible.cfg dest=/tmp/ansible.cfg owner=root group=root mode=0644"
## 远程文件信息查看
# ansible all -m command -a "ls -al /tmp/ansible.cfg"
(5)、command
## 在远程主机上执行命令
相关选项如下:
creates:一个文件名,当该文件存在,则该命令不执行
free_form:要执行的linux指令
chdir:在执行指令之前,先切换到该目录
removes:一个文件名,当该文件不存在,则该选项不执行
executable:切换shell来执行指令,该执行路径必须是一个绝对路径
示例:
# ansible all -m command -a "uptime"
(6)、shell
## 切换到某个shell执行指定的指令,参数与command相同。
与command不同的是,此模块可以支持命令管道,同时还有另一个模块也具备此功能:raw
示例:
## 先在本地创建一个SHELL脚本
# vim /tmp/rocketzhang_test.sh
#!/bin/sh
date +%F_%H:%M:%S
#chmod +x /tmp/rocketzhang_test.sh
## 将创建的脚本文件分发到远程
# ansible all -m copy -a "src=/tmp/test.sh dest=/tmp/test.sh owner=root group=root mode=755"
## 远程执行
# ansible all -m shell -a "/tmp/test.sh"
(7)、更多模块
其他常用模块,比如:service、cron、yum、synchronize就不一一例举,可以结合自身的系统环境进行测试。
service:系统服务管理
cron:计划任务管理
yum:yum软件包安装管理
synchronize:使用rsync同步文件
user:系统用户管理
group:系统用户组管理
更多模块可以参考:
#ansible-doc –l
http://docs.ansible.com/modules_by_category.html
(国内的一个镜像站点,避免被墙 ^_^ )
(2) 查看ansible的模块以及参数
# ansible-doc
-l 列出所有的ansible模块
-s 列出该模块的相关指令
[root@master ~]# ansible-doc -l
boundary_meter Manage boundary
meters
bzr
Deploy software (or files) from bzr
branches
campfire
Send a message to
Campfire
capabilities Manage Linux
capabilities
cloudformation create a AWS CloudFormation
stack
command
Executes a command on a remote
node
composer
Dependency Manager for
PHP
copy
Copies files to remote
locations.
cpanm
Manages Perl library
dependencies.
cron
Manage cron.d and crontab
entries.
datadog_event Posts events to
DataDog
service
[root@master ~]# ansible-doc
-s command
- name: E x e c u t e s a c o m m a n d o
n a r e m o t e n o d e
action: command
chdir
# cd into this directory before running the command
creates
# a filename, when it already exists, this step will *not* be run.
executable
# change the shell used to execute the command. Should be an absolute path to
the executable.
free_form=
# the command module takes a free form command to run. There is no
parameter actually named 'free form'. See the
examples!
removes
# a filename, when it does not exist, this step will *not* be run.
warn
# if command warnings are on in ansible.cfg, do not warn about this particular
line if set to no/false.
(8)、一些概念补充
playbook的组成:playbook是由一个或多个“play”组成的列表,可以让它们联同起来按事先编排的机制执行;所谓task无非是调用ansible的一个module,而在模块参数中可以使用变量;模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致;
执行模型:task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个。在顺序运行某playbook时,如果中途发生错误,所有已执行任务都将回滚,因此,在修改playbook后重新执行一次即可;
task组成:每个task都应该有其name,用于playbook的执行结果输出,建议其内容尽可能清晰地描述任务执行步骤。如果未提供name,则action的结果将用于输出;
notify指定handler的执行机制:“notify”这个action可用于在每个play的最后被触发,在notify中列出的操作称为handler,仅在所有的变化发生完成后一次性地执行指定操作。
Hosts中进行分组,分组操作实验
1、ssh免密认证
10.141.3.223上执行
scp -P 10022 /root/.ssh/id_rsa.pub root@10.141.5.145:/root/.ssh
5.145上执行
[root@localhost .ssh]# cat id_rsa.pub >>authorized_keys
[root@localhost .ssh]# chmod 600 authorized_keys
223上登录验证
ssh 10.141.5.145 -p 10022 ---ok
2、修改223上/etc/ansible/hosts
ansible通过读取默认的主机清单文件/etc/ansible/hosts,该文件在/etc/ansible/ansible.cfg文件中指定,可以自定义主机,支持IP,域名,支持分组,便于对某
些主机或者某一组功能相同的主机进行操作,还有一个缺省的all组,代表Inventory中所有主机。
# vi /etc/ansible/hosts
[test]
192.168.10.191
192.168.10.192
示例:可以指定端口与用户与密码:
192.168.10.191 ansible_ssh_port=2222 ansible_ssh_user=root
ansible_ssh_pass=passwd
192.168.10.191:2222
修改223上的hosts
分组操作:
Hosts中增加三个组
Ansible test1 –m ping success
Ansible test2 –m ping success
Ansible test3 –m ping failed
原因145上python版本低,为2.4,需升级或安装python-simplejson
安装python-simplejson
安装成功后,再ping 下ok
Ansible module
Setup模块使用
ansible-doc -s setup
ansible test1 -m setup -a 'filter=ansible_processor'
Ansible_api setup------接口调用