linux --- Ansible篇

时间:2022-08-12 08:29:59

ansible背景

1.什么是ansible?

ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。

2.ansible的是怎么工作的?

ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:
(1)、连接插件connection plugins:负责和被监控端实现通信;
(2)、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
(3)、各种模块核心模块、command模块、自定义模块;
(4)、借助于插件完成记录日志邮件等功能;
(5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。

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"

小小练习啦答案