## ansible
在远程主机上批量执行命令或者脚本的一个工具
python2.7
puppet
saltsatck
管控机
被控机
### 安装
```shell
#下载wget
yum install -y wget
#将epel源下载到本地
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
#安装ansible
yum install -y ansible
```
### ansible 命令格式
Usage: ansible <host-pattern> [options]
-a MODULE_ARGS, #模块参数
-C, --check # 干跑,白跑
-f FORKS, --forks=FORKS #指定并发,默认5个
--list-hosts #列出主机
-m MODULE_NAME # 模块名称
--syntax-check #检查语法
-k #密码
ping走的协议 ICMP
```SHELL
rpm -ql ansible|more # 查看ansible生成的文件
/etc/ansible
/etc/ansible/ansible.cfg #配置文件
/etc/ansible/hosts
/etc/ansible/roles #空文件夹
```
使用公钥私钥连接机器
#ssh-copy-id root@192.168.133.134 用户名和要连接的机器id
copy 给了公钥
#ansible 192.168.133.135 -m ping 连接
#ssh root@192.168.133.135 进入到这个ip主机
ansible 底层是通过ssh实现的
```
## www[001:006].example.com 代表 www001-www006(包含)
```
### ansible的第一个命令
```
ansible 192.168.226.101 -m ping #单独机器的ping
ansible 192.168.226.101,192.168.226.102 -m ping #多个机器的ping
ansible all -m ping #全部机器
ansible web -m ping #单个的组
ansible web,db -m ping #多个组的并集
ansible 'web:&db' -m ping #多个组的交集
ansible 'web:!db' -m ping #多个组的差集,在前面但是不在后面
```
### host-pattern的格式
- 单个的ip地址
- 多个的ip地址,用,分割
- 单个组
- 多个组
- 并集
- web,db
- ‘web:db’
- 交集 ‘web:&db’
- 差集 ‘web:!db’
- 全部 all表示
### ansible-doc 命令格式 查看模块帮助信息
ansible-doc [-l|-F|-s] [options] [-t <plugin type> ] [plugin]
-j #以json的方式返回数据
-l, --list #列出所有的模块
-s, --snippet #以片段式显示模块信息
#直接查看完整信息
模块部分
command
这个模块可以直接在远程主机上执行命令,并将结果返回本主机。
ansible web -m command -a "pwd" ansible web -m command -a "ls" ansible web -m command -a "chdir=/tmp pwd" #切换目录并执行命令 ansible web -m command -a "creates=/tmp pwd" #因为tmp目录存在,pwd不会执行
ansible web -m command -a "creates=/tmp2 pwd" #因为tmp2不存在,pwd执行 (creates,只判断存在不存在)
ansible web -m command -a "removes=/tmp2 pwd"
#因为tmp2不存在,pwd不执行
ansible web -m command -a "removes=/tmp pwd" #因为tmp目录存在,pwd会执行
echo "1234" |passwd --stdin alex #设置用户的密码
shell
shell模块可以在远程主机上调用shell解释器运行命令,支持shell的各种功能,例如管道等。
ansible web -m shell -a "echo '1234' |passwd --stdin alex" ansible web -m shell -a "chdir=/tmp pwd" shabang ansible 192.168.226.101 -m shell -a "bash a.sh" #执行shell脚本 ansible 192.168.226.101 -m shell -a "/root/a.sh" # 执行shell脚本,文件要有执行的权限 ansible 192.168.226.101 -m shell -a "/root/a.py" #执行Python文件
script
该模块用于将本机的脚本在被管理端的机器上运行。
该模块直接指定脚本的路径即可
ansible db -m script -a "/root/a.sh" #执行本地的文件,管控机的文件 ansible db -m script -a "creates=/root/a.sh /root/a.sh" # 判断被控机上的文件是否存在,如果不存在,就执行,如果存在,就跳过 ansible db -m script -a "creates=/tmp /root/a.sh" #判断被控机上的文件
copy
这个模块用于将文件复制到远程主机,同时支持给定内容生成文件和修改权限等。
backup #创建一个备份文件,以时间戳结尾 content #直接往文件里面写内容 dest #目标地址 group #属组 mode #文件的权限 W 2 R 4 X 1 owner #属主 src #源地址 ansible web -m copy -a "src=/etc/fstab dest=/tmp/f" #复制本地文件到远程主机,并修改文件名,多次执行不会改变,因为checksum值是一样的
ansible web -m copy -a "src=a.sh dest=/tmp/a.sh backup=yes" #复制本地文件,并备份
ansible web -m copy -a "src=a.sh dest=/tmp/a.sh backup=yes group=alex mode=755" # 复制本地文件到远程主机,并指定属组和权限
ansible web -m copy -a "src=/etc/init.d dest=/tmp backup=yes group=alex mode=755" #复制本地的目录到远程主机,修改目录权限,则目录里面的文件也会跟着变更
ansible web -m copy -a "src=/etc/init.d/ dest=/tmp backup=yes group=alex mode=755" #复制本地目录下的所有文件,
ansible web -m copy -a "content='大弦嘈嘈如急雨,小弦切切如私语,嘈嘈切切错 杂弹,大珠小珠落玉盘' dest=/tmp/b" #直接往文件里面写内容,覆盖写,慎用