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,已避免其无法运行
[root@DQ ~]# 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
[root@DQ ansible]# tar xf setuptools-7.0.tar.gz -C /usr/src/
[root@DQ ansible]# cd /usr/src/setuptools-7.0/
[root@DQ setuptools-7.0]# python setup.py install
(3)pycrypto模块安装
https://pypi.python.org/packages/source/p/pycrypto/pycrypto-2.6.1.tar.gz
[root@DQ ansible]# tar xf pycrypto-2.6.1.tar.gz -C /usr/src/
[root@DQ ansible]# cd /usr/src/pycrypto-2.6.1/
[root@DQ pycrypto-2.6.1]# python setup.py install
(4)PyYAML模块安装
http://pyyaml.org/download/libyaml/yaml-0.1.5.tar.gz
[root@DQ ansible]# tar xf yaml-0.1.5.tar.gz -C /usr/src/
[root@DQ ansible]# cd /usr/src/yaml-0.1.5/
[root@DQ yaml-0.1.5]# ./configure --prefix=/usr/local
[root@DQ yaml-0.1.5]# make
[root@DQ yaml-0.1.5]# make install
https://pypi.python.org/packages/source/P/PyYAML/PyYAML-3.11.tar.gz
[root@DQ ansible]# tar xf PyYAML-3.11.tar.gz -C /usr/src
[root@DQ ansible]# cd /usr/src/PyYAML-3.11/
[root@DQ PyYAML-3.11]# vim README
[root@DQ PyYAML-3.11]# 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
[root@DQ ansible]# tar xf MarkupSafe-0.9.3.tar.gz -C /usr/src
[root@DQ ansible]# cd /usr/src/MarkupSafe-0.9.3/
[root@DQ MarkupSafe-0.9.3]# vim README.rst
[root@DQ MarkupSafe-0.9.3]# python setup.py install
[root@DQ ansible]# tar xf Jinja2-2.7.3.tar.gz -C /usr/src
[root@DQ ansible]# cd /usr/src/Jinja2-2.7.3/
[root@DQ Jinja2-2.7.3]# vim README.rst
[root@DQ Jinja2-2.7.3]# 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
[root@DQ ansible]# tar xf ecdsa-0.11.tar.gz -C /usr/src
[root@DQ ansible]# cd /usr/src/ecdsa-0.11/
[root@DQ ecdsa-0.11]# vim README.md
[root@DQ ecdsa-0.11]# python setup.py install
[root@DQ ansible]# tar xf paramiko-1.15.1.tar.gz -C /usr/src/
[root@DQ ansible]# cd /usr/src/paramiko-1.15.1/
[root@DQ paramiko-1.15.1]# vim README
[root@DQ paramiko-1.15.1]# python setup.py install
(7)simplejson模块安装
https://pypi.python.org/packages/source/s/simplejson/simplejson-3.6.5.tar.gz
[root@DQ ansible]# tar xf simplejson-3.6.5.tar.gz -C /usr/src
[root@DQ ansible]# cd /usr/src/simplejson-3.6.5/
[root@DQ simplejson-3.6.5]# vim README.rst
[root@DQ simplejson-3.6.5]# python setup.py install
(8)ansible安装
https://github.com/ansible/ansible/archive/v1.7.2.tar.gz
[root@DQ ansible]# tar xf ansible-1.7.2.tar.gz -C /usr/src
[root@DQ ansible]# cd /usr/src/ansible-1.7.2/
[root@DQ ansible-1.7.2]# vim README.md
[root@DQ ansible-1.7.2]# 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
[root@Node1 ~]# ssh-keygen -t rsa
[root@Node2 ~]# ssh-keygen -t rsa
[root@Node3 ~]# ssh-keygen -t rsa
在管理机上将自己的公钥拷贝到集群节点机上
[root@DQ ~]# ssh-copy-id -i .ssh/id_rsa.pub root@10.33.100.77
[root@DQ ~]# ssh-copy-id -i .ssh/id_rsa.pub root@10.33.100.88
[root@DQ ~]# ssh-copy-id -i .ssh/id_rsa.pub root@10.33.100.99
(2)复制模板配置文件到/etc/ansible/下,并指定集群节点机的认证文件
(3)主机组定义:所有的远程主机需要在hosts中配置,可以分组;当然hosts也可以执行时指定
(4)简单测试
ansible命令最常用的用法:
[root@DQ ~]# ansible --help
Usage: ansible <host-pattern> [options]
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
Ansible是一个基于Python的自动化工具,主打无代理、幂等性的批量系统配置和应用部署。它的工作模式、主要特性包括无须在目标主机安装agent、基于SSH、使用模块化设计等。文章介绍了Ansible的安装、配置过程,以及如setup、ping、file、mount、yum、copy、command、shell等常用模块的使用方法,适用于自动化运维和部署场景。

2309

被折叠的 条评论
为什么被折叠?



