linux --- Ansible篇
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"
小小练习啦答案
linux --- Ansible篇的更多相关文章
- 不就是抽个血吗,至于么-jQuery,Linux完结篇
hi 趁着周一去抽血化验,真开心...下午报告才出来,不过早上来了就开始各种晕菜,叫错名字,说错话.....至于么.. 还有在教研室的30天就可以肥家了,凯森凯森.今天不想干活(哪天想干过我就问问), ...
- LNMP平台搭建---Linux系统安装篇
在互联网网站开发领域,有一个名词,大家一定不陌生,那就是LAMP,经典的Web服务器环境,由Linux+Apache+MySQL+PHP组成,,后来,一个名叫Nginx的Web服务器开源出来了,因其更 ...
- Linux入门篇(一)——文件
这一系列的Linux入门都是本人在<鸟哥的Linux私房菜>的基础上总结的基本内容,主要是记录下自己的学习过程,也方便大家简要的了解 Linux Distribution是Ubuntu而不 ...
- Linux入门篇(四)——Vim的使用与Bash
这一系列的Linux入门都是本人在<鸟哥的Linux私房菜>的基础上总结的基本内容,主要是记录下自己的学习过程,也方便大家简要的了解 Linux Distribution是Ubuntu而不 ...
- Linux入门篇(二)——文件
这一系列的Linux入门都是本人在<鸟哥的Linux私房菜>的基础上总结的基本内容,主要是记录下自己的学习过程,也方便大家简要的了解 Linux Distribution是Ubuntu而不 ...
- Linux入门篇(三)——文件与目录
这一系列的Linux入门都是本人在<鸟哥的Linux私房菜>的基础上总结的基本内容,主要是记录下自己的学习过程,也方便大家简要的了解 Linux Distribution是Ubuntu而不 ...
- ARM Linux驱动篇 学习温度传感器ds18b20的驱动编写过程
ARM Linux驱动篇 学习温度传感器ds18b20的驱动编写过程 原文地址:http://www.cnblogs.com/NickQ/p/9026545.html 一.开发板与ds18b20的入门 ...
- Linux 用户篇——用户管理命令之id、whoami、su、chage
一.浅谈id.whoami.su.chage 本篇是续写上一篇<Linux 用户篇——用户管理命令之useradd.passwd.userdel.usermod>. (1)id命令 命令格 ...
- Linux 指令篇:磁盘管理--tree
Linux 指令篇:磁盘管理--tree 功能说明:以树状图列出目录的内容. 语 法:tree [-aACdDfFgilnNpqstux][-I <范本样式>][-P <范本样式&g ...
随机推荐
- 第四周结对项目总结及改进(ui/web)
项目介绍 随着社会科技的进步和多媒体教育的日益发展,越来越来的学生正在接受着新时代下的教育模式,而且手机.电脑等科技产品的普及以及其带来的更高效更便捷的模式 使得它们成为当代学生学习中的一种很好的学习 ...
- LeetCode前100题(EASY难度)
1 Two Sum Given an array of integers, return indices of the two numbers such that they add up to a s ...
- Servlet中文件上传下载
1.文件下载: package FileUploadAndDown; import java.io.FileInputStream; import java.io.IOException; impor ...
- Django跨域请求
一.jsonp方式 同源策略会阻止ajaxa请求,但不阻止src. jsonp方式其实是利用了<script>标签可以直接跨域的性质,在body中生成一个<script>标签, ...
- Spring注解@Configuration和Java Config
1.从Spring 3起,JavaConfig功能已经包含在Spring核心模块,它允许开发者将bean定义和在Spring配置XML文件到Java类中.但是,仍然允许使用经典的XML方式来定义bea ...
- C++设计模式——解释器模式
解释器模式 在GOF的<设计模式:可复用面向对象软件的基础>一书中对解释器模式是这样说的:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子.如 ...
- 再说C模块的编写(1)
[前言] 在<Lua“控制”C>中对Lua调用C函数做了初步的学习,而这篇才是重中之重,这篇文章会重点的总结C模块编写过程中遇到的一些问题,比如数组操作.字符串操作和C函数的状态保存等问题 ...
- elementui+vue修改elementUi默认样式不生效
重写,覆盖都不行, ! important 也不行. 原因是 在style标签加了 scoped 的原因.
- 使用virtualenvwrapper模块管理python虚拟环境
1.pip安装virtualenvwrapper [root@localhost ~]# pip install virtualenvwrapper # 安装virtualenvwrapper [ro ...
- php的参数函数与可变参
在php5.5及更早的版本中,使用func_num_args(), func_get_arg(), func_get_args()函数实现. <?php function myfunc(){ / ...