Ansible是自动化运维的工具,基于Python开发,实现了批量系统配置、批量程序部署、批量运行命令等功能。
Ansible是基于模块工作的,ansible提供一个框架,通过模块实现批量部署。
ansible架构图
右边绿色部分是被管理的主机(虚拟机,物理机,云主机等)从以上架构图中可以看出
ansible是由主机清单(配置),playbook(配置),以及各模块插件组成;
简单的说就是,用户(管理员)通过ansible的主机清单配置或Playbook配置(一组任务),调用ansible的各种模块及参数来对
清单中的主机进行统一管理;
①pm包安装: EPEL源
yum install ansible
②编译安装:
yum -y install python-jinja2 PyYAML python-paramiko python-babel python-crypto
tar xf ansible-1.5.4.tar.gz
cd ansible-1.5.4
python setup.py build
python setup.py install
mkdir /etc/ansible
cp -r examples/* /etc/ansible
③Git方式:
git clone git://github.com/ansible/ansible.git --recursive
cd ./ansible
source ./hacking/env-setup
④pip安装(pip是安装Python包的管理器,类似yum)
yum install python-pip python-devel
yum install gcc glibc-devel zibl-devel rpm-bulid openssl-devel
pip install --upgrade pip
pip install ansible --upgrade
确认安装: ansible --version
/etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性
/etc/ansible/hosts 主机清单
/etc/ansible/roles/ 存放角色的目录
**ansible主配置文件:/etc/ansible/ansible.cfg (一般保持默认) **
[defaults]
#inventory = /etc/ansible/hosts # 主机列表配置文件
#library = /usr/share/my_modules/ # 库文件存放目录
#remote_tmp = $HOME/.ansible/tmp # 临时py命令文件存放在远程主机目录
#local_tmp = $HOME/.ansible/tmp # 本机的临时命令执行目录
#forks = 5 # 并发进程并行执行5条命令(提高工作效率)
#sudo_user = root # 可使用sudu命令切换身份执行命令
#ask_sudo_pass = True # 每次执行ansible命令是否询问ssh密码
#ask_pass = True #
#remote_port = 22 #默认连接管理主机端口号22
#host_key_checking = False # 检查对应服务器的host_key,建议开启
#log_path=/var/log/ansible.log # 日志文件(默认不打开,建议开启便于管理)
ansible主机清单文件:/etc/ansible/hosts
管理IP地址存放位置(可分组)
如果主机名称遵循相似的命名模式,还可以使用列表的方式标识各主机
列表名称
ansible ansible-doc ansible-playbook ansible-vault
ansible-console ansible-galaxy ansible-pull
ansible-doc命令: 显示模块帮助
语法: ansible-doc [选项] [模块...]
选项: -a 显示所有模块的文档
-l, --list 列出可用模块
-s, --snippet显示指定模块的playbook片段
ansible命令:
ansible通过ssh服务实现配置管理、应用部署、任务执行等功能,建议配置ansible端能基于密钥认证的方式联系各被管理节点(主机)
语法:ansible [-m 模块名称] [-a 命令参数]
选项:--version 显示版本
-m module 指定模块,默认为command
-v 详细过程 –vv -vvv更详细
--list-hosts 显示主机列表,可简写—list
-k, --ask-pass 提示输入ssh连接密码,默认Key验证
-K, --ask-become-pass 提示输入sudo时的口令
-C, --check 检查,并不执行
-T, --timeout=TIMEOUT 执行命令的超时时间,默认10s
-u, --user=REMOTE_USER 执行远程执行的用户
-b, --become 代替旧版的sudo 切换
ansible命令中的Host-pattern匹配主机的列表
All: 表示所有Inventory中的所有主机
* : 通配符
示例1: ansible 192.168.1.* -m ping 示例2: ansible “*srvs” -m ping
: 逻辑或
示例1: ansible “websrvs:appsrvs” -m ping
& 逻辑与
示例1: ansible “websrvs:&dbsrvs” –m ping(在websrvs组并且在dbsrvs组中的主机)
! 逻辑非
示例1: ansible ‘websrvs:!dbsrvs’ –m ping (在websrvs组,但不在dbsrvs组中的主机)
注意:此处为单引号
正则表达式
示例1: ansible “websrvs:&dbsrvs” –m ping
示例2: ansible “~(web|db).*\.magedu\.com” –m ping
ansible命令执行过程
执行状态颜色:
绿色:执行成功并且不需要做改变的操作
yellow:执行成功并且对目标主机做变更
红色:执行失败
ansible-galaxy命令:(连接ansible网站下载相应的角色)
连接 https://galaxy.ansible.com/explore#/ 下载相应的roles
列出所有已安装的galaxy
示例:ansible-galaxy list
安装galaxy
示例:ansible-galaxy install geerlingguy.redis
删除galaxy
示例:ansible-galaxy remove geerlingguy.redis
ansible-pull命令
推送命令至远程,效率无限提升,对运维要求较高
ansible-vault命令:(对playbook文件进行加密)
功能: 管理加密解密yml文件
语法: ansible-vault [create|decrypt|edit|encrypt|rekey|view]
选项示例: ansible-vault encrypt hello.yml 加密
ansible-vault decrypt hello.yml 解密
ansible-vault view hello.yml 查看
ansible-vault edit hello.yml 编辑加密文件
ansible-vault rekey hello.yml 修改口令
ansible-vault create new.yml 创建新文件
ansible-console命令:(交互式控制台,支持tab)
执行用户@当前操作的主机组 (当前组的主机数量)[f:并发数]$
设置并发数: forks n 例: forks 10
切换组: cd [主机组] 例: cd web
列出当前组主机列表: list
列出所有的内置命令: ?或help
ansible-playbook命令:(运行yml脚本文件)
后续会详细解答
此处只列举常用选项,如需更多骚操作,查看帮助: ansible-doc -s [模块名称]
setup模块: 查看远程主机的一些基本信息
ansible -i /etc/ansible/hosts test -m setup
ping模块: 测试远程主机的运行状态
hostname模块:管理主机名
name:修改的主机名
ansible node1 -m hostname -a “name=websrv”
command模块:在远程主机执行命令,默认模块,可忽略-m选项
free_form: #要执行的linux命令
chdir: #运行前切换目录
此模块不支持 $VARNAME < > | ; & 等,用shell模块实现
shell模块:和command相似,用shell执行命令
free_form: #要执行的linux命令
调用shell模块时:如果命令过于复杂,建议写在脚本里复制到远程,执行,再把需要的结果返回.否则可能会执行失败
script模块:在管理的主机上 运行脚本
选项和command相似
free_form: #要执行的linux命令
file模块:设置文件属性 (创建文件)
path:必选项,定义文件/目录的路径
state: #状态选项
directory:#如果目录不存在,创建目录
file:#即使文件不存在,也不会被创建
link:#创建软链接
hard:#创建硬链接
touch:#如果文件不存在,(创建新的文件),如果文件或目录已存在,(更新其最后修改时间)
absent:#删除目录、文件或者取消链接文件
group:#定义文件/目录的属组
mode:#定义文件/目录的权限
owner:#定义文件/目录的属主
copy模块:复制文件到远程主机
dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录
src:#要复制到远程主机的文件在本地的地址
content:用于替代"src",可以直接设定指定文件的值
backup:#在覆盖之前将原文件备份,备份文件包含时间信息。有两个选项:yes|no
force:#强制覆盖(默认为yes),有两个选项:yes|no
directory_mode:#递归的设定目录的权限,默认为系统默认权限
fetch模块:从远程主机拉取文件到本地,于copy相反,只能抓取文件,不能抓取目录
选项和copy相似
ansible websrvs -m fetch -a "src=/var/log/messages dest=/data/test"
cron模块:管理计划任务
job: #要执行的任务
backup:#对远程主机上的原任务计划内容修改之前做备份
state:#该计划任务是创建还是删除 present|absent
disabled: #禁用或启用计划任务 true|false
name:该任务的名称及描述
user:#以哪个用户的身份执行
cron_file:#如果指定该选项,则用该文件替换远程主机上的cron.d目录下的用户的任务计划
special_time:#指定什么时候执行,参数:reboot,yearly,annually,monthly,weekly,daily,hourly
支持指定时间格式:minute(分钟),hour(小时),day(日),month(月),weekday(周)
yum模块:安装软件
name:#软件包名称
state:#状态选项(present,absent,latest)
list:#查看包详细信息
config_file:#yum的配置文件
updete_cache=yes #清理缓存
service模块:管理服务
name:必选项,服务名称
state:#对当前服务执行启动,停止、重启、重新加载等操作
(started,stopped,restarted,reloaded)
enabled:#是否开机启动 yes|no
ansible websrvs -m service -a "name=httpd state=started enabled=no"
user模块与group模块:管理用户,管理组
name:必选项,用户名称
password:设置密码(需要特别说明的是,password后面指定的密码不能是明文)
home:#用户家目录
groups: #指定组
uid: #指定id号
createhome:
system: #是否是系统账号 yes|no
remove:#是否删除家目录 yes|no
state: #是否删除账号present|absent
shell: #shell类型
playbook是一个非常简单的配置管理和多主机部署系统。可作为一个适合部署复杂应用程序的基础。
playbook可以定制配置,可以按指定的操作步骤有序执行,支持同步和异步方式。
playbook是通过YAML格式来进行描述定义的,可实现多台主机应用的部署,对不同分组的主机执行特定指令步骤。
Ansible-playbook(剧本)执行过程:
将已有编排好的任务集写入Ansible-Playbook
通过ansible-playbook命令分拆任务集至逐条ansible命令,按预定规则逐条执行
Playbook工作流程图
YAML简介(是一种标记语言)
YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。
特性: YAML的可读性好
YAML和脚本语言的交互性好
YAML使用实现语言的数据类型
YAML有一个一致的信息模型
YAML易于实现
YAML可以基于流来处理
YAML表达能力强,扩展性好
更多YAML内容及规范参见http://yaml.org/
hosts 执行的远程主机列表
tasks 任务列表(任务集)
varniables 内置变量或自定义变量在playbook中调用
templates 模板,可替换模板文件中的变量并实现一些简单逻辑的文件
handlers 和notity结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
tags 标签 指定某条任务执行,用于选择运行playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断
playbook基础组件
Hosts: playbook中的每一个play的目的都是为了让某个或某些主机以某个指定的用户身份执行任务。hosts用于指定要执行指定任务的主机,须事先定义在主机清单中
remote_user: 可用于Host和task中。也可以通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务;此外,甚至可以在sudo时使用sudo_user指定sudo时切换的用户
tasks:play的主体部分是task list。task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个。在运行自下而下某playbook时,如果中途发生错误,所有已执行任务都将回滚,因此,在更正playbook后重新执行一次即可
①task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致
②每个task都应该有其name,用于playbook的执行结果输出,建议其内容尽可能清晰地描述任务执行步骤。如果未提供name,则action的结果将用于输出
tasks应用:任务列表和action
语法格式: (1) action: module arguments
(2) module: arguments 建议使用
shell和command模块后面跟命令,而非key=value
如果命令或脚本的退出状态码不为0,可使用如下方法
任务执行失败会影响后续操作执行,即使当前任务执行失败后续任务继续执行
|| /bin/true #管道返回值为真
或者使用ignore_errors来忽略错误信息:
ignore_errors: True #不论命令执行结果,继续执行后续命令
handlers(触发器)和notify结合使用触发条件
Handlers:是一些task的列表,通过名字来引用,它们和一般的task并没有什么区别。handlers是由通知者进行notify,如果没有被notify,handlers不会执行不管多少个通知者进行了notify,等到play中的所有task执行完成之后handlers也不会被执行一次
Notify:此action可用于在每个task结束时被触发,这样可避免多次有改变发生时每次都执行指定的操作,仅在所有的变化发生完成后一次性地执行指定操作。在notify中列出的操作称为handler,也即notify中调用handler中定义的操作
对应关系:notify中调用handler中定义的操作
notify调用handlers定义的触发条件
语法:ansible-playbook ... [options]
选项: --check 只检测可能会发生的改变,但不真正执行操作
--list-hosts 列出运行任务的主机
--limit 主机列表 只针对主机列表中的主机执行
-v 显示过程 -vv -vvv 更详细
小结
通过ansib-doc来获取模块信息及指定模块帮助信息;
ansible通过常用模块在命令行就可以针对主机清单来管理配置远程主机,无需要代理客 户端程序,但需要目标主机有ssh和python2.4+;
基于ssh协议既可以通过用户名和密码,也可以通过私钥,推荐使用私钥;
ansible-playbook 基于YAML语法配置;可以对playbook文件进行测试,解析并执行应用于指定无端主机;非常方便我们统一编排分发管理远程主机;
①一个模块定义一个name,相同的模块,多个操作也必须定义多个name
②某任务的状态在运行后为changed时,可通过“notify”通知给相应的handlers
③任务可以通过"tags“打标签,而后可在ansible-playbook命令上使用-t指定进行调用
转载于:https://blog.51cto.com/13769014/2121794