Ansible简介

简介

  Ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。ansible不需要在远程主机上安client/agents,因为它们是基于ssh来和远程主机通讯的。ansible目前已经已经被红帽官方收购,是自动化运维工具中大家认可度最高的,并且上手容易,学习简单。是每位运维工程师必须掌握的技能之一。
特点:
(1)、部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作;
(2)、默认使用SSH协议对设备进行管理;
(3)、有大量常规运维操作模块,可实现日常绝大部分操作。
(4)、配置简单、功能强大、扩展性强;
(5)、支持API及自定义模块,可通过Python轻松扩展;
(6)、通过Playbooks来定制强大的配置、状态管理;
(7)、轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
(8)、提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台。

Ansible整体架构:
887e94792.jpg
Ansible:Ansible核心程序。
HostInventory:记录由Ansible管理的主机信息,包括端口、密码、ip等。
Playbooks:“剧本”YAML格式文件,集中定义Ansible任务的配置文件。多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能。
Core Modules:核心模块,主要操作是通过调用核心模块来完成管理任务。使用这些模块将资源分发至被管理主机,使其执行特定任务或匹配特定状态。
Custom Modules:自定义模块,完成核心模块无法完成的功能,支持多种语言。
Connection Plugins:连接插件,Ansible和Host通信使用。用于和被管理主机实现通信,除支持使用SSH连接被管理主机外,Ansible还支持其它的连接方式。
Host Inventory:主机清单,定义Ansible管理的远程主机,默认是在Ansible hosts配置文件中定义
Plugins:插件,可借助相关插件完成记录日志、发送邮件等功能。

Ansible特性:
(1)、模块化:基于模块工作,支持自定义模块,可使用任意语言开发模块,调用特定模块完成特定任务;
(2)、基于Python语言实现,依赖paramiko、PyYAML、Jinja2、httplib2、simplejson、pycrypto等模块;
(3)、部署简单:不需要在被管控主机上安装任何客户端,而是通过一些标准的协议,如:SSH。无服务器端,使用时直接运行命令即可;
(4)、可实现多级指挥;
(5)、支持playbook,使用yaml语言定制剧本playbook;
(6)、幂等性:Ansible是以“结果为导向的”,如果指定了一个“目标状态”,ansible会自动判断,“当前状态”是否与“目标状态”一致,如果一致,则不进行任何操作,如果不一致,那么就将“当前状态”变成“目标状态”,这就是幂等性,幂等性可以保证重复执行同一项操作时,得到的结果是一样的。

Ansible优点:
(1)、轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
(2)、批量任务执行可以写成脚本,而且不用分发到远程就可以执行;
(3)、使用python编写,维护更简单,ruby语法过于复杂;
(4)、支持sudo。

ansible任务执行模式

Ansible主机对被管控主机的操作方式说明:
  (1)ad-hoc模式(点对点模式):使用单个模块,支持批量执行单条命令。ad-hoc命令是一种可以快速输入的命令,而且不需要保存的命令。就相当于bash中的一句话shell。
  (2)playbook模式(剧本模式):Ansible主要管理方式,也是Ansible功能强大的关键所在。playbook通过多个task集合完成一类功能(如Web服务的安装部署、 数据库服务器的批量备份等),可以简单地把playbook理解为通过组合多条ad-hoc操作的配置文件。
1174645.jpg

ansible执行流程

1174646.jpg
  简单理解就是Ansible在运行时, 首先读取ansible.cfg中的配置, 根据规则获取Inventory中的管理主机列表, 并行的在这些主机中执行配置的任务, 最后等待执行返回的结果。
Ansiblie命令执行过程:
(1)、加载自己的配置文件 默认/etc/ansible/ansible.cfg
(2)、查找对应的主机配置文件, 找到要执行的主机或者组
(3)、加载自己对应的模块文件, 如command
(4)、通过ansible将模块或命令生成对应的临时py文件, 并将该文件传输至远程服务器
(5)、对应执行用户的家目录的.ansible/tmp/XXX/XXX.PY文件
(6)、给文件+x执行
(7)、执行并返回结果
(8)、删除临时py文件, sleep 0退出

ansible程序结构:
安装目录
配置文件目录:/etc/ansible/
执行文件目录:/usr/bin/ansible* Lib库依赖目录:/usr/lib/python2.7/site-packages/ansible/
Help文档目录:/usr/share/doc/ansible-2.7.10/
Man文档目录:/usr/share/man/man1/ansible*

