一、Ansible概述
ansible是自动化运维工具,基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
ansible 基于 paramiko 开发,并且基于模块化工作,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的。
维运自动化工具本来是用来简化维运工作的,但如果工具本身比较复杂,甚至需要一定的程序开发能力,就会增加使用和推广的难度。
Ansible 有三个最吸引人的地方:无客户端、简单易用和日志集中控管。
Ansible是 Python 阵营的组态管理工具,与 Puppet, SaltStack, Chef, 并列其四的自动化组态设定工具,并且简单易用,在DevOps界也占有一席之地;不用在每台机器 (instance) 预载 agent ,只要有 SSH 和 Python 就可以使用!
特点:
- 部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作;
- 默认使用SSH协议对设备进行管理;
- 有大量常规运维操作模块,可实现日常绝大部分操作;
- 配置简单、功能强大、扩展性强;
- 支持API及自定义模块,可通过Python轻松扩展;
- 通过Playbooks来定制强大的配置、状态管理;
- 轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
- 提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台。
- 具有幂等性:一个操作在一个主机上执行一遍和执行N遍的结果是一样的
Ansible的运作:
在装有Ansible的 Control Machine (主控端),通过 inventory(主机清单) 档案来定义有哪些 Managed node (被控端),并借由 SSH 和 Python 进行沟通。
换句话说,当 Control Machine (主控端) 可以用 SSH 连上 Managed node(被控端),且被连上的机器里有预载 Python 时,Ansible 就可以运作。
-
Control Machine
指的是能够操作 Ansible 的机器,使用ansible管理被控端。它可以是我们平时用的电脑、手机 或机房里的某一台机器。 -
Managed node
则是被装有 Ansible 的主控端进行操纵的机器。
ansible 命令的执行过程:
- 加载自己的配置文件,默认/etc/ansible/ansible.cfg;
- 查找对应的主机配置文件,找到要执行的主机或者组;
- 加载自己对应的模块文件,如 command;
- 通过ansible将模块或命令生成对应的临时py文件(python脚本), 并将该文件传输至远程服务器;
- 对应执行用户的家目录的.ansible/tmp/XXX/XXX.PY文件;
- 给文件 +x 执行权限;
- 执行并返回结果;
- 删除临时py文件,sleep 0退出;
ansible核心组件
ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:
- ansible core 核心引擎;
- host inventory(主机清单):定义ansible所管理主机,支持自定义动态主机清单和其他配置文件位置。
- connection plugins(连接插件):负责被管理主机实现通信。
- playbooks(剧本):集中定义ansible任务的配置文件。
- core modules(核心模块):ansible自带模块,分发资源到被管理主机。
- custom modules(自定义模块):完成功能模块的补充。
ansible的操作方式
Ansible 系统由控制主机对被管节点的操作方式可分为两类,即adhoc和playbook:
- ad-hoc模式(点对点模式)
使用单个模块,支持批量执行单条命令。ad-hoc 命令是一种可以快速输入的命令,而且不需要保存起来的命令。就相当于bash中的一句话shell。 - playbook模式(剧本模式)
是Ansible主要管理方式,也是Ansible功能强大的关键所在。playbook通过多个task集合完成一类功能,如Web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc操作的配置文件。
Ansible的安装
一般的情况下,我们只需在 Control Machine 里安装 Ansible 即可,因为 GNU/Linux 和 macOS 的 Managed node 都早已预载了 Python 2.5 以上的版本,且开通了 SSH 连线的条件。
若想拿 Ansible 来管 Windows 的话,则需进行较多的设置。
ansible安装常用两种方式,yum安装和pip程序(python的包管理模块)安装。
yum install -y epel-release
yum install -y ansible
# 或
yum install -y python-pip # 安装 pip
pip install --upgrade pip # 升级 pip
pip install ansible # 安装 Ansible
正常在 Managed Node 我们都会安装 OpenSSH server 和开通连线权限以便于远端管理,Python 的部份,虽说现代的 GNU/Linux 大多都早已内建了,可 Ansible 预设使用的 Python 是 2.x 的版本,如果安装的是3.x版本,需进行调整。
二、Ansible相关文件
(一)Inventory文件
Ansible 可同时操作属于一个组的多台主机,组和主机之间的关系通过 inventory 文件配置。默认的文件路径为 /etc/ansible/hosts
除默认文件外,还可以同时使用多个 inventory 文件,也可以从动态源,或云上拉取 inventory 配置信息
[webservers]
alpha.example.org
beta.example.org
192.168.1.100
192.168.1.110
[dbservers]
db01.intranet.mydomain.net
db02.intranet.mydomain.net
10.25.1.56
10.25.1.57
# 方括号[ ]中是组名,用于对系统进行分类,便于对不同系统进行个别的管理
一个系统可以属于不同的组,比如一台服务器可以同时属于 webserver组 和 dbserver组。这时属于两个组的变量都可以为这台主机所用,至于变量的优先级关系将于以后的章节中讨论。
如果有主机的SSH端口不是标准的22端口,可在主机名之后加上端口号,用冒号分隔。SSH 配置文件中列出的端口号不会在 paramiko 连接中使用,会在 openssh 连接中使用.
端口号不是默认设置时,可明确的表示为:
badwolf.example.com:5309
一组相似的 hostname , 可简写如下:
[webservers]
www[01:50].example.com
还可以定义字母范围的简写模式:
[databases]
db-[a:f].example.com
对于每一个 host,还可以选择连接类型和连接用户名:
[targets]
localhost ansible_connection=local
other1.example.com ansible_connection=ssh ansible_ssh_user=mpdehaan
other2.example.com ansible_connection=ssh ansible_ssh_user=mdehaan
Inventory 其他参数说明
通过设置下面的参数,可以控制 ansible 与远程主机的交互方式
ansible_ssh_host
将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置.
ansible_ssh_port
ssh端口号.如果不是默认的端口号,通过此变量设置.
ansible_ssh_user
默认的 ssh 用户名
ansible_ssh_pass
ssh 密码(这种方式并不安全,我们强烈建议使用 --ask-pass 或 SSH 密钥)
ansible_sudo_pass
sudo 密码(这种方式并不安全,我们强烈建议使用 --ask-sudo-pass)
ansible_sudo_exe (new in version 1.8)
sudo 命令路径(适用于1.8及以上版本)
ansible_connection
与主机的连接类型.比如:local, ssh 或者 paramiko. Ansible 1.2 以前默认使用 paramiko.1.2 以后默认使用 'smart','smart' 方式会根据是否支持 ControlPersist, 来判断'ssh' 方式是否可行.
ansible_ssh_private_key_file
ssh 使用的私钥文件.适用于有多个密钥,而你不想使用 SSH 代理的情况.
ansible_shell_type
目标系统的shell类型.默认情况下,命令的执行使用 'sh' 语法,可设置为 'csh' 或 'fish'.
ansible_python_interpreter
目标主机的 python 路径.适用于的情况: 系统中有多个 Python, 或者命令路径不是"/usr/bin/python",比如 \*BSD, 或者 /usr/bin/python
不是 2.X 版本的 Python.我们不使用 "/usr/bin/env" 机制,因为这要求远程用户的路径设置正确,且要求 "python" 可执行程序名不可为 python以外的名字(实际有可能名为python26).
与 ansible_python_interpreter 的工作方式相同,可设定如 ruby 或 perl 的路径....
例子:
some_host ansible_ssh_port=2222 ansible_ssh_user=manager
aws_host ansible_ssh_private_key_file=/home/example/.ssh/aws.pem
freebsd_host ansible_python_interpreter=/usr/local/bin/python
ruby_module_host ansible_ruby_interpreter=/usr/bin/ruby.1.9.3
(二)ansible.cfg文件
Ansible的一些的设置可以通过配置文件完成。在大多数场景下默认的配置就能满足大多数用户的需求,在一些特殊场景下,用户还是需要自行修改这些配置文件。
配置文件读取顺序:
ANSIBLE_CONFIG (一个环境变量)
ansible.cfg (位于当前目录中)
.ansible.cfg (位于家目录中)
/etc/ansible/ansible.cfg
Ansible 将会按以上顺序逐个查询这些文件,直到找到一个为止,并且使用第一个寻找到的配置文件的配置,这些配置将不会被叠加。
配置文件被切割成了不同段,[inventory]、[defaults]、[privilege_escalation]... 多数配置选项位于“defaults”段,
也有一些属于特定的链接类型:[paramiko_connection]、[ssh_connection]、[persistent_connection]...
该文件中的常见的参数:
参数 | 说明 |
---|---|
inventory = /etc/ansible/hosts | 这个参数表示资源清单inventory文件的位置 |
library = /usr/share/ansible | 指向存放Ansible模块的目录,支持多个目录方式,只要用冒号(:)隔开就可以 |
forks = 5 | 设置在与主机通信时的默认并行进程数。从Ansible 1.3开始,fork数量默认自动设置为主机数量或者潜在的主机数量, 这将直接控制有多少网络资源活着cpu可以被使用。如果你有很多的主机, 高数值将会使得跨主机行为变快。默认值比较保守 |
sudo_user = root | 这个是sudo使用的默认用户,如果 ‘–sudo-user’ 没有特指或者’sudo_user’ 在Ansible playbooks中没有特指,在大多数的逻辑中 默认为: ‘root’ |
remote_port = 22 | 指定连接被管节点的管理端口,默认为22端口,建议修改,能够更加安全 |
host_key_checking = False | 设置是否检查SSH主机的密钥,值为True/False。关闭后第一次连接不会提示配置实例 |
timeout = 60 | 设置SSH连接的超时时间,单位为秒 |
log_path = /var/log/ansible.log | 指定一个存储ansible日志的文件(默认不记录日志) |
action_plugins = /usr/share/ansible/plugins/action | “行为”是 ansible中的一段代码,用来激活一些事件,例如执行一个模块,一个模版,等等。这是一个以开发者为中心的特性,使得一些底层模块可以从外部不同地方加载 |
ask_pass = True | 控制Ansible 剧本playbook 是否会自动默认弹出弹出密码,默认为no。如果使用SSH 密钥匙做身份认证.可能需要修改这一参数。 |
ask_sudo_pass = True | 类似 ask_pass,用来控制Ansible playbook 在执行sudo之前是否询问sudo密码,默认为no。如果用户使用的系统平台开启了sudo 密码的话,应该开启这一参数 |
module_lang = C | 默认模块和系统之间通信的计算机语言,默认为’C’语言。 |
nocolor = 1 | 默认ansible会为输出结果加上颜色,用来更好的区分状态信息和失败信息。如果你想关闭这一功能,可以把’nocolor’设置为‘1’ |
remote_tmp = ~/.ansible/tmp | Ansible 通过远程传输模块到远程主机,然后远程执行,执行后在清理现场。在有些场景下,你也许想使用默认路径希望像更换补丁一样使用。默认路径是在用户家目录下属的目录,Ansible 会在这个目录中使用一个随机的文件夹名称。 |
remote_user = root | 这是个ansible使用/usr/bin/ansible-playbook链接的默认用户名.。注意如果不指定,/usr/bin/ansible默认使用当前用户名称 |
roles_path = /etc/ansible/roles | roles 路径指的是’roles/’下的额外目录,用于playbook搜索Ansible roles.多余的路径可以用冒号分隔 |