ansible简介
ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。 适用于中小型应用环境,因为它是基于SSH协议连接的,所以主机数量太多也会影响它的性能。可能200-300台机器足够使用。再往上就需要更专业的软件
ansible特性
- 模块化:调用特定的模块,完成对应的指令
- 有Paramiko,PyYAML,Jinja2(模板语言)三个关键模块
- 支持自定义模块
- 基于python研发
- 部署简单,基于Python和SSH,不需要agent端
- 安全,基于openssh
- 支持playbook编排任务
- 幂等性:一个任务执行N遍和执行1遍的效果一样,不会因为重复执行而导致结果发生改变
- 无需代理不需要PKI(SSL)
- 可使用任何编程语言编写模块
- YAML格式编写任务,支持丰富的数据结构
- 较强大的多层解决方案
ansible架构
- 连接插件
Connection Plugins
:实现和被控主机之间的通信 Host Inventory
:被控主机清单列表Playbooks
:剧本执行多个任务时,可以让节点执行多个任务Core Modules,Costome Modules
:核心模块,自定义模块Plugins (Email,logging,other)
:一些辅助插件来实现各种功能
简单来说,用户将编写好的playbooks发送给配置文件的主机清单,根据playbook中定义的模块来对被控的多台主机进行操作。
使用ansible
安装ansible
ansible放在epel源中,可直接yum
[root@localhost ~]# yum install -y ansible
[root@localhost ~]# rpm -q ansible
ansible-2.9.2-1.el7.noarch
配置文件
/etc/ansible/ansible.cfg
配置文件一般默认就好,不需要做修改
详细的文件配置
[defaults]
# some basic default values...
#inventory = /etc/ansible/hosts # 定义清单的位置
#library = /usr/share/my_modules/ #模块文件
#module_utils = /usr/share/my_module_utils/
#remote_tmp = ~/.ansible/tmp #远程主机临时存放的文件目录
#local_tmp = ~/.ansible/tmp #本机临时存放的文件目录
#plugin_filters_cfg = /etc/ansible/plugin_filters.yml
#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 #模块运行默认语言环境
#module_set_locale = False
/etc/ansible/hosts
inventory
主机清单主要用来使ansible能有效的批量管理。 被管控主机需要在hosts清单里先定义。当然也可以使用命令方式直接定义。
hosts文件支持的风格。
## [webservers] # 中括号加主机组名
## 192.168.1.100 # 下方写上要被控的主机ip
## www[001:006].example.com # 或者使用主机名称方式,如果连续的命名方式,可以使用:来表示
示例:
[webservers]
192.168.1.143
192.168.1.159
[root@ansible ~]# ansible all -m ping
192.168.1.143 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.1.159 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
使用ansible前准备
由于ansible是基于SSH协议。如果ansible主机与被控主机是第一次连接,使用ansible命令就会报错。就算ansible与这些主机不是第一次连接,每台主机的密码不一致也会报错。
所以在使用前,ansible主机和被管控主机之间要都基于ssh-key的免密连接。
ansible命令
ansible帮助命令
ansible-doc
:显示模块帮助命令
ansible-doc [options] [module...]
- -a :显示所有模块的文档
- -l:列出可用模块
- -s:显示指定模块的playbook片段
示例:
[root@ansible ~]# ansible-doc copy
ansible管控命令
ansible <host-pattern> [-m module_name] [-a args]
选项 | 解释 |
---|---|
- -version | 显示版本 |
-m module | 指定模块 |
-v/-vv/-vvv | 显示更详细的过程 |
- -list-hosts | 显示主机列表,可以简写为- -list |
-k | 提示连接密码,默认key验证 |
-C | 检查,只运行,不执行 |
-T | 执行命令 的超时时间,默认10s |
-u | 执行远程命令的用户 |
-b | 代替旧版的sudo切换 |
-K | 提示输入sudo |
示例:
[root@ansible ~]# ansible webservers --list
hosts (2):
192.168.1.143
192.168.1.159
[root@ansible ~]# ansible all -m ping -k
SSH password:
# 此处需要所有被控主机的密码一样
[root@ansible ~]# ansible all -m command -u ydong -b --become-user=root -K -a 'ls /root'
# 在远程主机以ydong的身份运行sudo命令,sudo指定的用户为root
host-pattern
host-pattern的表示方法
-
all
:表示所有主机 -
*
:通配符- 示例:
[root@ansible ~]# ansible web* -m ping
- 示例:
-
或关系
:hostname1:hostname2
1和2中所有的主机- 示例:
[root@ansible ~]# ansible appservers:webservers -m ping
- 示例:
-
与关系
:hostname1:&hostname2
1和2有交集的主机- 示例:
[root@ansible ~]# ansible webservers:\&appservers -m ping
- 示例:
-
非关系
:hostname1:!hostname2
在1中,却不在2中的主机- 示例:
[root@ansible ~]# ansible webservers:\!appservers -m ping
- 示例:
-
正则表达式
:首先指明~
- 示例:
[root@ansible ~]# ansible "~(app|db).*" -m ping
- 示例:
ansible在执行的时候出现以下几种颜色: