ansible概述

一、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 命令的执行过程:

  1. 加载自己的配置文件,默认/etc/ansible/ansible.cfg;
  2. 查找对应的主机配置文件,找到要执行的主机或者组;
  3. 加载自己对应的模块文件,如 command;
  4. 通过ansible将模块或命令生成对应的临时py文件(python脚本), 并将该文件传输至远程服务器;
  5. 对应执行用户的家目录的.ansible/tmp/XXX/XXX.PY文件;
  6. 给文件 +x 执行权限;
  7. 执行并返回结果;
  8. 删除临时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/tmpAnsible 通过远程传输模块到远程主机,然后远程执行,执行后在清理现场。在有些场景下,你也许想使用默认路径希望像更换补丁一样使用。默认路径是在用户家目录下属的目录,Ansible 会在这个目录中使用一个随机的文件夹名称。
remote_user = root这是个ansible使用/usr/bin/ansible-playbook链接的默认用户名.。注意如果不指定,/usr/bin/ansible默认使用当前用户名称
roles_path = /etc/ansible/rolesroles 路径指的是’roles/’下的额外目录,用于playbook搜索Ansible roles.多余的路径可以用冒号分隔
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值