常用自动化运维工具
Ansible:python,Agentless,中小型应用环境
saltstack:python,一般需部署agent,执行效率更高
puppet:ruby,功能强大,配置复杂,重型适合大型环境
fabric:python,agentless Chef:ruby,国内应用少 Cfengine func
Ansible 主要组成部分
Ansible命令执行来源:1USER 2USER->Ansible Playbook->Ansible 3CMDB 4PUBLIC/PRIVATE CLOUD
Ansible-playbook(剧本)执行过程:
将已有编排好的任务集写入Ansible-Playbook
通过ansible-playbook命令分拆任务集至逐条ansible命令,按预定规则逐条执行
ansible主要操作对象:1、hosts主机 2、NETWORKING网络设备
相关文件
配置文件
/etc/ansible/ansible.cfg 主配置文件。配置ansible工作特性
/etc/ansible/hosts 主机清单
/etc/ansible/roles 存放角色的目录
程序
/usr/bin/ansible 主程序,临时命令执行工具
/usr/bin/ansible-doc 查看配置文档,模块功能查看工具
/usr/bin/ansible-galaxy 下载/上传优秀代码或roles模块的官网平台
/usr/bing/ansible-playbook 定制自动化任务,编排工具
/usr/bin/ansible-pull 远程执行命令的工具
/usr/bin/ansible-vault 文件加密工具
/usr/bin/ansible-console 基于console界面与用户交互的执行工具
主机清单invenstory
/etc/ansible/hosts文件格式
inventory文件遵循INI文件风格,中括号中的字符为组名,可以将同一个主机同时归并到多个不同的组中;此外如若目标主机使用非默认ssh端口,还可以在主机名之后使用冒号加端口号来标明
ntp.magedu.com
[webservers]
www1.magedu.com:2222
www2.magedu.com
[dbservers]
db1.magedu.com
db2.magedu.com
db3.magedu.com
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
#remote_port = 22
#host_key_checking =False # 检查对应服务器的host_key,建议取消注释
#log_path=/var/log/ansible.log #日志文件
ansible系列命令
Ansible系列命令:
ansible ansible-doc ansible-playbook ansible-vault snsible-console ansible-galaxy ansible-pull
ansible-doc:显示模块帮助
ansible-doc[options][module...] -a 所有模块文档 -l,--list 可用模块 -s 显示指定模块playbook片段
ansible通过ssh实现配置管理、应用部署、任务执行等功能,建议配置ansible端能基于密钥认证的方式联系各个被管理站点
ansible <host-pattern> [-m module_name] [-a args]
--version 显示版本
-m module 指定模块,默认为command
-v 详细过程 -vv -vvv更详细
--list-hosts 显示主机列表,可见写--list
-k, --ask-pass 提示输入ssh连接密码,默认Key验证
-K, --ask-become-pass 提示输入sudo时的口令
-C, --check 检查,并不执行
-T, --timeout=TIMEOUT 执行命令的超市时间,默认10s
-u, --user=REMOUTE_USER 执行远程执行的用户
-b, --become 代替旧版的sudo 切换
ansible 192.168.0.31 -u zhimai -k -a 'ls /var/'
ssh-keygen创建公钥-私钥对
-t: 密钥类型, 可以选择 dsa | ecdsa | ed25519 | rsa;
-f: 密钥目录位置, 默认为当前用户home路径下的.ssh隐藏目录, 也就是~/.ssh/
, 同时默认密钥文件名以id_rsa
开头. 如果是root用户, 则在/root/.ssh/id_rsa
, 若为其他用户, 则在/home/username/.ssh/id_rsa
;
-C: 指定此密钥的备注信息, 需要配置多个免密登录时, 建议携带;
-N: 指定此密钥对的密码, 如果指定此参数, 则命令执行过程中就不会出现交互确认密码的信息了.
ssh-copy-id把A的公钥发送给B
ssh-copy-id root@172.16.22.132
# 指定要拷贝的本地文件、远程主机的IP+用户名+端口号:
ssh-copy-id -i ~/.ssh/id_rsa.pub -p 22 root@172.16.22.132
ansible的Host-pattern 匹配主机的列表
All:表示所有Inventory中的所有主机 ansible all -m ping
* 通配符
ansible “*” -m ping ansible 192.168.1.* -m ping ansible "srvs" -m ping
逻辑或
ansible "webserver:appserver" -m ping ansible “192.168.1.10:192.168.1.20” -m ping
逻辑与
ansible “websrvs:&dbsrvs” -m ping
在websrvs 组并且在dbsrs组中的主机
逻辑非
ansible ‘websrvs:!dbsrvs’ -m ping
在websrvs组,但不再dbsrvs组中的主机
注意:此处为单引号
综合逻辑
ansible ‘websrvs:dbsrvs:&appsrvs’ -m ping
正则表达式
ansible “~(web|db).*\.magedu\.com ” -m ping
ansible命令执行过程
1、加载自己的配置文件 默认/etc/ansible/ansible.cfg
2、加载自己对应的模块文件,如command
3、通过ansible 将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件
4、给文件+x执行
5、执行并返回结果
6、删除临时py文件,sleep 0 退出
执行状态:
绿色:执行成功并且不需要做改变的操作
黄色:执行成功并且需要对目标主机做变更
红色:执行失败
ansible使用示例
示例 以wang用户执行ping存活检测
ansible all -m ping -u wang -k
以wang sudo 至root 执行ping存活检测
ansible all -m ping -u wang -b -k
以wang sudo至mage用户执行ping存活检测
ansible all -m ping -u wang -b -k --become-user mage
以wang sudo 至root 用户执行ls
ansible all -m command -u wang --become-user=root -a ‘ls /root’ -b -k -K
Ansible常用模块
Command:在远程主机执行命令,默认模块,可忽略-m选项
ansible srvs -m command -a ‘service vsftpd start’
ansible srvs -m command -a ‘echo magedu|passwd --stdin wang’不成功
此命令不支持4VARNAME<>|;&等,用shell模块实现
Shell:和command相似,用shell执行命令
ansible srv -m shell -a ‘echo magedu|passwd --stdin wang’
调用bash执行命令 类似 cat/tmp/stanley。md | awk -F‘|' {pring $1 ,$2}'>/tmp/exanple.txt 这些复杂命令,即使使用shell也可能会失败,解决办法:写道脚本时,copy到元辰,执行,再把需要的结果拉回执行命令的机器
Script:运行脚本
-a “/PATH/TO/SCROPT_FILE”
ansible websvrs -m script -a f1.sh
Copy:从服务器复制文件到客户端,
ansible scr -m copy -a "scr=/root/f1.sh dest=/tmp/f2.sh backup=yes"
如果目标存在,默认覆盖,此处指定先备份
ansible scr -m copy -a "content=‘test content\n' dest=/tmp/f1.txt“
利用内容直接生成目标文件
Fetch:从客户端取文件至服务器端,copy相反,目录可先tar
ansible srv -m fetch -a ’src=/root/a.sh dest=/data/scripts‘
File:设置文件属性
ansible srv -m file -a ”path=/root/a.sh ower=wang mode=755“ ansible web -m file -a ’src=/app/testfile dest=/app/testfile-link state=link‘
Hostname:管理主机名
ansible node1-m hostname -a “name=websrv ”
Cron:计划任务
支持时间:minute,hour,day,month,weekday
ansible all -m cron -a 'minute=* weekday=1,3,5 job="/usr/bin/wall FBIwarning" name=warningcron'
ansible all -m cron -a 'disable-true job="/usr/bin/wall FBIwarning" name=warningcron' #禁用
ansible all -m cron -a 'job="/usr/bin/wall FBIwarning" name=warningcron state=absent' #删除
Yum:管理包
ansible 192.168.0.31 -m yum -a 'name=vsftpd,memcached state=absent disable_gpg_check=yes' #卸载
ansible 192.168.0.31 -m yum -a 'name=vsftpd,memcached' #安装
Service:管理服务
ansible 192.168.0.31 -m service -a 'name=nginx state=stopped enabled=yes'
User:管理用户
ansible srv -m user -a ‘name=user1 comment=“test user” uid=2048 home=/app/user1 group=root’ ansible srv -m user -a ‘name=use system=yes home=/app/sysuser’ ansible srv -m user -a ‘name=use state=absent remove=yes‘
Group:管理组
ansible srv -m group -a ‘name=testgroup system=yes ’
ansible srv -m group -a ‘name=testgroup state=absent ’