ansible是什么?
ansible是什么?
它是一个配置管理工具,也是一个自动化运维工具。
ansible能做什么?
ansible 可以帮助我们完成一些批量任务,或者完成一些需要经常重复的工作。
比如:同时在200台服务器上安装dhcp服务,并启动。
比如:将某个文件一次性拷贝到200台服务器上
比如:每当有新服务器加入工作环境时,你都啊哟为新服务器部署redis服务,也就是说你需要经常重复的完成相同的工作。
特性
1、模块化:调用特定的模块,完成特定任务
2、有Paramiko,PyYAML,Jinja2(模板语言)三个关键模块
3、支持自定义模块
4、基于Python语言实现
5、部署简单,基于python和SSH(默认已安装),agentless
6、安全,基于OpenSSH
7、’支持playbook编排任务
8、幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况
9、无需代理不依赖PKI(无需ssl)
10、可使用任何编程语言写模块
11、YAML格式,编排任务,支持丰富的数据结构
ansible 配置文件
ansible 配置文件 /etc/ansible/ansible.cfg (一般保持默认)
主机列表配置文件 /etc/ansible/hosts
库文件存放目录 /usr/share/my_modules
检查对应服务器的host_key,建议启用,取消注释
日志文件 /var/log/ansible.log
临时py命令文件存放在远程主机目录 $HOME/.ansible/tmp
本机的临时命令执行目录 $HOME/.ansible/tmp
默认并发数 forks = 5
默认sudo 用户 sudo_user = root
每次执行ansible命令是否询问ssh密码 ask_sudo_pass = True
ask_sudo_pass = True
remote_port = 22
基础配置
实验环境:一台centos7.4的主控机和2台centos6.9的受控机。
这三台IP地址依次分别如下
192.168.95.2
192.168.95.3
192.168.95.129
连接一台受控主机,以K的方式验证,如不使用 -k 功能,则不能连接
同时连接两台受控机,在IP地址后面再添加一条即可,用逗号隔开
我们发现,无论是连接一台或者多台,都要输入受控机的密码,这样做是不是很麻烦呢? 到这里就有人想到用openssl 做一个 基于key 的免密认证 ,下次登录的时候就不用再输入密码了,真的是很聪明呢!
[root@centos7 ~]#ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.95.3 [root@centos7 ~]#ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.95.129
若感觉SSH连接太慢,则更改/etc/ssh/sshd_conf 文件
ansible系列命令
ansible-doc: 显示模块帮助,相当于man
-a 显示所有模块的文档
-l, --list 列出可用模块
-s, --snippet 显示指定模块的playbook片段
示例:
ansible-doc –l 列出所有模块
ansible-doc ping 查看指定模块帮助用法
ansible-doc –s ping 查看指定模块帮助用法
ansible通过ssh实现配置管理、应用部署、任务执行等功能,建议配置ansible端能基于密钥认证的方式联系各被管理节点
ansible <host-pattern> [-m module_name] [-a args]
--version 显示版本
-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 执行远程执行的用户
-b, --become 代替旧版的sudo 切换
ansible的Host-pattern
匹配主机的列表
All :表示所有Inventory中的所有主机
ansible all –m ping
* :通配符
ansible “*” -m ping
ansible 192.168.1.* -m ping
ansible “*srvs” -m ping
或关系
ansible “websrvs:appsrvs” -m ping
ansible “192.168.1.10:192.168.1.20” -m ping
逻辑与
ansible “websrvs:&dbsrvs” –m ping
在websrvs组并且在dbsrvs组中的主机
逻辑非
ansible ‘websrvs:!dbsrvs’ –m ping
在websrvs组,但不在dbsrvs组中的主机
综合逻辑
ansible ‘websrvs:dbsrvs:&appsrvs:!ftpsrvs’ –m ping
正则表达式
ansible “websrvs:&dbsrvs” –m ping
ansible “~(web|db).*.magedu.com” –m ping
ansible 执行过程
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退出
执行状态:
绿色:执行成功并且不需要做改变的操作
黄色:执行成功并且对目标主机做变更
红色:执行失败
示例
以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 all -a 'df -h' 查看所有主机的分区利用率
ansible all -a 'removes=/etc/fstab cat /etc/fstab' 查看所有主机的/etc/fstab ,如果存在,则执行,不存在则跳过不执行
ansible all -a 'removes=/etc/fstab cat /etc/fstab' 与removes相反,如果存在则不执行,不存在则执行
ansible all -a 'chdir=/boot ls' 切换到boot文件夹 用 ls 查看
shell 模块 : 用shell 执行命令
例:ansible all -m shell -a 'echo $HOSTNAME'
ansible all -m shell -a
ansible srv -m shell -a ‘echo magedu |passwd –stdin wang’
调用bash执行命令 类似 cat /tmp/stanley.md | awk -F‘|’ ‘{print $1,$2}’ &> /tmp/example.txt 这些复杂命令,即使使用shell也可能会失败,解决办法:写到脚本时, copy到远程,执行,再把需要的结果拉回执行命令的机器
script:运行脚本
-a "/PATH/TO/SCRITP_FILE"
ansible all/websrvs(主机清单分组) -m script -a f1.sh
例:写一个脚本 ,让 主机清单里的 所有主机都运行
copy模块
从服务器复制文件到客户端
ansible srv -m copy -a "src=/root/f1.sh dest=/tmp/f2.sh owner=wang mode=600 backup=yes"
如目标存在,默认覆盖,此处指定先备份
ansible srv -m copy -a “content=‘test content
’ dest=/tmp/f1.txt” 利用内容,直接生成目标文件
例:将本机文件复制到远程主机 , 如果想删除要用 shell 模块 (-m shell)
复制文件 修改权限 和 所有者
fetch模块
从客户端取文件至服务器端,copy相反,目录可以先tar
ansible all -m etch -a 'src=/root/a.sh dest=/date/scripts'
示例: 打包/var/log 下所有日志 文件并远程抓取
ansible all -m shell -a 'tar Jcf log.tar.xz /var/log/*.log'
ansible all -m fetch -a 'src=/root/log.tar.xz dest=/date'
file 模块
设置文件属性
ansible all -m file -a 'name=/date/f3 state=touch' 创建文件
ansible all -m file -a 'name=/date/f3 state=absent' 删除文件
ansible all -m file -a 'name=/date/dir1 state=directory' 创建目录
ansible all -m file -a 'name=/date/dir1 state=absent' 删除目录
ansielb all -m file -a 'src=/etc/fstab dest /data/fstab.link state=link' 创建软链接
ansible all -m file -a 'dest /data/fstab.link state=absent' 删除软链接
ansible all -m file -a "path =/root/a.sh owner=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"
注意:
(1)host 模块不会修改/etc/hosts 文件中的主机名解析, 注意修改
(2)批量修改主机名是最好加变量,放置素有主机名一致
cron 模块
计划任务
支持时间: minute . hour , day, mouth, weekday
ansible all -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 172.16.0.1 &>/dev/null'
name=synctime" 创建任务
ansible all -m cron -a 'state=absent anme=synctime' 删除任务
示例:
创建计划任务:每周1、3、5 每分钟打印 ,任务名称:warningcron
ansible all -m cron -a 'minute=* weekday=1,3,5 job="/usr/bin/wall warning " name=warningcron'
注释cronname=waringcron 的计划任务
ansible all -m cron -a 'disabled=true job="/usr/bin/wall warning" name=warningcron'
给cronname=waringcron的计划任务去掉注释:
ansible all -m cron -a 'disabled=true job="/usr/bin/wall warning" name=warning '
创建计划任务:每5分钟同步一次服务器时间, 任务名称:sync
ansible all -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 172.16.0.1 &>/dev/null'
name=sync"
删除计划任务
ansible all -m cron -a 'state=obsent name=sync'
yum模块
管理包
示例:
yum安装vsftpd包:(默认 state=install)
ansible all -m yum -a 'name=vsftpd'
安装多个包用逗号隔开
ansible all -m yum -a 'name=vsftpd,httpd'
显示所有已安装的包
ansible all -m yum -a 'name=vsftpd list=install'
卸载vsftpd包
ansible all -m yum -a 'name=vsftpd state=removed'
安装从互联网下载的包
ansible srv(主机清单分组) -m copy -a 'src=/root/package.rpm dest=/data/package'
ansible srv -m yum -a 'name=/data/package.rpm'
更新缓存
ansible all -m yum -a 'update_cache=yes'
更新缓存同时安装dsta包
ansible all -m yum -a 'name=dstat update_cache=yes'
ansible all -m yum -a 'name=httpd state=latest' 安装
ansible all -m yum -a 'name=httpd state=absent' 删除
service模块
管理服务
ansible all -m service -a 'name=httpd state=stopped' 停止服务
ansbile all -m service -a 'name=httpd state=started' 开启服务(reloaded:重载 restarted:重启)
user 模块
管理用户
添加用户、指定uid、家目录、主组及注释
ansible all -m service -a 'name=user1 comment="test user" uid=2048 home=/app/user1 group=root'
ansible all -m user -a 'name=sysuser1 system=yes home=/app/sysuser1'
ansible all -m user -a 'name=user1 state=absent remove=yes' 删除用户及家目录等数据
添加一个nginx用户:
ansible srv -m user -a ‘name=nginx shell=/sbin/nologin system=yes home=/var/nginx groups=root,bin uid=80 comment=”nginx service”
删除nginx用户同时删除家目录:
ansible srv -m user -a ‘name=nginx state=absent remove=yes’
group模块
管理组
创建一个系统组
ansible all -m group -a "name=testgroup system=yes"
删除一个组
ansible all -m group -a "name=group11 state=absent"
创建nginx组
ansible all -m group -a 'name-nginx system=yes gid=80'
删除nginx组
ansible all -m group -a 'name=nginx state=absent'
ansible系列命令
ansible系列命令包括
ansible
ansible-doc
ansible-playbook
ansible-vault
ansible-console
ansible-galaxy
ansible-pull
ansible-doc
功能: 显示模块帮助,相当于man
格式:ansible-doc [options] [module...]
-a 显示所有模块文档
-l 列出可用模块
-s 显示制动模块的 简洁用法
示例:
ansible-doc ping 查看ping模块帮助
ansible-co -s ping 查看ping模块的简单说明
ansible-vault
功能:管理加密解密yml文件
格式:ansible-vault [create|decrypt|edit|encrypt|rekey|view]
ansible-vault encrypt hello.yml 加密yml文件
ansible-vault decrypt hello.yml 解密yum文件
ansible-vault view hello.yml 查看yml加密文件
ansible-vault edit hello.yml 编辑加密文件
ansible-vault rekey hello.yml 重新修改加密口令
ansible-vault create new.yml 创建新文件
ansible-console
功能:ansible控制台,可交互执行命令,支持tab
root@test(2)[f:10] $
执行用户@当前操作的主机组(当前组的主机数量)[f:并发数] $
设置并发数:forks n 例: forks 10
切换组:cd主机组 例: cd web
列出当前组朱姐列表:list
列出所有的内置命令:?或 help
示例
列出主机列表中所有主机
root@all (2)[f:5]$ list
切换至appsrvs组
root@all (2)[f:5]$ cd appsrvs
列出appsrvs组下所有主机
root@appsrvs (2)[f:5]$ list
例:
安装httpd服务
root@appsrvs (2)[f:5]$ yum name=httpd state=present
开启httpd服务:
root@appsrvs (2)[f:5]$ service name=httpd state=stated
ansible-galaxy
功能:连接 https://galaxy.ansible.com下载相应的roles
列出所有已安装的galaxy:
ansible-galaxy list
安装galaxy:
ansible-galaxy install geerlingguy.redis
删除galaxy:
ansible-galaxy remove geerlingguy.redis
ansbile-pull
功能:推送命令至远程,效率无限提升,对运维技术要求较高
当前应用还较少
在本节内容中,我们主要介绍了ansible的使用及一些常用模块,在下节内容中,我们将为您解读
ansible中playbook以及roles的使用