ansible详解

博客详情:

[Ansible配置及常用模块总结](https://www.cnblogs.com/kevingrace/p/7553179.html)
[ansible总结简书]


ansible 是一个基于python 开发的自动化运维工具, 其功能实现基于ssh远程连接服务, ansible 可以实现批量系统配置,批量软件部署,批量文件拷贝,批量运行命令等功能

ansible的特点

1)ansible不需要单独安装客户端,SSH相当于ansible客户端。
2)ansible不需要启动任何服务,仅需安装对应工具即可。
3)ansible依赖大量的python模块来实现批量管理。
4)ansible配置文件/etc/ansible/ansible.cfg。

ansible的任务模式

ad-hoc模式(点对点模块)
使用单个模块,支持批量执行单条命令,相当与在bash中执行一句shell命令

playbook模式(剧本模式)
ansible主要的管理方式,通过多个task的集合完成一类功能,可以理解为多个ad-hoc的配置文件

ansible的执行流程

1)读取ansible的配置文件

2)通过规则过滤inventory中定义的主机列表

3)加载task对应的模块文件

4)通过ansible core将模块或命令打包成Python脚本文件

5)将临时脚本文件传输至远程服务器

6)对应执行用户的家目录的’.ansible/tmp/xxx/xxx.py’文件

ansible的同步模式与异步模式

Ansible默认是同步阻塞模式,它会等待所有的机器都执行完毕才会在前台返回

同步模式

如果节点数太多,ansible无法一次在所有远程节点上执行任务,那么将先在一部分节点上执行一个任务(每一批节点的数量取决于fork进程数量,默认为5个,可设置),直到这一批所有节点上该任务完全执行完毕才会接入下一个批节点,直到所有节点将该任务都执行完毕,然后重新回到第一批节点开始执行第二个任务。依次类推,直到所有节点执行完所有任务,ansible端才会释放shell。这是默认同步模式,也就是说在未执行完毕时,ansible是占用当前shell的,任务执行完后,释放shell了才可以输入其他命令做其他动作

异步模式

假如fork控制的并发进程数为5,远程控制节点为24个,则ansible一开始会将5个节点的任务扔在后台,并每隔一段时间去检查这些节点的任务完成情况,当某节点完成不会立即返回,而是继续等待直到5个进程都空闲了,才会将这5个节点的结果返回给ansible端,ansible会继续将下一批5个节点的任务扔在后台并每隔一段时间进行检查,依次类推,直到完成所有任务

在异步模式下,如果设置的检查时间间隔为0,在将每一批节点的任务丢到后台后都会立即返回ansible,并立即将下一批节点的任务丢到后台,直到所有任务都丢到后台完后,才返回ansible端,ansible才会立即释放占用的shell

ansible的特性
  • 模块化:通过调用相关模块,完成指定任务,且支持任何语言编写的自定义模块;

  • playbook:剧本,可根据需要一次执行完剧本中的所有任务或某些任务;

ansible的架构

最重要的一点: ansible是模块化的, 它所有的操作都依赖于模块, 不需要单独安装客户端(no agents),基于系统自带的sshd服务,sshd就相当于ansible的客户端, 不需要服务端(no sever),需要依靠大量的模块实现批量管理, 配置文件 /etc/ansible/ansible.cfg (前期不用配置)

ansible的语法格式
语法格式:
ansible <pattern_goes_here> -m <module_name> -a <arguments>
也就是:
ansible  匹配模式  -m  模块  -a  '需要执行的内容'
 
匹配模式:即哪些机器生效 (可以是某一台, 或某一组, 或all) , 默认模块为command , 执行常规的shell命令.
 
-m name, --module-name=name:  指定执行使用的模块。
-u username, --user=username:  指定远程主机以username运行命令。
-s, --sudo:  相当于linux系统下的sudo命令。
-u sudo_username, --sudo-user=sudo_username:  使用sudo, 相当于linux系统下的sudo命令。
-C, --check:  只检查不实际执行。
-e, 即extra_vars:  引用外部参数。
-i, 即inventory:  指定仓库列表, 默认/etc/ansible/hosts。
--list-host:  列出执行主机列。
ansible 常用命令参数
--version               #显示版本
-m module               #指定使用的模块,默认为command
-v                      #查看执行的详细过程(-vv、-vvvv更详细)
--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切换
-h,--help               #显示使用帮助
-u                      #指定远程主机运行此命令的用户
-s                      #相当于sudo
-S                      #使用sudo

======================================================
[普通选项]
-a MODULE_ARGS
--args=MODULE_ARGS
传递参数给模块
 
--ask-vault-pass
询问vault的密码
 
