1 环境准备
主机IP192.168.199.149(主配置)
ip1:192.168.199.150
IP2:192.168.199.151
下载ansible:yum -y install epel-release
yum install ansible
2 ansilble介绍
• 模块化:调用特定的模块,完成特定的任务
•Paramiko (Python 对 ssh 的实现 ) , PyYaml , Jinja2( 模板语言 ) 三个关键模块
• 支持自定义模块,可使用任何编程语言写模块
• 基于 Python 语言实现
• 部署简单,基于 python 和 SSH( 默认已安装 ) , agentless ,无需代理不依赖 KPI (无需
SSL )
• 安全,基于 OpenSSH
• 幂等性:一个任务执行 1 遍和执行 n 遍效果一样,不因重复执行带来意外情况
• 支持 playbook 编排任务, YAML 格式,编排任务,支持丰富的数据结构
• 较强大的多层解决方案 role
Ansible工作原理:
把我们执行的命令翻译为 shell 命令,通过 openssh 拷贝到目标主
机 /root/.ansible/tmp/ 下,然后再执行,执行完成后删除 tmp 文件。
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 退出
执行状态:
绿色:执行成功并且不需要做改变的操作
黄色:执行成功并且对目标主机做变更
红色:执行失败
3 模块介绍
运行ansible前先把要目标主机的IP添加到/etc/ansible/hosts中,可以分开加,也可以添加到一个组中,模块名自己命名,执行组名则表示执行所有ip
执行ssh-keygen 把密钥传送到目标主机
ssh-copy-id 192.168.199.150
ssh-copy-id 192.168.199.151
ansible格式为 ansible -m [模块名] -a[模块] [组名]
commond模块(默认模块)
ansible -m command -a 'ls' test 分别在150,151主机上执行ls命令,并将结果显示出来
ansible -m command -a 'echo $HOSTNAME' test 打印test组的用户名
commond模块不支持正则表达式,不支持变量
shell模块
和commond类似,但是支持正则表达式
ansible all -m shell -a 'getenforce' 获取selinux状态
ansible -m shell -a "awk '/db/{print}' /opt/a.txt" test 显示目标主机/opt/a.txt中含有db的行
copy模块
复制本地主机的文件复制到远程主机,src:本地文件路径,dest:目标路径,mode:设置权限,backup:备份源文件
ansible -m copy -a "src=/root/b.txt dest=/opt/" test 把本地b.txt复制到目标主机
fetch模块
从远程主机提取文件到本地,不支持目录,可以先打包,再提取文件
file模块
创建文件,设置文件的权限
path: 要管理的文件路径 (强制添加)
recurse: 递归 , 文件夹要用递归
src: 创建硬链接 , 软链接时 , 指定源目标 , 配合 'state=link' 'state=hard' 设置软链接 , 硬链接
ansible -m file -a "path=/opt/d.txt state=touch" test 在目标主机路径下创建文件
ansible -m file -a "path=/opt/test state=directory" test 在目标主机路径下创建目录
ansible -m file -a "path=/opt/test owner=rsync mode=755" test 目标主机下修改目录的权限和属主
unarchive模块
解包解压缩
1,将 ansible 主机上的压缩包传到远程主机后解压缩至特定目录,设置 copy=yes.
2 、将远程主机上的某个压缩包解压缩到指定路径下,设置 copy=no
src : 源路径,可以是 ansible 主机上的路径,也可以是远程主机上的路径,
如果是远程主机上的路径,则需要设 置 copy = no
dest :远程主机上的目标路径
mode :设置解压缩后的文件权限
ansible websrvs -m unarchive -a 'src=foo.tgz dest=/var/lib/foo'
默认 copy 为 yes , 将本机目录文件解压到目标主机对应目录下
archive****模块
Archive :打包压缩,将远程主机目录打包
path: 指定路径 dest: 指定目标文件 format: 指定打包格式 owner: 指定所属者
mode: 设置权限
Hostname****模块
Hostname :管理主机名
Cron****模块
cron 模块主要用于添加、删除、更新操作系统的 crontab 任务计划
ansible websrvs -m unarchive -a
'src=https://example.com/example.zip dest=/data copy=no' > ansible all -m archive -a 'path=/etc/sysconfig