共计 4530 个字符,预计需要花费 12 分钟才能阅读完成。
Ansible 是什么
Ansible 简单的说是一个配置管理系统(configuration management system)。你只需要可以使用 ssh 访问你的服务器或设备就行。它也不同于其他工具,因为它使用推送的方式,而不是像 puppet 等 那样使用拉取安装 agent 的方式。你可以将代码部署到任意数量的服务器上。
Ansible 能做什么
ansible 可以帮助我们完成一些批量任务,或者完成一些需要经常重复的工作。
比如:同时在 100 台服务器上安装 nginx 服务,并在安装后启动它们。
比如:将某个文件一次性拷贝到 100 台服务器上。
比如:每当有新服务器加入工作环境时,你都要为新服务器部署某个服务,也就是说你需要经常重复的完成相同的工作。这些场景中我们都可以使用到 ansible。
Ansible 特性
模块化:调用特定的模块,完成特定任务
有 Paramiko,PyYAML,Jinja2(模板语言)三个关键模块
支持自定义模块
基于 Python 语言实现
部署简单,基于 python 和 SSH(默认已安装),agentless
安全,基于 OpenSSH
支持 playbook 编排任务
幂等性:一个任务执行 1 遍和执行 n 遍效果一样,不因重复执行带来意外情况
无需代理不依赖 PKI(无需 ssl)
可使用任何编程语言写模块
YAML 格式,编排任务,支持丰富的数据结构
较强大的多层解决方案
Ansible 架构
Ansible 工作原理
Ansible 主要组成部分功能说明
PLAYBOOKS:
任务剧本(任务集),编排定义 Ansible 任务集的配置文件,由 Ansible 顺序依次执行,通常是 JSON 格式的 YML 文件
INVENTORY:
Ansible 管理主机的清单 /etc/anaible/hosts
MODULES:
Ansible 执行命令的功能模块,多数为内置的核心模块,也可自定义,ansible-doc –l 可查看模块
PLUGINS:
模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用
API:
供第三方程序调用的应用程序编程接口
ANSIBLE:
组合 INVENTORY、API、MODULES、PLUGINS 的绿框,可以理解为是 ansible 命令工具,其为核心执行工具
注意事项
执行 ansible 的主机一般称为主控端,中控,master 或堡垒机
主控端 Python 版本需要 2.6 或以上
被控端 Python 版本小于 2.4 需要安装 python-simplejson
被控端如开启 SELinux 需要安装 libselinux-python
windows 不能做为主控端
安装 Ansible
以 CentOS 为例
安装环境查看
安装
yum -y install ansible
查看版本
Ansible 功能详解
配置文件
配置文件或指令 描述
/etc/ansible/ansible.cfg 主配置文件,配置 ansible 工作特性
/etc/ansible/hosts 主机清单
/etc/ansible/roles/ 存放角色的目录
/usr/bin/ansible 主程序,临时命令执行工具
/usr/bin/ansible-doc 查看配置文档,模块功能查看工具
/usr/bin/ansible-galaxy 下载 / 上传优秀代码或 Roles 模块的官网平台
/usr/bin/ansible-playbook 定制自动化任务,编排剧本工具
/usr/bin/ansible-pull 远程执行命令的工具
/usr/bin/ansible-vault 文件加密工具
/usr/bin/ansible-console 基于 Console 界面与用户交互的执行工具
Ansible 配置文件
Ansible 配置文件 /etc/ansible/ansible.cfg(一般保持默认)
[defaults]
#inventory = /etc/ansible/hosts # 主机列表配置文件
#library = /usr/share/my_modules/ # 库文件存放目录
#remote_tmp = $HOME/.ansible/tmp #临时 py 命令文件存放在远程主机目录
#local_tmp = $HOME/.ansible/tmp # 本机的临时命令执行目录
#forks = 5 # 默认并发数
#sudo_user = root # 默认 sudo 用户
#ask_sudo_pass = True #每次执行 ansible 命令是否询问 ssh 密码
#ask_pass = True #连接时提示输入 ssh 密码
#remote_port = 22 #远程主机的默认端口,生产中这个端口应该会不同
#log_path = /var/log/ansible.log #日志
#host_key_checking = False # 检查对应服务器的 host_key,建议取消注释。也就是不会弹出
试验规划,两台主机 192.168.56.11 作为主控端,192.168.56.12 被控端
修改配置文件 /etc/ansible/hosts
[webservers]
192.168.56.11
192.168.56.12
webserves 代表一个组,下面有两台主机
执行命令
ansible 192.168.56.11 -m ping
执行失败
非常抱歉哦,竟然是失败的。为什么呢?Ansible 是基于 ssh 进行工作的,那么当 ssh 一台远程主要的时候,是不是需要输入密码呢?可是这一条指令并没有提示输入口令呢
加参数 - k 输入密码
设置免密码登录(参考如下)
—————————- 参考如下 —————————-
两台 Linux 主机需要从其中一台 ssh 至另外一台需要手动输入密码,通过以下设置免密码登录
生成秘钥
ssh-keygen -t rsa
会在文件夹 /root/.ssh 下面生产公钥和私钥
把秘钥复制至需要免密登录的主机,第一次拷贝需要输入一次密码
ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.1.3.4
会在远程主机的文件夹 /root/.ssh 下面自动生成文件 authorized_keys 文件内容为公钥 id_ras.pub 一样
也可以直接把公钥复制编辑需要远程登录的主机的 /root/.ssh/authorized_keys 文件
验证能否免密登录
ssh 10.1.3.4
—————————- 到此位置 —————————-
就不会提示需要输入密码了
Ansible 常用命令语法
ansible <host-pattern> [-m module_name] [options]
指令 匹配规则的主机清单 -m 模块名 选项
–version 显示版本
-a 模块参数(如果有)
-m module 指定模块,默认为 command
-v 详细过程 –vv -vvv 更详细
–list-hosts 显示主机列表,可简写 –list
-k, –ask-pass 提示连接密码,默认 Key 验证
-K,–ask-become-pass 提示使用 sudo 密码
-C, –check 检查,并不执行
-T, –timeout=TIMEOUT 执行命令的超时时间,默认 10s
-u, –user=REMOTE_USER 执行远程执行的用户
-U,SUDO_USER, –sudo-user 指定 sudu 用户
-b, –become 代替旧版的 sudo 切换
ansible-doc: 显示模块帮助
ansible-doc [options] [module…]
-a 显示所有模块的文档
-l, –list 列出可用模块
-s, –snippet 显示指定模块的简要说明
例子:#ansible-doc ping
由于 ansible 的模块有 1378 个(2.4.2.0), 并且一直在持续更新。因此,这个指令必须要掌握的。
#ansible-doc -l |wc -l
1378
Ansible 的命令执行过程以 ansible all -m command -a ‘ls -l /’ -vvv 这条命令为例,根据显示的信息时行解读
1. 加载自己的配置文件,默认 /etc/ansible/ansible.cfg
Using /etc/ansible/ansible.cfg as config file
2. 匹配主机清单
Parsed /etc/ansible/hosts inventory source with ini plugin
3. 加载指令对应的模块文件,如 command,生成.py 的文件到本机的临时目录,这个目录就是在 /etc/ansible/ansible.cfg 定义的
Using module file /usr/lib/python2.7/site-packages/ansible/modules/commands/command.py
PUT /tmp/tmp4JvsLH TO /root/.ansible/tmp/ansible-tmp-1517301292.6-155771303493861/command.py
4. 通过 ansible 将模块或命令生成对应的临时 py 文件,并将该文件传输至远程服务器的对应执行用户 $HOME/.ansible/tmp/ansible-tmp- 数字 /XXX.PY 文件,
这个目录就是在 /etc/ansible/ansible.cfg 定义的
(umask 77 && mkdir -p “` echo /root/.ansible/tmp/ansible-tmp-1517301292.6-155771303493861 `” ….)
sftp> put /tmp/tmp4JvsLH /root/.ansible/tmp/ansible-tmp-1517301292.6-155771303493861/command.py\n’
5. 给文件 +x 权限
‘chmod u+x /root/.ansible/tmp/ansible-tmp-1517301292.6-155771303493861/ /root/.ansible/tmp/ansible-tmp-1517301292.6-155771303493861/command.py && sleep 0’
6. 执行并返回结果
‘/usr/bin/python /root/.ansible/tmp/ansible-tmp-1517301292.6-155771303493861/command.py;
7. 删除临时 py 文件,sleep 0 退出
rm -rf “/root/.ansible/tmp/ansible-tmp-1517301292.6-155771303493861/” > /dev/null 2>&1 && sleep 0
8. 断开远程主机连接
‘Shared connection to 7-db-3.hunk.tech closed.\r\n’)
执行结果状态
绿色:执行成功并且不需要做改变的操作
×××:执行成功并且对目标主机做变更
红色:执行失败
: