写在前面:啧啧,看了点关于ansibled的几本书,看了几天还是一脸懵逼,干脆找了点视频看,看了看,哈哈我果然更适合通俗的视频。
下面按着视频的知识点来。就是比较乱了。
1 一个小例子
ansible ip地址 -m ping -k
这是个简单的例子,其中ip地址要加入/etc/ansible/hosts 里,否则会报错。-k 是输入密码的意思。一般人不会这么用,这就是个例子。-m是模块的意思。
2 分组
可以在/etc/ansible/hosts添加,因为目前都是ad-hoc嘛,所以不用在这里先暂时在这里添加。如果是playbook的话就直接建立个文件。
里面的写法还挺多的。
[webservers] # 这是分组名
ip地址
ip地址
3 配置文件
/etc/ansible/ansible.cfg 。
一般把host_key_checking=False 检查对应服务器的host_key,建议取消注释。
log_path,记录日志,最好也打开
4 ansible-doc
显示帮助模块, ansible-doc ping
5 ansible 命令
ansible <hostname> [-m mdule_name] [-a args]
--version 显示版本
-m module 加模块名
-v 详细过程, -vv 更详细, -vvv更更详细
--list 主机列表
-k 输入sudo密码
-T 执行命令的超时时间
-u 指定执行命令的用户
-b 相当于sudo
ansible all --list # all 全部主机
ansible test --list # test分组
ansible all -u 用户 -k -m command -a 'ls' # 可以不加-m command 因为默认就是它
当加-b 参数时,以sudo权限使用,要每次都输入密码。
给用户加sudo权限
visudo # 看相关设置,里面有个wheel组
usermod -ad wheel 用户 # 把这个用户加到这个组里
sudo时不需要输入密码设置
visudo 找到%wheel All=(All) NOPASSWD:ALL 把前面的注释拿掉
6 添加公钥
每次执行ansible都要输入密码,添加公钥:
ssh-keygen # 然后按提示来,生成公钥
ssh-copy-id 主机的ip地址(应该就是本机的ip)
# 172.24.20.165 本机ip
然后执行ansible就不用输入密码了。
7 通配符和逻辑关系
其实尽量用单引号,双引号有的命令的可能会报错。所以尽量用单引号。
ansible "*srvs" -m ping # 大概就是这样
或逻辑
ansible '分组1:分组2' -m ping
其实不加引号也可以,执行分组1和分组2里的ip地址,:的意思就是和的意思。
且逻辑
ansible "分组1:&分组2" -m ping
意思是在分组1且在分组2里的所有主机。
非逻辑
ansible '分组1:!分组2' -m ping
意思是在分组1里但不在分组2里的所有主机。
正则
ansible '~(web|db).*' ...
正则必须是~开头的。
ansible执行过程
- 加载配置文件,默认/etc/ansible/ansible.cfg
- 加载对应模块
- 通过ansible将模块或命令生成对应的py临时文件,将该文件传输到远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/xxx.py
- 更文件+x执行
- 返回执行结果
- 删除临时的py文件,sleep退出
执行状态:
绿色:成功,不做改变的操作
黄色:发生改变的操作
红色:执行错误
下面BB下常用模块
Command模块
removes 文件已经存在,执行
creates 文件存在则不执行
chdir 切换目录
等等
ansible-doc command # 查看关于command的帮助文档
ansible all -a 'removes=/etc/xx cat /etc/xx' # 文件存在则执行,不存在不执行
ansible all -a 'creates=......' # 文件存在,则不执行
ansible all -a 'chdir=xx ls' # 切换工作目录
但是command不支持$变量,<,>,| ,&等特殊符号,用shell模块就好了。
shell 模块
ansible srv -m shell -a 'echo xx | xx' # 可移执行稍微复杂的命令
但是如果命令太过复杂的话,可能会执行失败,所以可以行进shell脚本里,在通过copy模块copy到各个主机中,然后在执行scropt模块。
所以一般command模块能执行shell模块都可以执行。
ansible all -m shell -a 'echo $Home' # 双引号会失败,所以要用单引号。
script 模块
在各个主机执行脚本。
ansible xx -m script -a f1.sh
ansible xx -m script -a f1.sh --指定参数 参数值
copy模块
src 是源文件路径
dest 是目标路径
mode 是指定属性
owner 指定 拥有者
backcup 覆盖是备份
ansible all -m copy -a 'src=xx dest=xx backup=yes mode=777 ower=xxx'
Fetch 模块
单个文件,不能是目录,和copy相反,是从各个主机拿取文件。
如果是多文件或者是目录,可以先tar下。
ansible srv -m fetch -a 'src=xx dest=xx' # 和copy一个道理
File 模块
state 的参数
touch 建立个新的空文
directory 建立文件夹
absent 删除文件或者文件夹
link 软链接
ansible all -m file -a 'name=/data/fs state=touch' # 建立个空文件
ansible all -m file -a 'src=/etc/xx dest=/xx.link state=link' # 建立软连接
ansible all -m file -a 'dest=/xx/xx.link state=absent' # 删除软连接
crom 模块
支持时间:minute,hour,day,month,weekday
添加定时任务
name是这个定时任务的名字,叫啥无所谓了
ansible all -m cron -a 'minute=* job="/usr/bin/wall fuck off" name=test'
删除定时任务
ansible srv -m cron -a 'state=absent name=xxx'
给计划任务加注释
还必须指定job,要不不行
ansible all -m cron -a 'disabled=true job=xxx name=xxx'
disbaled为no false就把注释拿掉了
Yum 管理包
state
absent 为删除
removed 也为删除
state 为 latest 为安装,安装最新的,也可以文档,看具体参数。
而且不指定state参数,默认为安装
ansible srv -m yum -a 'name=httpd state=latest' # 安装模块
ansible srv -m yum -a 'name=httpd,xx' # 安装多个模块,可以不指定state
查看安装的模块
ansible all -m yum -a 'list=installed'
安装本地包
先copy模块,把安装包推到多个主机上。
ansible all -m yum -a 'name=路径或者文件'
ansible all -m yum -a 'name=xx update_cache=yes' # 更新缓存
service模块
state
stopped 停止服务
started 开始服务
reloaded 重新加载服务
restarted 重新启动
ansible srv -m service -a 'name=httpd state=stopped enabled=yes' # 加这个是自启动
User模块
创建模块
ansible srv -m user -a 'name=user1 comment="这是注释内容" uid=xx home=xx group=xxx'
删除模块
ansible srv -m user -a 'name=usr1 state=abset remove=yes' # 删除用户和它的的家目录数据,删除家目录参数是remove
group模块
absible web -m group -a 'name=nginx system=yes gid=80'