Ansible配置文件

常用配置文件: /etc/ansible/ansible.cfg:主配置文件,配置ansible工作特性 /etc/ansible/hosts:定义被管控主机清单的配置文件 /etc/ansible/roles:存放角色的目录

ansible.cfg的配置

  设置ansible.cfg配置参数,ansible有许多参数,下面列出常用的参数:

inventory:
  这个参数表示资源清单inventory文件的位置,资源清单就是一些Ansible需要连接管理的主机列表。这个参数的配置实例如下:inventory = /etc/ansible/hosts
library:
  Ansible的操作动作,无论是本地或远程,都使用一小段代码来执行,这小段代码称为模块,这个library参数就是指向存放Ansible模块的目录。配置实例如下:library = /usr/share/ansible
  Ansible支持多个目录方式,只要用冒号(:)隔开就可以,同时也会检查当前执行playbook位置下的./library目录。
forks:
  设置默认情况下Ansible最多能有多少个进程同时工作,从Ansible 1.3开始,fork数量默认自动设置为主机数量或者潜在的主机数量,默认设置最多5个进程并行处理。具体需要设置多少个,可以根据控制主机的性能和被管节点的数量来确定,可以是50或100。默认值5是非常保守的值,配置实例如下:forks = 5
sudo_user:
  这是设置默认执行命令的用户,也可以在playbook中重新设置这个参数。配置实例如下:sudo_user = root
remote_port:
  这是指定连接被管节点的管理端口,默认是22。除非设置了特殊的SSH端口,不然这个参数一般是不需要修改的。配置实例如下:remote_port = 22
host_key_checking:
  这是设置是否检查SSH主机的密钥。可以设置为True或False,关闭后第一次连接没有提示配置实例host_key_checking = False
timeout:
  这是设置SSH连接的超时间隔,单位是秒。配置实例如下:timeout = 60
log_path:
  Ansible系统默认是不记录日志的,如果想把Ansible系统的输出记录到日志文件中,需要设置log_path来指定一个存储Ansible日志的文件。配置实例如下:log_path = /var/log/ansible.log
  另外需要注意,执行Ansible的用户需要有写入日志的权限,模块将会调用被管节点的syslog来记录。

hosts的配置
1、直接指明主机地址或主机名:
green.example.com
blue.example.com
192.168.100.1
192.168.100.10
2、定义一个主机组[组名]把地址或主机名加进去
[websrvs]
192.168.1.144
192.168.1.220
[dbsrvs]
192.168.1.144
  组成员可以使用通配符来匹配,如 192.168.1.[1:6]:表示匹配从192.168.1.1 - 192.168.1.6的主机
   websrvs和dbsrvs表示主机组名,主机可以使用域名、主机名、IP地址表示,使用前两者时,也需要主机能反解析到相应的IP地址。

常用命令集

/usr/bin/ansible    # Ansibe AD-Hoc 临时命令执行工具,常用于临时命令的执行
/usr/bin/ansible-doc    # Ansible 模块功能查看工具
/usr/bin/ansible-galaxy    # 下载/上传优秀代码或Roles模块的官网平台,基于网络的
/usr/bin/ansible-playbook    # Ansible 定制自动化的任务集编排工具
/usr/bin/ansible-pull    # Ansible远程执行命令的工具,拉取配置而非推送配置(使用较少,海量机器时使用,对运维的架构能力要求较高)
/usr/bin/ansible-vault    # Ansible 文件加密工具
/usr/bin/ansible-console    # Ansible基于Linux Consoble界面可与用户交互的命令执行工具

Ansible-doc命令:

命令:ansible-doc
参数:
  -h, --help #show this help message and exit 显示帮助信息,命令参数API文档
  -l, --list #List available modules 列出可用的模块
  -M MODULE_PATH, --module-path=MODULE_PATH #指定模块的路径specify path(s) to module library (default=None)
  -s, --snippet #Show playbook snippet for specified module(s) 显示指定模块的用法
  --version #show program's version number and exit 显示ansible-doc的版本号查看模块列表
一般用法:
ansible-doc -l #获取模块信息
ansible-doc -s MOD_NAME #获取指定模块的使用帮助

Ansible命令:

