目录
或关系 #ansible "webservers:appservers" -m ping
逻辑与 #ansible "webservers:&dbservers" -m ping
逻辑非 #ansible 'all:!dbservers:!webservers' -m ping 有!号必须用单信号
综合逻辑 #ansible 'webservers:dbservers:&appservers:!ftpsrvs' -m ping
command 系统默认模块 允许后面加linux命令 -v越多越详细4顶
常用自动化运维工具
- Ansible:python,Agentless,中小型应用环境
- Saltstack:python,一般需部署agent,执行效率更高
- Puppet:ruby, 功能强大,配置复杂,重型,适合大型环境
- Fabric:python,agentless
- Chef:ruby,国内应用少
- Cfengine
- func
Ansible 功能
- 批量执行远程命令,可以对远程的多台主机同时进行命令的执行
- 批量安装和配置软件服务,可以对远程的多台主机进行自动化的方式配置和管理各种服务
- 编排高级的企业级复杂的IT架构任务, Ansible的Playbook和role可以轻松实现大型的IT复杂架构
- 提供自动化运维工具的开发API, 有很多运维工具,如jumpserver就是基于 ansible 实现自动化管理功能
Ansible 特点
优点
- 功能丰富的模块:提供了多达数千个的各种功能的模块,完成特定任务只需调用特定模块即可,还支
- 持自定义模块,可使用任何编程语言写模块
- 使用和部署简单: 无需安装专用代理软件,基于python和SSH(默认已安装)实现
- 安全: 基于OpenSSH实现安全通讯无需专用协议
- 幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况,此特性和模块有关
- 支持playbook编排任务,YAML格式,编排任务,支持丰富的数据结构
- 较强大的多层解决方案 Role
- Python语言实现, 基于Paramiko(python对ssh的实现),PyYAML,Jinja2(模板语言)三个关键模块
- 属于红帽(IBM)公司产品,背景强大,未来发展前景光明
缺点
- 如果管理的主机较多时,执行效率不如saltstack高
- 当前还不支持像MySQL数据库一样的事务回滚
Ansible 架构
组合INVENTORY、API、MODULES、PLUGINS的绿框,为ansible命令工具,其为核心执行工具
- INVENTORY:Ansible管理主机的清单文件,默认为 /etc/ansible/hosts
- MODULES:Ansible执行命令的功能模块,多数为内置核心模块,也可自定义
- PLUGINS:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用
- API:供第三方程序调用的应用程序编程接口
Ansible 命令执行来源
- USER 普通用户,即SYSTEM ADMINISTRATOR
- PLAYBOOKS:任务剧本(任务集),编排定义Ansible任务集的配置文件,由Ansible顺序依次执
- 行,通常是JSON格式的YML文件
- CMDB(配置管理数据库) API 调用
- PUBLIC/PRIVATE CLOUD API调用
- USER-> Ansible Playbook -> Ansibile
ansible 的执行过程及介绍
- 加载自己的配置文件,默认/etc/ansible/ansible.cfg
- 查找主机清单中对应的主机或主机组
- 加载自己对应的模块文件,如:command
- 通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户 Python文件
- $HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件
- 给文件+x执行
- 删除临时py文件,退出
- 可以加-v最多四 看的更详细
颜色分类
黄色:成功执行并伴随着状态的改变
绿色:成功执行并且没有发生状态的改变
红色: 执行失败
配置文件
ansible --version 可以看到主机清单文件的地方,以及版本型号等
注意事项
- 执行ansible的主机一般称为管理端, 主控端,中控,master或堡垒机
- 主控端Python版本需要2.6或以上
- 被控端Python版本小于2.4,需要安装python-simplejson
- 被控端如开启SELinux需要安装libselinux-python
- windows 不能做为主控端,只能做为被控制端
Ansible 安装和主客实验
[root@ubuntu2004 ~]#apt install ansible -y #下载安装
100为管理端
[root@ubuntu2004 ~]#vim /etc/ansible/ansible.cfg #主机清单文件
[root@ubuntu2004 ~]#vim /etc/ansible/hosts #在最下面加进去,就是你的客户端
生产中环境太多的话可以用Excet(WPS表格) 拉出来导进去
[webservers]
10.0.0.101
10.0.0.102[appservers]
10.0.0.[7:8]
10.0.0.101
ssh-keygen 生成本机密钥
[root@ubuntu2004 ~]#vim ssh_key.sh #把这个执行下 在执行下面脚本用来key链接认证
#!/bin/bash
#
#********************************************************************
#Author: wangxiaochun
#QQ: 29308620
#Date: 2022-09-27
#FileName: ssh_key.sh
#URL: http://www.wangxiaochun.com
#Description: The test script
#Copyright (C): 2022 All rights reserved
#********************************************************************
IPLIST="
10.0.0.8
10.0.0.7
10.0.0.101
10.0.0.102"
#rpm -q sshpass &> /dev/null || yum -y install sshpass
[ -f /root/.ssh/id_rsa ] || ssh-keygen -f /root/.ssh/id_rsa -P ''
export SSHPASS=123456
for IP in $IPLIST;do
{ sshpass -e ssh-copy-id -o StrictHostKeyChecking=no $IP; } &
done
wait
[root@ubuntu2004 ~]#ssh 10.0.0.8
Last login: Tue Sep 27 09:32:26 2022 from 10.0.0.1
[root@rocky8 ~]#exit
logout
Connection to 10.0.0.8 closed.[root@ubuntu2004 ~]#ansible all --list-hosts #查看全部链接
hosts (4):
10.0.0.101
10.0.0.102
10.0.0.7
10.0.0.8
[root@ubuntu2004 ~]#ansible appservers --list-hosts #查看组链接
hosts (3):
10.0.0.7
10.0.0.8
10.0.0.101
ansible-doc -l 查看所有的模块列表
ansible-doc -l |grep mysql 也可以这搜索你想要的模块
nsible-doc nginx_status_info 详细查看模块作用
nsible-doc -s nginx_status_info 简要查看模块作用
ansible
Ansible Ad-Hoc 的执行方式的主要工具就是 ansible
特点: 一次性的执行,不会保存执行命令信息,只适合临时性或测试性的任务
ansible 命令用法
格式:
ansible <host-pattern> [-m module_name] [-a args]
选项说明:
--version #显示版本
-m module #指定模块,默认为command
-v #详细过程 -vv -vvv更详细
--list-hosts #显示主机列表,可简写 --list
-C, --check #检查,并不执行
-T, --timeout=TIMEOUT #执行命令的超时时间,默认10s
-k, --ask-pass #提示输入ssh连接密码,默认Key验证
-u, --user=REMOTE_USER #执行远程执行的用户,默认root
-b, --become #代替旧版的sudo实现通过sudo机制实现提升权限
--become-user=USERNAME #指定sudo的runas用户,默认为root
-K, --ask-become-pass #提示输入sudo时的口令
-f FORKS, --forks FORKS #指定并发同时执行ansible任务的主机数
-i INVENTORY, --inventory INVENTORY #指定主机清单文件
测试 用密码验证链接只有一次机会
#以wang用户执行ping存活检测
ansible all -m ping -u wang -k
#以wang sudo至root执行ping存活检测
ansible all -m ping -u wang -k -b
#以wang sudo至mage用户执行ping存活检测
ansible all -m ping -u wang -k -b --become-user=mage
#以wang sudo至root用户执行ls
ansible all -m command -u wang -a 'ls /root' -b --become-user=root -k -K
范例: 并发执行控制
#分别执行下面两条命令观察结果
[root@ansible ~]#ansible all -a 'sleep 5' -f1 #并发执行一台 可以再配置文件里forks更改
[root@ansible ~]#ansible all -a 'sleep 5' -f10 #并发执行10台 默认·为·5
sudo授权, 切换不需要输密码
[root@rocky8 ~]#vim /etc/sudoers
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
wang ALL=(ALL) NOPASSWD: ALL
## Allows members of the 'sys' group to run networking, software,
## service management apps and more.
# %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS
## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
都支持
*:通配符
或关系 #ansible "webservers:appservers" -m ping 有1也有去2
逻辑与 #ansible "webservers:&dbservers" -m ping 同时有
逻辑非 #ansible 'dbservers:!webservers' -m ping 有!号必须用单信号
就是只属于dbservers的文件别的里面没有
综合逻辑 #ansible 'webservers:dbservers:&appservers:!ftpsrvs' -m ping
正则表达式
ansible "webservers:dbservers" -m ping
ansible "~(web|db).*\.magedu\.com" -m ping
案例
[root@ubuntu2004 ~]#ansible "10.0.0.*" -m ping
10.0.0.8 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
10.0.0.7 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
相关命令都是以python为执行的。第一步就是把python程序命令拷到远程主机。在上面执行,执行完自己删除 在隐藏文件夹 ls -a .ansible/tmp/下
command 系统默认模块 允许后面加linux命令 没幂等性最好别用
功能:在远程主机执行命令,此为默认模块,可忽略 -m 选项
注意:此命令不支持 $VARNAME < > | ; & 等,可以用shell模块实现
注意:此模块不具有幂等性
linux命令仅支持单个
chdir=dir #执行命令前,先切换至目录dir
creates=file #当file不存在时才会执行
removes=file #当file存在时才会执行
[root@ubuntu2004 ~]#ansible all -a 'pwd' #-a 后面加命令 command默认可不写
10.0.0.7 | CHANGED | rc=0 >>
/root
10.0.0.8 | CHANGED | rc=0 >>
/root
10.0.0.102 | CHANGED | rc=0 >>
/root
10.0.0.101 | CHANGED | rc=0 >>
/root
[root@ubuntu2004 ~]#ansible webservers -a 'chdir=/tmp pwd' #chdir(改文件夹)改到tmp下执行 不能cd或短路与
10.0.0.102 | CHANGED | rc=0 >>
/tmp
10.0.0.101 | CHANGED | rc=0 >>
/tmp
creates判断文件是否存在,存在不执行, removes相反
- ansible webservers -a 'creates=/etc/hosts pwd' 不执行
- ansible webservers -a 'removes=/etc/hosts pwd' 执行
shell #就可以支持等多个执行之类的了 迫不得已可以用(不幂等)
不修改默认注释,手动-m ,修改完则是默认
[root@ubuntu2004 ~]#ansible webservers -m shell -a 'chdir=/tmp pwd
[root@ubuntu2004 ~]#ansible webservers -m shell -a 'echo hehe:123456|chpasswd' 默认
shell:
cmd: rpm -qa nginx | wc -l #cmd输出命令
vim /etc/ansible/ansible.cfg #改后就是默认shell了
#log_path = /var/log/ansible.log
# default module name for /usr/bin/ansible
module_name = shell #把注释的这行去掉注释,给成shell# use this shell for commands executed under sudo
114,20 22%
- 绿色:执行成功并且对目标主机不需要做改变的操作
- 黄色:执行成功并且对目标主机做变更
- 红色:执行失败
ansible-console 集体交互式执行命令
提示符格式
执行用户@当前操作的主机组 (当前组的主机数量)[f:并发数]$
root@ansible ~]#ansible-console 连进来
Welcome to the ansible console.
Type help or ? to list commands.
root@all (3)[f:5]$ ping ping所有
10.0.0.7 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
10.0.0.6 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
10.0.0.8 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
root@all (3)[f:5]$ list 查看
10.0.0.8
10.0.0.7
10.0.0.6root@all (3)[f:5]$ cd webservers 切换
root@webservers (2)[f:5]$ list
10.0.0.7
10.0.0.8
root@webservers (2)[f:5]$ forks 10 切换10并发
root@webservers (2)[f:10]$ cd appservers
root@appservers (2)[f:5]$ yum name=httpd state=present
root@appservers (2)[f:5]$ service name=httpd state=started