文章目录
- Ansible
- 网站
- 概念
- 特点
- 注意事项
- Ansible架构
- 主要功能
- 相关文件
- 安装
- 相关文件
- 配置文件ansible.cfg
- 配置文件使用
- 配置文件内容
- 资源清单(inventory)hosts文件
- inventory定义内容
- 相关命令
- ansible
- ansible-doc
- ansible-playbook
- ansible-galaxy
- ansible-config
- ansible-inventory
- ansible-vault
Ansible
网站
官方网站:https://docs.ansible.com/
Ansible中文权威指南:https://ansible-tran.readthedocs.io/en/latest/
概念
- Ansible:新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于 paramiko 开发的,并且基于模块化工作,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的。ansible目前已经已经被红帽官方收购,是自动化运维工具中大家认可度最高的,并且上手容易,学习简单。
- SSH:SSH协议族可以用来进行远程控制, 或在计算机之间传送文件
- paramiko:paramiko是Python的一个库,实现了SSHv2协议。有了Paramiko以后,我们就可以在Python代码中直接使用SSH协议对远程服务器执行操作,而不是通过ssh命令对远程服务器进行操作。
- Ansible Tower (以前叫’AWX’)是能够帮助任何IT团队更容易使用Ansible的解决方案。该方案基于web。Tower允许对用户进行权限控制,即使某用户不能传送某SSH凭证,你也可以通过Tower来对该用户共享该凭证。我们可以通过图形化界面来管理Inventory,也可以对各种各样的云资源做同步。Tower可以记录所有job的日志,也可以与LDAP集成,并且拥有强大的可浏览的REST API。Tower也提供了命令行工具,可以与Jenkins轻松集成。Provisioning回调对自动伸缩拓扑图提供了强大的支持。Tower的免费版本最多支持10个节点,并且Ansible公司会提供强大的支持。
- Ansible任务执行方式:
- Ad-Hoc模式:临时命令模式,指的是使用 /usr/bin/ansible 运行 Ansible 直接执行一些命令,可以快速输入命令执行,同时不保存命令,相对于剧本形式,属于临时性,简短操作。
- Playbook模式:剧本模式,是Ansible主要管理方式,也是Ansible功能强大的关键所在。playbook通过多个task集合完成一类功能,如Web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条Ad-Hoc操作的配置文件。
特点
- 部署简单,只需在主控端部署Ansible环境,被控端保持使用环境,无需安装额外软件
- 默认使用SSH协议对设备进行管理
- 有大量常规运维操作模块,可实现日常绝大部分操作
- 配置简单、功能强大、扩展性强
- 支持API及自定义模块,可通过Python轻松扩展
- 通过Playbooks来定制强大的配置、状态管理
- 轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可
- 提供一个功能强大、操作性强的Web管理界面和REST API接口——Ansible Tower
- YAML格式,编排任务,支持丰富的数据结构
注意事项
- 执行ansible的主机一般称为主控端,中控,master或堡垒机
- 主控端Python版本需要2.6或以上
- 被控端Python版本小于2.4需要安装python-simplejson
- 被控端如开启SELinux需要安装libselinux-python
- windows不能做为主控端
Ansible架构
Ansible架构:
- Host Inventory:记录了每一个由Ansible管理的主机信息,信息包括ssh端口,root帐号密码,ip地址等
- Playbooks:剧本,YAML格式文件,多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能
- Ansible:Ansible的核心程序
- Core Modules:核心模块,ansible通过模块功能管理远端Host
- Custom Modules:自定义模块,完成Ansible核心模块无法完成的功能
- Connection Plugins: 连接插件,通过定义可用的传输类型,使Ansible和Host通信
- Plugins:通过插件来实现记录日志,发送邮件或其他功能
主要功能
- PLAYBOOKS:任务剧本(任务集),编排定义Ansible任务集的配置文件,由Ansible顺序依次执行,通常是JSON格式的YML文件
- ANSIBLE:组合INVENTORY、 API、 MODULES、PLUGINS的绿框,可以理解为是ansible命令工具集,其为核心执行工具
- INVENTORY:Ansible管理主机的清单/etc/anaible/hosts
- MODULES:Ansible执行命令的功能模块,多数为内置的核心模块,也可自定义,ansible-doc –l 可查看模块
- PLUGINS:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用
- API: 供第三方程序调用的应用程序编程接口
相关文件
/usr/bin/ansible #命令行工具
/usr/bin/ansible-doc #帮助文档
/usr/bin/ansible-playbook #剧本执行工具
/usr/bin/ansible-galaxy #下载/上传优秀代码或Roles模块的官网平台
/usr/bin/ansible-pull #远程执行命令的工具
/usr/bin/ansible-vault #文件加密工具
/usr/bin/ansible-console #基于Console界面与用户交互的执行工具
/etc/ansible/ansible.cfg #主配置文件
/etc/ansible/hosts #管理的主机清单
/etc/ansible/roles #角色存放处
安装
1.配置一个epel源,epel中包含了ansible的安装软件,可以直接使用yum安装
2.epel阿里源:https://developer.aliyun.com/mirror/epel?spm=a2c6h.13651102.0.0.3e221b11Kh7GZj
[root@node1 yum.repos.d]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
#根据阿里云的提示,直接安装下载repo文件,导入源地址
[root@node1 yum.repos.d]# yum repolist
……
epel epel 13,200
……
#配置好epel源,可以查看到资源,直接安装
[root@node1 yum.repos.d]# yum install -y ansible
……
Installed:
ansible.noarch 0:2.9.3-1.el7
Dependency Installed:
PyYAML.x86_64 0:3.10-11.el7 libyaml.x86_64 0:0.1.4-11.el7_0 python-babel.noarch 0:0.9.6-8.el7
python-backports.x86_64 0:1.0-8.el7 python-backports-ssl_match_hostname.noarch 0:3.5.0.1-1.el7 python-cffi.x86_64 0:1.6.0-5.el7
python-enum34.noarch 0:1.0.4-1.el7 python-httplib2.noarch 0:0.9.2-0.2.el7 python-idna.noarch 0:2.4-1.el7
python-ipaddress.noarch 0:1.0.16-2.el7 python-jinja2.noarch 0:2.7.2-2.el7 python-markupsafe.x86_64 0:0.11-10.el7
python-paramiko.noarch 0:2.1.1-0.10.el7 python-ply.noarch 0:3.4-11.el7 python-pycparser.noarch 0:2.14-1.el7
python-setuptools.noarch 0:0.9.8-7.el7 python2-cryptography.x86_64 0:1.7.2-2.el7 python2-jmespath.noarch 0:0.9.0-1.el7
python2-pyasn1.noarch 0:0.1.9-7.el7 sshpass.x86_64 0:1.06-1.el7
Complete!
#安装完成,自动下载安装相关依赖软件包
相关文件
配置文件ansible.cfg
配置文件使用
- ansible.cfg配置文件是以ini格式存储配置数据的
- ansible.cfg配置文件可以存放在不同的目录,但只有一个可用,在运行Ansible命令时,Ansible将会按照预先设定的顺序查找配置文件
- ansible配置文件查找顺序(从上至下,先找到哪个文件就用哪个文件)
-
ANSIBLE_CONFIG
:首先,Ansible命令会检查环境变量,及这个环境变量将指向的配置文件 -
./ansible.cfg
:其次,将会检查当前目录下的ansible.cfg配置文件 -
~/.ansible.cfg
:然后,将会检查当前用户home目录下的.ansible.cfg配置文件 -
/etc/ansible/ansible.cfg
:最后,将会检查在用软件包管理工具安装Ansible时自动产生的配置文
- 建议使用
~/.ansible.cfg
作为配置文件,这样就可以实现每个用户都有自己独自的配置文件,不污染其它用户正常使用Ansible,同时也方便进行选项配置 - 几乎所有的配置项都可以通过Ansible的playbook或环境变量来重新赋值
配置文件内容
[root@node1 ansible]# cat ansible.cfg | grep ^[^#]
[defaults] #定义常规默认的配置,如:定义文件路径、设置并发连接数、设置sudo用户、是否开启sudo功能等等
#inventory = /etc/ansible/hosts #被控端的主机列表文件
#library = /usr/share/my_modules/ #模块文件存放路径
#remote_tmp = ~/.ansible/tmp #远程主机临时文件存放目录
#local_tmp = ~/.ansible/tmp #管理节点临时文件存放目录
#forks = 5 #默认开启的并发数
#poll_interval = 15 #默认轮询时间间隔(单位秒)
#sudo_user = root #默认sudo用户
#ask_sudo_pass = True #是否提示输入sudo密码
#ask_pass = True #是否提示输入密码
#transport = smart #远程传输模式
#remote_port = 22 #默认远程主机的端口号
#module_lang = C #模块运行默认语言环境
#gathering = implicit #facts信息收集开关定义 smart|implicit|explicit
roles_path = /etc/ansible/roles:/usr/share/ansible/roles #指定role存放路径
#timeout = 10 #SSH连接超时时间
#remote_user = root #ansible远程认证用户
#log_path = /var/log/ansible.log #ansible日志记录文件
#module_name = command #ansible默认执行模块command
#executable = /bin/sh #ansible命令执行shell为/bin/sh
#hash_behaviour = replace #ansible主机变量重复处理方式replace(默认)|merge
#private_role_vars = yes #默认情况下,角色中的变量将在全局变量范围中可见。 为了防止这种情况,可以启用以下选项,只有tasks的任务和handlers得任务可以看到角色变量
#vault_password_file = /path/to/vault_password_file #指定vault密码文件路径
#ansible_managed = Ansible managed #定义的一个Jinja2变量,可以插入到Ansible配置模版系统生成的文件中
#display_skipped_hosts = True #开启显示跳过的主机
#error_on_undefined_vars = False #开启错误,或者没有定义的变量
# set plugin path directories here, separate with colons #设置相关插件路径,使用‘:’分割多个路径
#action_plugins = /usr/share/ansible/plugins/action
#cache_plugins = /usr/share/ansible/plugins/cache
#callback_plugins = /usr/share/ansible/plugins/callback
#connection_plugins = /usr/share/ansible/plugins/connection
#lookup_plugins = /usr/share/ansible/plugins/lookup
#inventory_plugins = /usr/share/ansible/plugins/inventory
#vars_plugins = /usr/share/ansible/plugins/vars
#filter_plugins = /usr/share/ansible/plugins/filter
#test_plugins = /usr/share/ansible/plugins/test
#terminal_plugins = /usr/share/ansible/plugins/terminal
#strategy_plugins = /usr/share/ansible/plugins/strategy
#fact_caching = memory #定义ansible facts缓存方式memory
#fact_caching_connection=/tmp #定义ansible facts缓存路径/tmp
[inventory] #设置插件及可忽略的文件格式
[privilege_escalation] #用户权限类的设定,如:sudo、是否启用sudo密码
[paramiko_connection] #不记录遇到的新主机密钥、增加新主机的性能
[ssh_connection] #对SSH连接的一些配置,配置项比较少
[persistent_connection] #主要就两个选项,连接超时、命令超时
[accelerate] #连接加速的相关配置
[selinux] #selinux相关配置,基本不会涉及
[colors] #设置输出颜色,最好默认
[diff] #输出打印是是否打印diff
资源清单(inventory)hosts文件
- inventory:资源清单,在大规模的配置管理工作中,特别是云服务提供商或者IDC厂家,需要管理不同业务的不同机器,这些机器的信息都存放在Ansible的inventory组件里面。在我们使用Ansible进行远程主机管理时,必须先将主机信息存放在inventory里面,这样才能使用Ansible对它进行操作。默认情况下,Ansible的inventory是一个静态的INI格式的文件,可以通过在配置文件中的inventory选项,进行相关设置。当然了,我们还可以通过ANSIBLE_HOSTS环境变量指定或者运行ansible和ansible-playbook的时候用-i参数临时设置。
-
/etc/ansible/hosts
默认安装软件生成的资源清单模板,可以直接使用,也可另外创建文件(设置指定路径)
inventory定义内容
- 定义主机、主机变量
#可以直接使用IP地址定义主机
12.12.1.1
12.12.12.1:8080 #可指定端口
#可以使用域名,但是要有解析
www.test.org
server1
#定义有规律的主机名称
server[1:100] #指定server1~server100的主机
node[a:f] #指定nodea|nodeb|nodec|nodee|nodef主机
#给每个主机的变量:(选择连接类型和用户)
localhost ansible_connection=local
server1 ansible_connection=ssh ansible_user=root
server2 ansible_connection=ssh ansible_user=test
- 定义主机组、组变量
#没有分类的主机,默认组ungrouped
#通过使用【name】定义主机组,将主机分类
[httpd]
server1
1.1.1.1
[nginx]
server2
2.2.2.2
#通过使用【name:children】定义主机组的父亲组,‘children’是固定写法
[web:children] #定义父亲组父亲组包含所有主机
httpd
nginx
#可以通过组变量方式,给所有组内主机设置统一变量
[web:vars]
ntp_server=ntp.test.example.com
proxy=proxy.test.example.com
注意:
1.作为子组成员的任何主机自动是父组的成员
2.子组的变量将具有较高的优先级(覆盖)父组的变量
- 目录方式定义主机及组
/etc/ansible/inventory/ #创建了inventory目录,和httpd与nginx两个文件
|---httpd
|---nginx
vim /etc/ansible/inventory/httpd
[httpd] #分组名
1.1.1.1
server1
vim /etc/ansible/inventory/nginx
[nginx]
2.2.2.2
servers2
- inventory中可定义的变量参数
ansible_ssh_host #定义主机的ssh地址
ansible_ssh_port #定义主机的ssh端口
ansible_ssh_user #定义主机的ssh认证用户
ansible_ssh_pass #定义主机的ssh认证密码
ansible_sudo #定义主机的sudo用户
ansible_sudo_pass #定义主机的sudo密码
ansible_sudo_exe #定义主机的sudo路径
ansible_connection #定义主机连接方式;与主机的连接类型.比如:local,ssh或者paramiko;Ansible 1.2以前默认使用paramiko。1.2以后的版本默认使用‘smart’,‘smart’方式会根据是否支持ControlPersist,来判断ssh方式是否可行
ansible_ssh_private_key_file #定义主机私钥文件
ansible_shell_type #定义主机shell类型
ansible_python_interpreter #定义主机python解释器路径
- 分文件定义变量
inventory主文件中保存所有的变量并不是最佳方式,还可以保存在独立的文件中
#通过组、主机形式定义变量
/etc/ansible/group_vars/httpd #定义指定组的变量
/etc/ansible/group_vars/web #定义指定父亲组的变量
/etc/ansible/host_vars/server1 #定义指定主机变量
#变量太多时,分文件定义细化的变量进行管理
/etc/ansible/group_vars/httpd/db_settings #数据库相关变量定义
/etc/ansible/group_vars/httpd/cluster_settings #集群相关变量定义
相关命令
ansible
#ansible的主要命令
ansible <host-pattern> [options]
options:
-a #指定模块的参数
--version #显示版本
-f #fork多少进程并发处理,默认为5个
-m module #指定使用的模块,默认为command
-v #查看执行的详细过程(-vv、-vvvv更详细)
-i #指定hosts文件路径,默认default=/etc/ansible/hosts
-I #指定pattern,对已匹配的主机中再过滤一次
--list-hosts #显示主机列表(可以简写为--list)
-k,--ask-pass #提示输入ssh连接密码,默认使用key验证
-K,--ask-become-pass #提示执行输入sudo的密码
-C,--check #检查,并不执行
-c #设置连接类型(default=smart)
-T,--timeout=TIMEOUT #执行命令的超时时间,默认10s
-t #日志输出到该目录,日志文件名以主机命名
-u,--user=REMOTE_USER #指定远程执行的执行用户,若不指定用户,则使用当前用户身份
-U #sudo到哪个用户,默认为root
-b,--become #代替旧版本的sudo切换
-h,--help #显示帮助信息
-s #sudo运行
-o #压缩输出,摘要输出
ansible命令在主要是与模块联动使用的
ansible-doc
#ansible-doc:查看ansible模块(插件)文档说明,针对每个模块都有详细的用法说明,功能和Linux的man命令类似
ansible-doc [-l|-F|-s] [options] [-t <plugin type> ] [plugin]
options:
-a, --all #显示文档所有的模块
-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:运行Ansible剧本,在目标主机上执行定义的任务
ansible-playbook [options] playbook.yml [playbook2 ...]
options:
#大部分的参数和ansible的参数一致
ansible-galaxy
#ansible-galaxy:下载/上传优秀代码或Roles模块的官网平台(https://galaxy.ansible.com)
ansible-galaxy [delete|import|info|init|install|list|login|remove|search|setup] [--help] [options] ...
options:
-h, --help #查看帮助信息
-c, --ignore-certs #忽略SSL证书验证错误
-s API_SERVER, --server=API_SERVER #API服务器地址
-v, --verbose #查看执行的详细过程(-vv、-vvvv更详细)
--version #查看版本
ansible-config
#ansible-config:查看,编辑管理ansible的配置文件
ansible-config [view|dump|list] [--help] [options] [ansible.cfg]
list #打印所有配置选项
dump #备份配置信息
view #查看配置文件
options:
-c CONFIG_FILE, --config=CONFIG_FILE #指定配置文件所在的路径
-h, --help #查看帮助信息
-v, --verbose #查看执行的详细过程(-vv、-vvvv更详细)
--version #查看版本
ansible-inventory
#ansible-inventory:查看被控制端主机清单的详细信息默认情况下它使用库存脚本,返回JSON格式
ansible-inventory [options] [host|group]
options:
--ask-vault-pass #询问vault密码
--output OUTPUT_FILE #将显示信息输出在指定文件中
--toml #使用TOML格式显示
-h, --help #显示帮助信息
-i INVENTORY #指定invetniory文件
-y, --yaml #使用yaml格式显示
-v, --verbose #查看执行的详细过程(-vv、-vvvv更详细)
--version #查看版本
[root@node1 ~]# ansible-inventory --list
{
"_meta": {
"hostvars": {}
},
"all": {
"children": [
"ungrouped"
]
}
}
ansible-vault
#ansible-vault主要用于配置文件的加密,如编写的playbook配置文件中包含敏感的信息,不希望其他人随便的看,ansible-vault可加密/解密这个配置文件
ansible-vault [create|decrypt|edit|encrypt|encrypt_string|rekey|view] [options] [vaultfile.yml]
create #创建
decrypt #解密
edit #编辑
encrypt #加密
rekey #修改密码
view #查看
options:
--ask-vault-pass #询问vault密码
-h, --help #查看帮助信息
--new-vault-id=NEW_VAULT_ID #设置用于rekey的新vault标识
--new-vault-password-file=NEW_VAULT_PASSWORD_FILE #新的保险库密码文件为rekey
--vault-id=VAULT_IDS #要使用的保险库标识
--vault-password-file=VAULT_PASSWORD_FILES #库密码文件
-v, --verbose #查看执行的详细过程(-vv、-vvvv更详细)
--version #查看版本