安装机器redhat 6.8 自带python2.6html
Ansible介绍node
1、基础介绍python
==========================================================================================linux
1、简介git
ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优势,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于模块工做的,自己没有批量部署的能力。真正具备批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:github
(1)、链接插件connection plugins:负责和被监控端实现通讯;shell
(2)、host inventory:指定操做的主机,是一个配置文件里面定义监控的主机;json
(3)、各类模块核心模块、command模块、自定义模块;vim
(4)、借助于插件完成记录日志邮件等功能;c#
(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)、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
(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\n10.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的工做流程吧,工做流程差很少是这样的
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
(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中进行分组,分组操做实验
一、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
二、修改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------接口调用