-B SECONDS
--background=SECONDS
异步后台⽅式执⾏任务,并在指定的秒数后超时,超时会杀掉任务的进程。默认是同步,即保持长连接,它会等待
所有执⾏完毕(即阻塞模式)。但有时候是没必要这样的,⽐如某些命令的执⾏时间⽐ssh的超时时间还长。如果
不指定超时秒数,将以同步⽅式运⾏任务
 
-P POLL_INTERVAL
--poll=POLL_INTERVAL
异步模式下轮询任务的时间间隔,默认60秒
 
-C
--check
不对远程主机做一些改变,而是预测某些可能发生的改变(检查功能)
 
-e EXTRA_VARS
--extra-vars=EXTRA_VARS
配置额外的配置变量(key=value或者YAML/JSON格式)
 
-f FORKS
--forks=FORKS
指定并行处理的进程数量,默认5个
 
-h
--help
显示帮助信息
 
-i INVENTORY
--inventory-file=INVENTORY
指定inventory⽂件,多个⽂件使⽤逗号分隔。默认为/etc/ansible/hosts
 
-l SUBSET
--limit=SECONDS
使⽤额外的匹配模式来筛选⽬标主机列表。
此处的匹配模式是在已有匹配模式下进⾏的,所以是更严格的筛选。例如指定了主机组的情况下,使⽤-l选项从中只选⼀台主机进⾏控制
 
--list-hosts
不会执行任何操作,而是列出匹配到的主机列表
 
-m MODULE_NAME
--module-name=MODULE_NAME
指定要执行的模块名,默认的模块为"command"
 
--new-vault-password-file=NEW_VAULT_PASSWORD_FILE
new vault password f ile f or rekey
 
-o
--one-line
简化输出(一行输出模式)
 
--output-OUTPUT_FILE
output f ile name f or encrypt or decrypt; use - f or stdout
 
--syntax-check
检查playbook的语法,不会执行
 
-t TREE
--tree=TREE
记录输出到此⽬录中(测试时以每个host名如IP地址为⽂件名记录,结果记录到对应的⽂件中)。
此选项在ansible巨慢的时候(如瞬间应该返回的命令还需要10多秒才完成)有奇⽤,或者将ansible的结果重
定向到某个⽂件中也能解决,为什么如此,我也不明⽩(表⾯看来和输出⽅式有关系),多次亲测有效。
 
--vault-password-file=VAULT_PASSWORD_FILE
指定vault密码文件
 
-v
--verbose
输出详细信息,-vvv和-vvvv输出更详细的信息
 
--version
显示ansbile的版本
 
======================================================
[以下是连接选项,⽤于控制谁以及如何连接主机]
-k
--ask-pass
询问连接时的密码
 
--private-key=KEY_FILE
--key-file=KEY_FILE
使用文件来认证SSH连接的过程
 
-u REMOTE_USER
--user=REMOTE_USER
使用指定的用户名进行连接
 
-c CINNECTION
--connection=CINNECTION
连接类型,默认为ssh。paramiko (SSH), ssh, winrm and local. local is mostly usef ul f or crontab or kickstarts.
 
-T TIMEOUT
--time=TIMEOUT
连接的超时时间,单位为秒,默认10秒
 
--ssh-common-args=SSH_COMMON_ARGS
指定传递给sftp/scp/ssh等⼯具的通⽤额外参数
 
--sftp-extra-args=SFTP_EXTRA_ARGS
指定只传递给sftp的额外参数,如-f
 
--scp-extra-args=SCP_EXTRA_ARGS
指定只传递给scp的额外参数,如-l
 
--ssh-extra-args=SSH_EXTRA_ARGS
指定只传递给ssh的额外参数,如-R
 
======================================================
[以下是权限控制选项:控制在⽬标主机上以什么⾝份和权限运⾏任务]
-s
--sudo
为运行ansible命令的用户提升权限为sudo_user的权限,此命令已经报废,使用become代替
 
-u SUDO_USER
--sudo-user=SUDO_USER
期望的sudo_user,默认为root,已报废,使用become代替
 
-S
--su
使⽤su的⽅式执⾏操作,已废弃,使⽤become替代
 
-R SU_USER
--su-user=SU_USER
使⽤此user的su执⾏操作,默认为root,已废弃,使⽤become替代
 
-b
--become
使用become的方式升级权限
 
--become-method=BECOME_METHOD
指定提升权限的方式,可选以下⼏种:sudo/su/pbrun/pf exec/doas/dzdo/ksu/runas值
 
--become-user=BECOME_USER
要提升为哪个user的权限,默认为root
 
--ask-sudo-pass
询问sudo密码,已废弃,使⽤become替代
 
--ask-su-pass
询问su的密码,已废弃,使⽤become替代
 
-K
--ask-become-pass
询问become提升权限时的密码
ansible-doc