命令格式:ansible <host-pattern> [options]
ansible <host-pattern> [-f forks] [-m module_name] [-a args]
(1)、<host-pattern>:在/etc/ansible/hosts中定义的被管控主机IP地址或域名的列表
  all和* #表示匹配所有主机
  ? #表示匹配单个字符
  *和?使用时必须要加'',如:
    # ansible '*' -m ping
    # ansible '192.168.1.22?' -m ping
  'websrvs:dbsrvs' #表示目标主机在websrvs组或dbsrvs组中,2个组中所有的主机
  'websrvs:&dbsrvs' #表示目标主机同时在websrvs组和dbsrvs组中
  'websrvs:!dbsrvs' #表示目标主机在websrvs组,但不在dbsrvs组中
  192.168.1.* #表示匹配192.168.1网段的所有目标主机
(2)、[options]:
  -f FORKS:指定一次批量管控多少台主机,默认一批管控5台主机
  -m MODULE_ANME:执行的模块名称,可通过命令“# ansible-doc -l | less”查看目前已安装的所有模块,不指定模块时,默认使用的是command模块,在配置文件/etc/ansible/ansible.cfg的“#module_name = command”中定义
  -a MODULE_ARGS:模块参数,通常为key=value的格式,可通过命令“# ansible-doc -s 模块名”查看具体的用法及详细参数
  --syntax-check:对playbook执行语法检查,并不真正执行
  -C:尝试预测可能发生的一些变化,并不真正执行
  --list-hosts:列出匹配的远程主机列表,并不执行任何其它操作
  -u REMOTE_USER:以哪个用户连接远程主机,默认为None
  -T TIMEOUT:连接远程主机的超时时长,默认10秒
  --version:查看ansible主配置文件、ansible配置的模块搜索路径、ansible python模块位置、可执行程序位置和python版本信息
  -h:显示帮助信息

我们可以通过 ansible -h查看帮助
  -a MODULE_ARGS, --args=MODULE_ARGS #模块的参数,如果执行默认COMMAND的模块,即是命令参数,如:“date”、“pwd”等等 module arguments 模块参数
  -k, --ask-pass #ask for SSH password 登录密码, 提示输入SSH密码而不是假设基于密钥的验证
  --ask-su-pass #ask for su password su切换密码
  -K, --ask-sudo-pass #ask for sudo password 提示密码使用sudo,sudo表示提权操作
  --ask-vault-pass #ask for vault password
  -B SECONDS, --background=SECONDS #后台运行超时时间run asynchronously,failing after X seconds (default=N/A)
  -C, --check #don‘t make any changes; instead, try to predict some of the changes that may occur 只是测试一下会改变什么内容,不会真正去执行;相反,试图预测一些可能发生的变化
  -c CONNECTION, --connection=CONNECTION #连接类型使用 connection type to use (default=smart)
  -f FORKS, --forks=FORKS #并行任务数。NUM被指定为一个整数,默认是5
  -i INVENTORY, --inventory-file=INVENTORY #指定库存主机文件的路径,默认为/etc/ansible/hosts
  --list-hosts #outputs a list of matching hosts;does not execute anything else
  -m MODULE_NAME, --module-name=MODULE_NAME #执行模块的名字,默认使用 command 模块,所以如果是只执行单一命令可以不用 -m参数module name to execute (default=command)
  -M MODULE_PATH, --module-path=MODULE_PATH #要执行的模块的路径,默认为/usr/share/ansible/
  -o, --one-line #condense output 压缩输出,摘要输出。尝试一切都在一行上输出。
  -P POLL_INTERVAL, --poll=POLL_INTERVAL #调查背景工作每隔数秒。需要-b
  --private-key=PRIVATE_KEY_FILE #私钥路径,使用这个文件来验证连接
  -S, --su #run operations with su 用 su 命令
  -R SU_USER, --su-user=SU_USER #指定SU的用户,默认是root用户
  -s, --sudo #run operations with sudo (nopasswd)
  -U SUDO_USER, --sudo-user=SUDO_USER #sudo到哪个用户,默认为 root
  -T TIMEOUT, --timeout=TIMEOUT #指定SSH默认超时时间,默认是10S
  -t TREE, --tree=TREE #log output to this directory 将日志内容保存在该输出目录,结果保存在一个文件中在每台主机上。
  -u REMOTE_USER, --user=REMOTE_USER #远程用户,默认是root用户
  --vault-password-file=VAULT_PASSWORD_FILE #vault password file
  -v, --verbose #verbose mode (-vvv for more, -vvvv to enable connection debugging) 详细信息

原文地址:http://www.cnblogs.com/duzhaoqi/

相关文章

发表新评论