ansible之Ad-Hoc
一. Ad-Hoc
1. ansible的一种模式Ad-Hoc
ansible是一个能够在远程主机上批量执行命令或者脚本的一个工具
Ad-Hoc是ansible的一种模式
2. ansible的安装
yum install -y ansible
3. 命令格式
ansible <host-pattern> [options]
4. host-pattern主机组
主机组的配置文件在/etc/ansible/hosts
- 单个的的ip地址
- 多个ip地址, 用逗号分割
- 单个组
- 多个组
- 并集: web, db 或 "web: db"
- 交集: "web: &db"
- 差集: "web: !db"
- 全部: all
5. options参数
-m modulename # 使用的模块名 -a args # 模块的参数 -f fork # 并发的线程数, 默认5个 -C # 干跑
6. 管控主机, 连接被管控主机
- 管控主机, 生成密钥
ssh-keygen
- 复制到被管控主机
ssh-copy-id username@ip
7. ansible-doc 查看文档
ansible-doc -s modulename 查看模块的参数
二. 关于命令和脚本的模块
1. command模块
在远程主机上执行命令, 不支持 <>|&$; 一些特殊符号
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1. 参数 chdir 切换目录 creates 存在就不执行后面命令, 反之则执行 removes 存在就执行后面命令, 反之则不执行 2. 实例 ansible web -m command -a "pwd" # 执行pwd命令 ansible web -m command -a "chdir=/tmp pwd" # chdir参数是切换目录 ansible web -m command -a "creates=/tmp pwd" # creates=/tmp 有这个文件就是false,后面的不执行,没有就是true,后面执行 ansible web -m command -a "removes=/tmp pwd" # 有就是true,没有就是false
2. shell模块
和comman模块一样, 但是可以识别特殊符号
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1. linux补充 echo "password" | passwd --stdin username # 一行命令直接修改密码 2. 参数 chdir 切换目录 creates 和command模块一样 removes 和command模块一样 3. 实例 ansible web -m shell -a "echo "password" | passwd --stdin username" # 识别|符号 ansible web -m shell -a "/tmp/a.sh" # 执行a.sh脚本 要有可执行权限 ansible web -m shell -a "bash /tmp/a.sh" # 执行脚本, 不需要有可执行权限
3. script模块
在远程主机上运行本地脚本
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1. 参数 chdir 切换目录 creates 和command模块一样 removes 和commadn模块一样 2. 实例 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" #判断被控机上的文件
三. 关于文件的模块
1. copy模块
复制本地主机的文件到远程主机上
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1. 参数 src 源地址, 一/结尾就是复制文件夹内所有文件 dest 目标地址 backup yes的时候就备份 mode 指定文件权限 group 指定数组 owner 指定属主 content 覆盖写入 2. 实例 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" #直接往文件里面写内容,覆盖写,慎用
2. file模块
对远程主机文件的操作
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1. linux补充 软连接 快捷方式 ln -s 源文件修改软连接修改 源文件删除软连接失效 可以跨分区 硬链接 硬盘的位置 ln 源文件修改硬链接修改 源文件删除硬链接不变 不可以跨分区 复制 开辟新空间 cp 源文件修改cp的不变 源文件删除不变 可以跨分区 2. 参数 path 文件路径 mode 指定权限 group 指定属组 owner 指定属主 state 操作的类型 directory 目录 touch 空文件 absent 删除 link 软连接 hard 硬链接 src 源文件, state=link或hard时用 3. 实例 ansible web -m file -a "path=/alex5 state=directory owner=alex" #创建目录,并制定属主 ansible web -m file -a "path=/tmp/wusir.txt state=touch mode=777" #创建文件,并指定权限 ansible web -m file -a "path=/tmp/cron src=/var/log/cron state=link" #创建软链接,链接的是自己的文件 ansible web -m file -a "path=/tmp/cron state=absent" # 删除软连接 ansible web -m file -a "path=/alex5 state=absent" #删除文件夹
3. fetch模块
在远程主机上拉取文件, 以主机名或ip创建目录并保存原有目录结构
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1. linux补充 scp -rq 文件 地址 # 两台linux之间传输文件 scp -r root@ip:/tmp/text /tmp 2. 参数 src 源地址, 远程主机上的文件, 不能是文件夹 dest 目标地址, 拉取到本地主机的地址 3. 实例 # 拉取被控主机上的/var/log/cron文件到/tmp目录下 ansible web -m fetch -a "src=/var/log/cron dest=/tmp"
4. template模块
5. replace模块
四. 关于下载和启停服务的模块
1. yum模块
在远程主机上进行yum安装
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1. linux的补充 - yum跟rpm有什么关系,有什么区别 rpm redhat package manager yum 基于rpm进行优化的软件管理包, 可以解决依赖关系 - yum源怎么配置 ############################################### [epel] #名称 name=Extra Packages for Enterprise Linux 7 - $basearch #全名或者描述信息 baseurl=http://mirrors.aliyun.com/epel/7/$basearch # 源url地址 failovermethod=priority enabled=1 #是否启用,1启用,0不启用 gpgcheck=0 #是否检验key文件,0不校验 1校验 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 ################################################ - yum怎么安装包组 yum grouplist #查包组信息 yum groupinstall xxx 2. 参数 name 要下载的包名 disablerepo 禁用某个源 enablerepo 启用某个源 state 进行的操作 install 安装 remove 卸载 3. 实例 # 给被控主机配置epel源 ansible web -m copy -a "src=/etc/yum.repos.d/epel.repo dest=/etc/yum.repos.d" # 给被控主机安装redis ansible web -m yum -a "name=redis" #安装多个包 ansible web -m yum -a "name=python2-pip,redis" #安装包组 ansible web -m yum -a "name='@Development Tools'" #卸载 ansible web -m yum -a "name=nginx state=absent"
2. pip模块
在远程主机上进行pip安装
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1. linux补充 pip freeze > requirement.txt 将本地环境所有的包都导出 pip install -r requirement.txt 安装所有的包 pip uninstall flask 卸载包 python setup.py build python setup.py install 2. 参数 name 安装的包名 requirement 安装文件中所有的包 virtualenv 虚拟环境 3. 实例 # 给被控主机pip一个flask包 ansible web -m pip -a "name=flask" # 给被控主机pip一个1.11.14的django包 ansible web -m pip -a "name=django==1.11.14"
3. service模块
在远程主机上启停服务
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1. linux补充 - centos 7 systemctl start redis 开启服务 systemctl enable redis 设置开机自启 - centos 6 service redis start 开启服务 chkconfig redis on 设置开机自启 2. 参数 name 服务名 state 进行的操作 started 启动服务 restarted 重启服务 reloaded 平滑重启服务 stopped 停止服务 enable 设置开机自启 3. 实例 # 在被控主机上开启redis服务 ansible web -m service -a "name=redis state=started" # 关闭被控主机上的redis服务 ansible web -m service -a "name=redis state=stopped" # 在被控主机上开启redis服务并且开机自启 ansible web -m service -a "name=redis state=started enabled=yes"
五. 关于定时任务的模块
1. cron模块
在远程主机上设置定时任务
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1. linux补充 crontab -e 编辑定时任务 crontab -l 查看定时任务 crontab -r 删除定时任务 * * * * * 绝对路径的命令 2. 参数 name 定时任务的名字, 默认为None, 不能重复 job 任务 minute 分 hour 时 day 日 month 月 weekday 周 state 进行的操作 create 创建任务, 默认 absent 删除任务 disable 禁用任务, 就是把任务注释掉 user 指定指定的用户 3. 实例 # 给被控主机设置一个定时任务:每分钟都创建/tmp/1文件夹 ansible web -m cron -a "job='/usr/bin/mkdir /tmp/1' name=makedirectory" # 清除上面的定时任务 ansible web -m cron -a "name=makedirectory state=absent" # 注释定时任务 ansible web -m cron -a "minute=12 name=touchfile2 job='touch /tmp/xiaoqiang.txt' disabled=yes"
六. 关于用户和用户组的模块
1. user模块
对远程主机的用户的操作
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1. linux补充 - 查看本机的用户 vi /etc/passwd vi /etc/shadow id root - 添加用户 useradd -d 设置新用户的家目录 -g 设置新用户的属组 -G 设置新用户的附加组 -u 设置新用户的id -s 设置新用户登陆后的shell -r 设置系统账户,没有家目录 - 删除用户 userdel -r 删除用户,并且删除用户家目录 - 用户分类 超级管理员 root 0 普通用户 系统用户 启动一些服务或者进程,不能登录 1-999 centos7 1-499 centos6 从大到小 登录用户 可以登录的用户 1000-65535 centos7 500-65535 centos6 从小到大 2. 参数 group 属组 groups 附加属组 home 家目录 uid 用户id name 帐号 shell 登陆后的shell system 系统用户 remove 删除用户,并且删除用户家目录 state=absent配合这个参数使用 3. 实例 # 在远程主机上创建用户 ansible web -m user -a "name=username home=/tmp/username" # 删除上面的用户 ansible web -m user -a "name=username remove-yes"
2. group模块
对远程主机的用户组的操作
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1. linux补充 - 创建分组 groupadd -g 设置分组id -r 设置系统组 - 组分类 超级管理员组 root 0 普通组 系统组 1-999 centos7 1-499 centos6 从大到小 登录用户组 1000-65535 centos7 500-65535 centos6 从小到大 - 查看组 cat /etc/group 2. 参数 gid 分组id name 分组名称 system 系统分组 3. 实例 # 在远程主机上创建分组 ansible web -m group -a "name=hh " # 在远程主机上创建系统分组 ansible web -m group -a "name=hh system=yes"
七. 关于系统信息的模块
1. setup模块
获取远程主机的信息
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1. 参数 filter 过滤出想要的信息 2. 实例 # 查看本机的信息,并过滤出用户的组id ansible localhost -m setup -a "filter=ansible_user_gid" 3. 主要信息 ansible_all_ipv4_addresses #所有的ipv4地址 ansible_all_ipv6_addresses #所有的ipv6地址 ansible_architecture #系统的架构 ansible_date_time #系统时间 ansible_default_ipv4 #默认的ipv4地址 address ip地址 alias 网卡名称 broadcast 广播地址 gateway 网关 netmask 子网掩码 network 网段 ansible_default_ipv6 #默认的ipv6地址 ansible_device_links #系统的磁盘信息 ansible_distribution #系统名称 ansible_distribution_file_variety #系统的基于公司 ansible_distribution_major_version #系统的主版本 ansible_distribution_version #系统的全部版本 ansible_dns #系统的dns 默认udp 端口53 ansible_domain #系统的域 ldap ipv4 #ipv4地址 ansible_env #系统的环境 ansible_fqdn #系统的完整主机名 ansible_hostname #系统的简写主机名 ansible_kernel #系统的内核版本 ansible_machine #系统的架构 ansible_memtotal_mb #系统的内存 ansible_memory_mb #系统的内存使用情况 ansible_mounts #系统的挂载信息 ansible_os_family #系统家族 ansible_pkg_mgr #系统的包管理工具 ansible_processor #系统的cpu ansible_processor_cores #每颗cpu的核数 ansible_processor_count #cpu的颗数 ansible_processor_vcpus #cpu的个数=cpu的颗数*每颗cpu的核数 ansible_python #系统python信息 ansible_python_version #系统python的版本 ansible_system #系统名字