ansible背景
1.什么是ansible?
ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
2.ansible的是怎么工作的?
ansible基础
1.ansible安装
yum install wget -y #安装wget wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo #下载epel源文件 yum install ansible -y #安装ansible
2.ansible的命令格式
-a MODULE_ARGS, --args=MODULE_ARGS #模块参数 -C, --check #白跑一次,不做任何改变 -f FORKS, --forks=FORKS #指定进程数,做并发用 --list-hosts #列出主机 -m MODULE_NAME #模块名称 --syntax-check #检查语法 -k, --ask-pass ask for connection password #指定密码
3.查看ansible生成的配置文件
rpm -ql ansible
配置hosts文件,比如我有四台机器 ip段 192.168.220.133/134/135/136,此时安装ansible机器为192.168.220.133,以下配置
vi /etc/ansible/hosts
192.168.220.134 192.168.220.135 192.168.220.136 #将这3个机器ip写入hosts文件中
4.ansible如何通过ssh与远程服务器连接?
第一种: 密码 ssh root@192.168.220.133 -->输入root密码即可
第二种:秘钥 (推荐)
- ssh -keygen #生成秘钥
- ssh-copy-id root@192.168.220.134 #将秘钥文件复制到远程主机
当通过ansible控制量级比较大的机器的时候,使用秘钥连接的方法最为快捷方便
5.ansible的第一个命令ping
ping走的是icmp协议
ansible 192.168.220.134 -m ping
#反馈如下便能建立连接 192.168.220.134 | SUCCESS => { "changed": false, "ping": "pong" }
以此类推 ...
ansible 192.168.220.135 -m ping
ansible 192.168.220.136 -m ping
ansible all -m ping --->所有机器,hosts文件
ansible 192.168.220.135,192.168.220.136 -m ping --->探测部分机器
6.ansible分组查看机器
#在hosts文件中写入以下配置 [web] 192.168.220.134 192.168.220.135 [cache] 192.168.220.135 192.168.220.136 [db] 192.168.220.134 192.168.220.135 192.168.220.136
ansible web --list-hosts #用来获取符合条件的主机
#反馈情况为: [root@localhost ~]# ansible web --list-hosts hosts (2): 192.168.220.135 192.168.220.134
ansible web -m ping #探测web组内的所有机器
ansible分组并集
ansible web,cache -m ping #探测web,cache两个组的并集机器
[root@localhost ~]# ansible web,cache,db -m ping 192.168.220.135 | SUCCESS => { "changed": false, "ping": "pong" } 192.168.220.134 | SUCCESS => { "changed": false, "ping": "pong" } 192.168.220.136 | SUCCESS => { "changed": false, "ping": "pong" } #两者组内所有
ansible分组交集
- ansible 'web:cache' -m ping #获取web cache两个组交集的机器
- ansible 'web:&cache' -m ping #获取web cache两个组交集的机器
[root@localhost ~]# ansible 'web:&cache' -m ping 192.168.220.135 | SUCCESS => { "changed": false, "ping": "pong" } #两者分组中共有的
ansible分组差集
ansible 'web:!cache' -m ping #获取web cache两个组差集的机器
[root@localhost ~]# ansible 'web:!cache' -m ping 192.168.220.134 | SUCCESS => { "changed": false, "ping": "pong" }
#两者分组中不一样的,表现为前者分组中机器为后者没有,
弱口令校验
服务器密码符合规则:
必须有大小写字母,数字,特殊字符;
密码必须12位以上;
密码3个月轮换;
host-pattern的格式
- 单个主机
- 单个组
- 多个组
#交集 "web:&cache" #并集 "web:cache" "web,cache" #差集 "web:!&cache"
- 所有机器 all
- 多个主机
ansible常用模块
获取模块的帮助信息
[root@localhost ~]# ansible-doc -h # 显示全部信息 Usage: ansible-doc [-l|-F|-s] [options] [-t <plugin type> ] [plugin] -j, --json #以json的方式返回所有模块的信息 -l # 列出所有的模块 -s, --snippet # 以片段式显示模块的帮助信息 ansible-doc -l |wc -l #统计ansible的模块 2080
1.command模块
执行命令,不支持特殊字符,如$ & < > | ;
#参数 chdir #切换目录 一般编译安装使用 creates #判断是否存在,如果存在就 不 执行,不存在,就执行 removes #与creates正好相反 ansible web -m command -a 'pwd' #执行web组所有机器pwd命令 ,拿到所有机器的 /root -m表示调用模块, -a 表示参数 ansible web -m command -a "ls /tmp" #执行web组所有机器查看tmp目录下的文件 ansible web -m command -a "chdir=/tmp pwd" #切换目录到/tmp下,一般编译安装 ansible web -m command -a "creates=/tmp pwd" #不被执行,直接跳过 ,因为/tmp已存在 ansible web -m command -a "creates=/tmp2 pwd" #执行,因为/tmp2不存在 ansible web -m command -a "creates=/tmp2 mkdir /data" #会被执行,并且创建/data目录,因为/tmp2不存在 ansible web -m command -a "removes=/tmp2 pwd" #不执行,因为tmp2不存在 ansible web -m command -a "removes=/tmp pwd" #执行
补充:
#查看用户是否被成功创建 1. ll /home 2. tail -1 /etc/passwd #查看passwd文件(存放密码)最后一行 3. tail /etc/shadow #查看shadow(存放用户信息) 4. id coco #查询指定用户id #给用户设置密码,不需要二次确认 先创建一个用户 useradd Sheldon echo "ni666" |passwd --stdin Sheldon #单引号和双引号在echo命令的不同 [root@localhost ~]# name=coco [root@localhost ~]# echo "$name" coco [root@localhost ~]# echo '$name' $coco
2.shell模块
执行远程机器上的shell脚本或python脚本
ansible web -m shell -a "echo 'coco'|passwd --stdin coco " #给远程机器设置用户密码,前提是远程主机上有coco账户 # shell 脚本 要在文件顶部写上#!/bin/bash ansible 192.168.220.134 -m shell -a "bash /data/a.sh" #执行shell a.sh脚本内容,前提是该机器有这个文件,并有内容 #示例1 ansible 192.168.220.134 -m shell -a "chmod u+x /data/a.sh" #先远程将a.sh脚本改成可执行 ansible 192.168.220.134 -m shell -a "/data/a.sh" #远程执行脚本 # python脚本 开头写上如下两句 #!/bin/env python #coding:utf-8 ansible 192.168.220.134 -m shell -a "python /root/b.py" #调用python解释器运行 ansible 192.168.220.134 -m shell -a " /root/b.py" #自己将该目录下的b.py权限设置为可执行的即可 chmod u+x /root/b.py
3.script模块
执行的是管控机/本地的脚本
ansible db -m script -a "python /root/a.py" #执行的是本地的脚本,管控机上的脚本 ansible db -m script -a "creates=/root/a.py /root/a.sh" # 判断是远程主机是否存在,如果存在,就不执行,如果不存在,就执行 ansible db -m script -a "removes=/root/a.py /root/a.sh" # 判断是远程主机是否存在,如果存在,就不执行,如果不存在,就执行 #以上也就是多了个远程主机的条件,但是执行的是本地的脚本
4.copy模块
将本地文件复制到远程机上
#参数 backup #创建备份文件,以时间戳结尾 content #直接写内容 dest #目标地址 group #文件的属组 mode #文件的权限W2 R4 X1 owner #文件的属主 src #源文件 ansible db -m copy -a "src=/root/a.py dest=/root/a.py" #复制本地文件到远程主机 ansible db -m copy -a "src=/root/a.py dest=/data/a.py mode=755" #复制文件到远程主机指定路径,并且改变文件权限 ansible db -m copy -a "src=/root/a.py dest=/data/a.py mode=755 owner=coco" #复制文件到远程主机指定路径,改变文件权限 属主,根据md5值进行比对,注意coco需要在远程主机建立该用户. ansible db -m copy -a "src=/etc/init.d dest=/tmp/" #复制文件夹 ansible db -m copy -a "src=/etc/init.d/ dest=/tmp/" #复制文件夹下面的所有文件 ansible db -m copy -a "src=/etc/init.d dest=/tmp/ owner=coco " #复制文件夹,并改变文件夹的属性,文件夹的文件的属性也会跟着改变 ansible db -m copy -a "content='生活需要勇气' dest=/tmp/a.sh" #覆盖写入文字,慎用 ansible db -m copy -a "src=/root/a.py dest=/data/a.py mode=755 owner=coco backup=yes" #注意: 备份文件,如果远程机器上没有要备份的文件,即使指定了backup=yes也不会去备份文件
5.file模块
在远程主机上创建文件,文件夹,软连接,硬链接
#参数 access_time #访问事件 group #属组 mode #权限 owner #属主 path #路径 src #原文件,link和hard的时候使用 state: directory 文件夹 file touch 空文件 link 软连接: hard 硬链接 absent 删除 补充: #软连接:windows的快捷方式 ln -s 原文件 目标文件 源文件改变,目标文件也改变,可以跨越分区,源文件删除,链接失效 #硬链接:指向同一个硬盘的地址 ln 原文件 目标文件 原文件改变,目标文件也改变,不可以跨越分区,原文件删除,不会受影响 #软连接类似于python中的浅拷贝,硬链接则是像极了深拷贝
示例
ansible db -m file -a "path=/data/temp state=directory" #在远程机上创建一个目录 ansible db -m file -a "path=/data/task state=directory owner=coco mode=644" #在远程机上创建一个属主为coco 且权限为drw - r -r 权限的目录 ansible db -m file -a "path=/data/aiqing.txt state=touch owner=coco mode=644" #在远程机上创建一个属主为coco 的文件 ansible db -m file -a "path=/tmp/fffff src=/data/aiqing.txt state=link" #在远程机创建一个软连接 ansible db -m file -a "path=/tmp/fffff state=absent" #删除软连接
------------ 平常心 ------------ 面对 ------------ ALL DIFFICULTIES ------------ 勤能补拙,熟能生巧 ------------
1- 获取db组/opt目录下文件 2- 创建icon用户,并设置密码为xiaokeai 3- 在/tmp目录下生成aa.txt文件,文件的内容为"大弦嘈嘈如急雨,小弦切切如私语,嘈嘈切切错杂弹,大珠小珠落玉盘" 4- 将本地的网卡配置文件复制到远程机器上,并命名为network,用户为icon,用户组为icon,权限为744 5- 在/opt目录下创建ab.py文件,并指定用户为icon,用户组为icon,权限为744 6- 在/opt目录下创建canglaoshi目录
1. ansible db -m command -a "ls /opt" 2. [root@localhost ~]# ansible db -m command -a "useradd icon" [root@localhost ~]# ansible db -m shell -a "echo 'xiaokeai'|passwd --stdin 'icon' " #由于command模块不支持特殊字符,因此需要shell模块支持 3. [root@localhost ~]# ansible db -m copy -a "content='大弦嘈嘈如急雨,小弦切切如私语,嘈嘈切切错杂弹,大珠小珠落玉盘' dest=/tmp/aa.txt" 4.[root@localhost ~]# ansible db -m copy -a "src=/etc/sysconfig/network-scripts/ifcfg-ens33 dest=/opt/network group=icon owner=icon mode=744" 5. ansible db -m file -a "path=/opt/ab.py state=touch group=icon owner=icon mode=744" 6. ansible db -m file -a "path=/opt/canglaoshi state=directory"
6.fetch模块
fetch (英 /fetʃ/ vt.取来) 将远程主机器上的文件拉取到本地/管控机,以ip或者主机名生成目录,并保留原先目录结构
#fetch ---参数 dest #目标地址 src #源地址 ansible web -m fetch -a "dest=/data src=/data/a.py" #注意拉取远程主机文件的时候如果只获取到目录,无文件无效
7.yum模块
① yum与rpm的区别
rpm适用于所有环境,而yum要搭建本地yum源才可以使用;
yum是上层管理工具,自动解决依赖关系,而rpm是底层管理工具。
② yum 源的配置
#配置信息 /etc/yum.repos.d/epel.repo [epel] #名称 name=Extra Packages for Enterprise Linux 7 - $basearch #描述信息 baseurl=http://mirrors.aliyun.com/epel/7/$basearch #yum源的地址 failovermethod=priority enabled=1 #指定yum源是否可用,1表示可用,0则相反 gpgcheck=0 #是否检查gpgkey文件,0表示不检查,1表示检查 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
③ 包组
linux --> lib | windows ---> dll
yum grouplist #查看包组 yum groupinstall #安装包组
④查看包安装状态
yum list|grep redis #出现 @ 代表安装成功 rpm -q redis rpm -qa #查看所有安装包 rpm -ql #查看安装包生成的文件
⑤ 参数以及使用
#yum 参数 disable_gpg_check #是否检查key disablerepo #禁用repo name #包名 state #状态 installed removed #注意:在给远程机器安装包组的时候要确保远程机器上有epel.repo 文件 ansible db -m copy -a "src=/etc/yum.repos.d/epel.repo dest=/etc/yum.repos.d/" ansible web -m yum -a "name=python2-pip" #安装一个包 ansible web -m yum -a "name='@Development Tools'" # 安装包组 ansible web -m yum -a "name=redis,python2-pip" # 同时安装多个包 ansible web -m yum -a "name=redis state=absent" # 卸载
8.pip模块
①pip命令
pip list #查看所有的python第三方包 pip freeze > requirements.txt #导出所有第三方包到 requirements.txt pip install -r requirements.txt #安装这些包
②参数以及使用
#参数 virtualenv #虚拟环境 name #包名 ansible web -m pip -a "name=django==1.11.18" ansible web -m pip -a "name=flask"
9.service模块
①相关linux常用命令
ps -ef|grep redis #查看redis进程 ss -tnlp #查看端口信息 #启动服务,停止和重启分别为stop,restart systemctl start redis #Centos7启动方式 service redis start #Centos6启动方式 #开机自启动 systemctl enable redis #Centos7启动方式 chkconfig redis on #Centos6启动方式
②参数以及使用
enabled #设置开机自启动 name #名称 state #状态 started stopped restarted #重启 reload #重新加载 ansible web -m service -a "name=redis state=strarted" #开启远程机器redis ansible web -m service -a "name=redis state=stopped" #关闭 ansible web -m service -a "name=redis state=started enabled=yes" #给远程机器设置开机自启redis
10.crontab模块
crontab模块 --->定时任务
①linux常用命令
crontab 用途:收集日志,备份数据,同步时间 * * * * * job 分 时 日 月 周 任务 0-59 0-23 1-31 1-12 0-7 job 1 * * * * job #代表每个小时的第一分钟执行job 2/ * * * * * job #代表每隔2分钟执行job 1 10-19 * * * job #代表10到19点的第一分钟执行job #注意: 分钟不要用*,最好是指定时间 crontab -l #查看计划任务 crontab -r # 删除所有计划任务 crontab -e #编辑计划任务
②参数以及使用
#注意 ansible中没有crontab 它表现的为cron模块 如下参数 day huor job #任务 minute #分钟 month #月 name state #状态 user #执行计划任务的用户 weekday #周 disabled #禁止 ansible web -m cron -a "minute=21 job='touch /tmp/cron.txt' name=touchfile" # 设置计划任务 ansible web -m cron -a "minute=23 job='touch /tmp/cron.txt' name=touchfile4 disabled=yes" # 禁用计划任务,表现为加注释 ansible web -m cron -a "name=touchfile4 state=absent" # 删除计划任务
11.user模块
①常用命令
关于user,必须聊聊用户的分类
超级用户 --- root uid :0
其他用户
- 系统用户 ---启动服务来专门设置的用户 1-999 Centos7 | 1-499 Centos6
- 登录用户 ---普通的登录用户 1000-65535 Centos | 500-65535 Centos6
#useradd 命令参数 -d # 指定家目录 -g # 组id -G, --groups GROUPS # 附加组 -r, --system # 创建系统用户 -s, --shell SHELL # 登陆shell -u, --uid UID #用户id useradd -s /sbin/nologin -u 2000 -d /opt/coco coco #创建用户,指定用户的登录shell为不登录, id 2000,家目录在/opt/coco useradd -s /sbin/nologin -G root,na -d /opt/na na #指定附加组,最大的后面+1 useradd -r feige # 创建系统用户,从999倒序 userdel feige # 删除用户 userdel -r fei # 删除用户并删除用户的家目录
②参数以及使用
#参数 group #组 groups #附件组 home #家目录 name #用户名 password #密码 shell #登录shell remove #删除用户并且删除用户家目录 state #状态 system #系统用户 uid #用户id ansible db -m user -a "name=dafei shell=/sbin/nologin home=/opt/dafei uid=2001 group=root" #创建用户,指定用户家目录,登录shell情况,uid,组 #解释: /sbin/nologin 作用 指的是不允许login当前Linux系统。当用户配置成/sbin/nologin时,如果再使用该用户ssh到linux操作系统,会提示如下内容:This account is currently not available。该功能类似于封掉某个帐户。 ansible db -m user -a "name=dafei system=yes" #创建系统用户 ansible db -m user -a "name=xiaofei state=absent" #删除用户 ansible db -m user -a "name=xiaofei state=absent remove=yes" #删除用户并且删除其家目录
12.group模块
①linux常用命令
#用户组的分类 超级组 root uid 0 其他组 系统组 uid 1-999 centos7 | 1-499 centos6 普通组 uid 1000-65535centos7 | 500-65535 centos6 -g #指定组的id -r #指定系统组 cat /etc/group #查看所有组 groupadd -g 3000 xiaofei #创建一个组id为3000的组 groupdel xiaofei #指定删除改组
②参数以及使用
# 常用参数 gid #组id name #组名 state #状态 system #系统组 ansible db -m group -a "name=xiaoliu" #创建普通组 ansible db -m group -a "name=xiaowang system=yes" #创建系统组 ansible db -m group -a "name=xiaowang state=absent" #删除组
#web组操作 1 - 创建yuanyaun用户,指定用户的家目录为/opt/,指定用户的id为3000,指定用户的附加组为root 2 - 创建tiantian用户组 3 - 将本地的/etc/fstab 复制到远程,并指定属主是yuanyuan,属组是tiantian 4 - 安装redis并启动,设置开机自启动 5 - 安装django 6 - 设置计划任务每天凌晨2点半备份/etc/目录,tar
1. ansible web -m user -a "name=yuanyuan home=/opt/ uid=3000 groups=root" 2. ansible web -m user -a "name=tiantian" 3.ansible web -m copy -a "src=/etc/fstab dest=/etc/ owner=feige group=feige" 4.ansible web -m yum -a "name=redis" ansible web -m service -a "name=redis state=started enabled=yes" 5.absible web -m pip -a "name=django" 6. 30 2 * * * tar -zvcf alletc.tar.gz /etc/* ansible web -m cron -a "minute=30 hour=2 job='tar a.tar.gz /etc/*' name=aaa"