ansible-doc是查看ansible模块(插件)文档说明,针对每个模块都有详细的用法说明,功能和Linux的man命令类似

语法:ansible-doc [-l|-F|-s] [options] [-t <plugin type> ] [plugin]
参数:
-a, --all                                   #显示文档所有的模块(这个选项有个bug)
-h, --help                                  #显示使用帮助
-j, --json                                  #将所有的模块转储为JSON格式
-l, --list                                  #查看模块列表
-F, --list_files                            #显示模块的名称和模块原路径
-M MODULE_PATH, --module-path=MODULE_PATH   #
-s, --snippet                               #简介的显示模块的帮助信息
-t TYPE, --type=TYPE                        #指定模块类型(默认为module)
-v, --verbose                               #查看执行的详细过程(-vv、-vvvv更详细)
--version                                   #查看版本
ansible-playbook

ansible-playbook是日常用的最多的命令,其工作机制是:通过读取预先编写好的playbook文件实现批量管理,要实现的功能与命令ansbile一样,可以理解为按一定的条件组成ansible的任务集ansible-playbook命令后跟YML格式的playbook文件,执行事先编排好的任务集

语法: ansible-playbook [options] playbook.yml [playbook2 ...]
参数:大部分的参数和ansible的参数一致
可以使用:ansible-playbook --help可以查看到命令参数
 
例如: 使用ansible-playbook执行一个yaml文件
[root@ansible ~]# ansible-playbook -C /opt/ansible-playbook/test.yaml
ansible-console (ansible自己的终端)
ansible-inventory
查看被控制端主机清单的详细信息默认情况下它使用库存脚本,返回JSON格式:
# ansible-inventory --list
ansible-vault

ansible-vault主要用于配置文件的加密,如编写的playbook配置文件中包含敏感的信息,不希望其他人随便的看,ansible-vault可加密/解密这个配置文件:

配置文件详解
host_key_checking
host_key_checking=False 禁用验证host_key_checking
 
inventory
定义库文件位置,脚本,或者存放可通信主机的目录
inventory = /etc/ansible/hosts
 
library
ansible默认搜寻模块的位置
library = /usr/share/ansible
Ansible知道如何搜寻多个用冒号隔开的路径,同时也会搜索在playbook中的"./library"。
 
log_path
日志存放位置
默认不开启,ansible将会吧模块加载纪录在系统日志系统中.不包含用密码.
log_path=/var/log/ansible.log
 
module_name
这个是/usr/bin/ansible的默认模块名(-m). 默认是'command'模块。command模块不支持shell变量,管道,配额。所以最好把这个参数改为'shell'。
module_name = command
 
nocolor
默认ansible会为输出结果加上颜色,用来更好的区分状态信息和失败信息。如果你想关闭这一功能,可以把'nocolor'设置为'1'。
nocolor=0
 
nocows
默认ansible可以调用一些cowsay的特性,使得/usr/bin/ansible-playbook运行起来更加愉快。
如果不喜欢cows,可以通通过将'nocows'设置为'1'来禁用这一选项:
nocows=0
 
poll_interval
对于Ansible中的异步任务,这个是设置定义,当具体的poll interval 没有定义时,多少时间回查一下这些任务的状态, 默认值是一个折中选择15秒钟.这个时间是个回查频率和任务完成叫回频率和当任务完成时的回转频率的这种:
poll_interval=15
 
private_key_file
如果你是用pem密钥文件而不是SSH客户端或秘密啊认证的话, 你可以设置这里的默认值, 来避免每一次提醒设置密钥文件位置"--ansible-private-keyfile":
private_key_file=/path/to/file.pem
 
remote_port
这个设置是你系统默认的远程SSH端口, 如果不指定,默认为22号端口:(建议修改成别的端口)
remote_port = 22
 
remote_user
这是个ansible使用/usr/bin/ansible-playbook连接的默认用户名。注意如果不指定, /usr/bin/ansible默认使用当前用户名称:
remote_user = root
 
timeout
这个事默认SSH链接尝试超市时间:
timeout = 10
 
transport
如果"-c <transport_name>" 选项没有在使用/usr/bin/ansible 或者 /usr/bin/ansible-playbook 特指的话, 这个参数提供了默认通信机制。默认值为'smart'。
如果本地系统支持ControlPersist技术的话, 将会使用(基于OpenSSH)'ssh', 如果不支持该技术,将使用'paramiko'库,其他传输选项包括'local', 'chroot','jail'等等。
用户通常可以这个设置为'smart',让playbook在需要的条件自己选择'connectin:'参数.
 
