初识Ansible

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"
小小练习啦答案

 

原文地址:https://www.cnblogs.com/CrazySheldon1/p/10675062.html