Ansible基本部署&&常用模块
1、简介ansible是什么?官方的title是“Ansible is Simple IT Automation”——简单的自动化IT工具;其目标是:自动化部署APP;自动化管理配置项;自动化的持续交付;自动化的(AWS)云服务管理。
ansible基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:
[*]连接插件connection plugins:负责和被监控端实现通信;
[*]host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
[*]各种模块核心模块、command模块、自定义模块;
[*]借助于插件完成记录日志邮件等功能;
[*]playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。
运维工具常见的工作模式
[*]agent模式: 基于ssl实现,代理工作在被监控端,如:puppet
[*]agentless模式: 基于ssh服务实现工作在被监控端,监控端是ssh的客户端。
ansible工作在agentless模式下具有幂等性。ansible在控制端只需要告诉监控端的期望状态就可以实现批量部署。幂等性不会重复执行相同的指令。例如不会重复安装软件 ;期望状态只需要告诉被监控端的期望状态
2、总体架构
3、特性
[*]no agents:不需要在被管控主机上安装任何客户端;
[*]no server:无服务器端,使用时直接运行命令即可;
[*]modules in any languages:基于模块工作,可使用任意语言开发模块;
[*]yaml,not code:使用yaml语言定制剧本playbook;
[*]ssh by default:基于SSH工作;
[*]strong multi-tier solution:可实现多级指挥。
4、优点
[*]轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
[*]批量任务执行可以写成脚本,而且不用分发到远程就可以执行;
[*]使用python编写,维护更简单,ruby语法过于复杂;
[*]支持sudo。
5、任务执行流程
说明:
[*]以上内容大多是基于他人分享的基础上总结而来,学习借鉴之用;
[*]本次安装基于 CentOS 6.4x86_64系统环境。
二、Ansible基础安装与配置
下载以下软件包准备编译安装
1、Ansible基础安装
控制服务器(Master)需要安装Python2.6/7,windows上无法使用ansible。被管理的服务器(Managed Node)需要安装Python2.4以上的版本,如果低于2.5,需要安装python-simplejson。
(1)python2.7安装
https://www.python.org/ftp/python/2.7.8/Python-2.7.8.tgz
将python头文件拷贝到标准目录,以避免编译ansible时,找不到所需的头文件
修改yum脚本,使其指向旧版本的python,已避免其无法运行
# vim /usr/bin/yum
!/usr/bin/python-->#!/usr/bin/python2.6
(2)setuptools模块安装
https://pypi.python.org/packages/source/s/setuptools/setuptools-7.0.tar.gz
# tar xf setuptools-7.0.tar.gz -C /usr/src/
# cd /usr/src/setuptools-7.0/
# python setup.py install
(3)pycrypto模块安装
https://pypi.python.org/packages/source/p/pycrypto/pycrypto-2.6.1.tar.gz
# tar xf pycrypto-2.6.1.tar.gz -C /usr/src/
# cd /usr/src/pycrypto-2.6.1/
# python setup.py install
(4)PyYAML模块安装
http://pyyaml.org/download/libyaml/yaml-0.1.5.tar.gz
# tar xf yaml-0.1.5.tar.gz -C /usr/src/
# cd /usr/src/yaml-0.1.5/
# ./configure --prefix=/usr/local
# make
# make install
https://pypi.python.org/packages/source/P/PyYAML/PyYAML-3.11.tar.gz
# tar xf PyYAML-3.11.tar.gz -C /usr/src
# cd /usr/src/PyYAML-3.11/
# vim README
# python setup.py --with-libyaml install
(5)Jinja2模块安装
https://pypi.python.org/packages/source/M/MarkupSafe/MarkupSafe-0.9.3.tar.gz
https://pypi.python.org/packages/source/J/Jinja2/Jinja2-2.7.3.tar.gz
# tar xf MarkupSafe-0.9.3.tar.gz -C /usr/src
# cd /usr/src/MarkupSafe-0.9.3/
# vim README.rst
# python setup.py install
# tar xf Jinja2-2.7.3.tar.gz -C /usr/src
# cd /usr/src/Jinja2-2.7.3/
# vim README.rst
# python setup.py install
(6)paramiko模块安装
https://pypi.python.org/packages/source/e/ecdsa/ecdsa-0.11.tar.gz
https://pypi.python.org/packages/source/p/paramiko/paramiko-1.15.1.tar.gz
# tar xf ecdsa-0.11.tar.gz -C /usr/src
# cd /usr/src/ecdsa-0.11/
# vim README.md
# python setup.py install
# tar xf paramiko-1.15.1.tar.gz -C /usr/src/
# cd /usr/src/paramiko-1.15.1/
# vim README
# python setup.pyinstall
(7)simplejson模块安装
https://pypi.python.org/packages/source/s/simplejson/simplejson-3.6.5.tar.gz
# tar xf simplejson-3.6.5.tar.gz -C /usr/src
# cd /usr/src/simplejson-3.6.5/
# vim README.rst
# python setup.py install
(8)ansible安装
https://github.com/ansible/ansible/archive/v1.7.2.tar.gz
# tar xf ansible-1.7.2.tar.gz -C /usr/src
# cd /usr/src/ansible-1.7.2/
# vim README.md
# python setup.py install
ad-hoc是ansible里的一个概念, 在命令中就是 -a,ad hoc——临时的,在ansible中是指需要快速执行,并且不需要保存的命令。说白了就是执行简单的命令——一条命令。对于复杂的命令需要使用ansible-playbook
在ansible中还有一个Module(模块)的概念,这个模块可以理解为一个库,所有的命令都需要通过模块来执行,可以通过各种模块来批量完成某个包的安装,或者其他需要的操作。
2、Ansible配置
(1)设置管理机ssh免密码登录集群节点机
集群节点机上执行如下命令,随后连敲两次空格键默认在/root/.ssh目录下生成密钥文件id_rsa和公钥文件id_rsa.pub,确保/root/.ssh/authorized_keys的权限为600
# ssh-keygen -t rsa
# ssh-keygen -t rsa
# ssh-keygen -t rsa
在管理机上将自己的公钥拷贝到集群节点机上
# ssh-copy-id -i .ssh/id_rsa.pub root@10.33.100.77
# ssh-copy-id -i .ssh/id_rsa.pub root@10.33.100.88
# ssh-copy-id -i .ssh/id_rsa.pub root@10.33.100.99
(2)复制模板配置文件到/etc/ansible/下,并指定集群节点机的认证文件
(3)主机组定义:所有的远程主机需要在hosts中配置,可以分组;当然hosts也可以执行时指定
(4)简单测试
ansible命令最常用的用法:
# ansible --help
Usage: ansible <host-pattern>
Options:
-a MODULE_ARGS, --args=MODULE_ARGS
-m MODULE_NAME, --module-name=MODULE_NAME
说明:第一次运行时,需要输入一下“yes”【进行公钥验证】,后续无需再次输入
ansible所支持的模块可以使用如下命令来查看
3、常用模块
(1)setup
(2)ping
(3)file
option:
[*]group:定义文件/目录的属组
[*]mode:定义文件/目录的权限
[*]owner:定义文件/目录的属主
[*]path:必选项,定义文件/目录的路径
[*]recurse:递归设置文件的属性,只对目录有效
[*]src:被链接的源文件路径,只应用于state=link的情况
[*]dest:被链接到的路径,只应用于state=link的情况
[*]force:强制创建软链接有两种情况,一种是源文件不存在,但之后会建立的情况;另一种是要取消已创建的软链接,创建新的软链,有两个选项:【yes|no】
[*]state:
link:创建软链接
hard:创建硬链接
directory:如果目录不存在,就创建目录
file:即使文件不存在,也不会被创建
absent:删除目录、文件或者取消链接文件
touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
示例: 远程文件符号链接创建
查看上一步创建的链接文件
远程文件符号链接删除
链接文件成功删除
(4)mount
option:
[*]dump
[*]passno
[*]opts:传递给mount命令的参数
[*]fstype:必选项,挂载文件的类型
[*]name:必选项,挂载点
[*]src:必选项,要挂载的文件
[*]state:必选项
present:只处理fstab中的配置
absent:删除挂载点
mounted:自动创建挂载点并挂载之
umounted:卸载
示例:挂载光盘到/mnt/cdrom
(5)yum
option:
[*]list
[*]config_file:yum的配置文件
[*]disable_gpg_check:关闭gpg_check
[*]disablerepo:不启用某个源
[*]enablerepo:启用某个源
[*]name:要进行操作的软件包的名字,也可以传递一个url或者一个本地的rpm包的路径
[*]state:【present|absent|latest】
示例:
(6)copy
option:
[*]content:用于替代“src”,可以直接设定指定文件的值
[*]directory_mode:递归设定目录的权限,默认为系统默认权限
[*]others:所有的file模块里的选项都可以在这里使用
[*]backup:在覆盖之前,将源文件备份,备份文件包含时间信息。有两个选项:【yes|no】
[*]dest:必选项,要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录
[*]force:如果目标主机包含该文件,但内容不同,设置为yes,则强制覆盖,设置为no,则只有当目标主机的目标位置不存在该文件时,才复制;默认为yes
[*]src:被复制到远程主机的本地文件,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用“/”来结尾,则只复制目录里的内容,如果没有使用“/”来结尾,则包含目录在内的整个内容全部复制,类似于rsync。
示例:将本地文件“/tmp/test.sh”复制到远程服务器,将创建的脚本文件分发到远程
(7)command
option:
[*]free_form:要执行的linux指令
[*]chdir:在执行指令之前,先切换到该目录
[*]creates:一个文件名,当该文件存在,则该命令不执行
[*]removes:一个文件名,当该文件不存在,则该选项不执行
[*]executable:切换shell来执行指令,该执行路径必须是一个绝对路径
(8)shell
切换到某个shell执行指定的指令,参数与command相同
示例:远程执行上面copy到node上的脚本
示例:远程执行命令
与command不同的是,shell模块可以支持命令管道,同时另一个模块raw也具备此功能
(9)filesystem
option:
[*]dev:目标块设备
[*]force:在一个已有文件系统的设备上强制创建
[*]fstype:文件系统的类型
[*]opts:传递给mkfs命令的选项
(10)service
option:
[*]arguments:给命令行提供一些选项
[*]enabled:是否开机启动 【yes|no】
[*]name:必选项,服务名称
[*]runlevel:运行级别
[*]sleep:如果执行了restarted,在则stop和start之间沉睡几秒钟
[*]state:对当前服务执行【started|stopped|restarted|reloaded】等操作
[*]pattern:定义一个模式,如果通过status指令来查看服务的状态时,没有响应,就会通过ps指令在进程中根据该模式进行查找,如果匹配到,则认为该服务依然在运行
(11)cron
option:
[*]backup:对远程主机上的原任务计划内容修改之前做备份【yes|no】
[*]cron_file:如果指定该选项,则用该文件替换远程主机上的cron.d目录下的用户的任务计划
[*]day:(1-31,,/2,……)
[*]hour:(0-23,,/2,……)
[*]minute:(0-59,,/2,……)
[*]month:(1-12,,/2,……)
[*]weekday:(0-7,*,……)
[*]job:要执行的任务,依赖于state=present
[*]name:任务描述 Description of a crontab entry
[*]state:【present|absent】
[*]user:以哪个用户的身份执行
[*]special_time:指定执行时间参数:
【reboot|yearly|annually|monthly|weekly|daily|hourly 】
(11)group
(12)user
http://docs.ansible.com/ansible/user_module.html
其他常用模块,就不一一例举,可以结合自身的系统环境进行测试。
更多模块参考:
http://www.ansible.cn/docs/
http://docs.ansible.com/ansible/modules.html
http://docs.ansible.com/ansible/modules_by_category.html
页:
[1]