record_host_keys
默认设置会记录并验证通过在用户hostfile中新发现的的主机(如果host key checking 被激活的话)。这个选项在有很多主机的时候将会性能很差!!
在这种情况下,建议使用SSH传输代替。当设置为False时, 性能将会提升,在hostkey checking 被禁用时候, 建议使用!!!
record_host_keys=True
 
scp_if_ssh
又是用户操控一个一个没有开启SFTP协议的远程系统.如果这个设置为True, scp将代替用来为远程主机传输文件:
scp_if_ssh=False
如果没有遇到这样的问题没有必要来修改这个设置。当然修改这个设置也没有什么明显的弊端。大部分的系统环境都默认支持SFTP, 通常情况下不需要修改。
 
pipelining
在不通过实际文件传输的情况下执行ansible模块来使用管道特性, 从而减少执行远程模块SSH操作次数。如果开启这个设置,将显著提高性能!!
然而当使用"sudo:"操作的时候, 你必须在所有管理的主机的/etc/sudoers中禁用'requiretty'。
默认这个选项为了保证与sudoers requiretty的设置(在很多发行版中时默认的设置)的兼容性是禁用的。但是为了提高性能强烈建议开启这个设置。
pipelining=False
 
accelerate_port
在急速模式下使用的端口。
accelerate_port = 5099
 
accelerate_timeout
这个设置时用来控制从客户机获取数据的超时时间.如果在这段时间内没有数据传输,套接字连接会被关闭. 一个保持连接(keepalive)数据包通常每15秒回发回给控制台,所以这个超时时间不应该低于15秒(默认值为30秒):
accelerate_timeout = 30
 
accelerate_connect_timeout
这个设置空着套接字调用的超时时间。这个应该设置相对比较短。
这个和'accelerate_port'连接在回滚到ssh或者paramiko(受限于你默认的连接设置)连接方式之前会尝试三次开始远程加速daemon守护进程。默认设置为1.0秒!
accelerate_connect_timeout = 1.0
需要注意: 这个选项值可以设置为小于1秒钟,但是除非你拥有一个速度很快而且很可靠的网络,否则也许这样并不是一个很好的选择。
如果你使用英特网访问你的系统,最好提高这个值!!!
 
accelerate_daemon_timeout
这个控制加速daemon守护进程的超时时间,用分钟来衡量.默认为30分钟!
accelerate_daemon_timeout = 30
注意, 在1.6版本之前,daemon发起的超时时间是硬编码的.对于1.6以后的版本,超时时间是根据daemon上一次活动信息和这个可设置的选项。
 
accelerate_multi_key
如果这个选项开启,这个设置将允许多个私钥被加载到daemon。任何客户端要想连接daemon都需要开启这个选项!!!
accelerate_multi_key = yes
通过本地套接字文件连接的通过SSH上传密钥文件到目标节点的新客户端, 必须在登陆daemon时使用原始的登陆密钥登陆。
playbook详解
参考大神博客
ansible常用模块

ping 模块: 检查指定节点机器是否还能连通,用法很简单,不涉及参数,主机如果在线,则回复pong 。
raw 模块: 执行原始的命令,而不是通过模块子系统。
yum 模块: RedHat和CentOS的软件包安装和管理工具。
apt 模块: Ubuntu/Debian的软件包安装和管理工具。
pip 模块 : 用于管理Python库依赖项,为了使用pip模块,必须提供参数name或者requirements。
synchronize 模块: 使用rsync同步文件,将主控方目录推送到指定节点的目录下。
template 模块: 基于模板方式生成一个文件复制到远程主机(template使用Jinjia2格式作为文件模版,进行文档内变量的替换的模块。
copy 模块: 在远程主机执行复制操作文件。
user 模块 与 group 模块: user模块是请求的是useradd, userdel, usermod三个指令,goup模块请求的是groupadd, groupdel, groupmod 三个指令。
service 或 systemd 模块: 用于管理远程主机的服务。
get_url 模块: 该模块主要用于从http、ftp、https服务器上下载文件(类似于wget)。
fetch 模块: 它用于从远程机器获取文件,并将其本地存储在由主机名组织的文件树中。
file 模块: 主要用于远程主机上的文件操作。
lineinfile 模块: 远程主机上的文件编辑模块
unarchive模块: 用于解压文件。
command模块 和 shell模块: 用于在各被管理节点运行指定的命令. shell和command的区别:shell模块可以特殊字符,而command是不支持
hostname模块: 修改远程主机名的模块。
script模块: 在远程主机上执行主控端的脚本,相当于scp+shell组合。
stat模块: 获取远程文件的状态信息,包括atime,ctime,mtime,md5,uid,gid等信息。
cron模块: 远程主机crontab配置

mount模块: 挂载文件系统。
find模块: 帮助在被管理主机中查找符合条件的文件,就像 find 命令一样。
selinux模块:远程管理受控节点的selinux的模块

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值