Ansible介绍

第一章 ansible服务介绍

1.1 ansible批量管理服务概述

是基于python语言开发的自动化软件工具

是基于SSH远程管理服务实现远程主机批量管理

1.2 ansible批量管理服务意义

  1. 提高工作的效率

  2. 提高工作准确度

  3. 减少维护的成本

  4. 减少重复性工作

1.3 ansible批量管理服务功能

  1.    可以实现批量系统操作配置
    
  2.    可以实现批量软件服务部署
    
  3.    可以实现批量文件数据分发
    
  4.    可以实现批量系统信息收集
    

1.4 ansible批量管理服务特点

管理端不需要启动服务程序(no server)

管理端不需要编写配置文件(/etc/ansible/ansible.cfg)

受控端不需要安装软件程序(libselinux-python)

被管理端selinux服务没有关闭---影响ansible软件的管理

libselinux-python让selinux开启的状态也可以使用ansible程序

受控端不需要启动服务程序(no agent)

服务程序管理操作模块众多(module)

利用剧本编写来实现自动化(playbook)

第二章 Ansible安装部署

1.第一个历程:安装部署软件

[root@m01 ~]#  yum -y install ansible
[root@m01 ~]# rpm -qc ansible
/etc/ansible/ansible.cfg	--ansible服务配置文件
/etc/ansible/hosts		    --主机清单文件
/etc/ansible/roles		    ---角色目录

2. 第二个历程:需要编写主机清单文件

[root@m01 ansible]# vim /etc/ansible/hosts
[all]
172.16.1.31
172.16.1.41
172.16.1.7
[backup]
172.16.1.41
[nfs]
172.16.1.31
[web]
172.16.1.7

3 第三个历程:测试是否可以管理多个主机

[root@m01 ansible]# ansible all -a "hostname"
172.16.1.41 | CHANGED | rc=0 >>
backup

172.16.1.7 | CHANGED | rc=0 >>
web01

172.16.1.31 | CHANGED | rc=0 >>
nfs

[root@m01 ansible]# 

第三章 Ansible主机清单

1.主机支持主机名通配以及正则表达式,例如 web[1:3].oldboy.com 代表三台主机
2.主机支持基于非标准的 ssh 端口,例如 web1.oldboy.com:6666
3.主机支持指定变量,可对个别主机的特殊配置,如登陆用户,密码
4.主机组支持指定变量[group_name:vars],同时支持嵌套组[game:children]

1.指定主机组相关配置

#主机组
[root@m01 ~]# cat /etc/ansible/hosts
[all]
172.16.1.31 
172.16.1.41
#主机+端口+密码
[all]
172.16.1.31 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='123456'
172.16.1.41 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='123456'
#对整个主机组都生效的变量
[all:vars]
ansible_ssh_pass='123456'

第四章 Ansible常用模块

1. command(默认模块)

command – Execute commands on targets
			在一个远程主机上执行一个命令

应用场景:
类似shell,但是只能执行简单的命令,复杂的命令和有些符号并不能识别,用的比较少

01.查看主机名,可以执行成功

[root@m01 ~]# ansible all -m ping       
172.16.1.41 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
172.16.1.31 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

02.使用awk拼接查看主机IP执行失败

[root@m01 ansible]# ansible all -m command -a "ifconfig eth0|grep 172"     
172.16.1.7 | FAILED | rc=255 >>
SIOCSIFADDR: No such device
eth0|grep: ERROR while getting interface flags: No such devicenon-zero return code

172.16.1.41 | FAILED | rc=255 >>
SIOCSIFADDR: No such device
eth0|grep: ERROR while getting interface flags: No such devicenon-zero return code

172.16.1.31 | FAILED | rc=255 >>
SIOCSIFADDR: No such device
eth0|grep: ERROR while getting interface flags: No such devicenon-zero return code

[root@m01 ansible]# 

2. shell(万能模块)

command – Execute shell commands on targets
			在节点上执行操作

万能模块,所有命令都可以执行,和本地执行效果一样
01.使用管道查询IP地址

[root@m01 ~]# ansible all -m shell -a "ifconfig eth0|grep 10.0.1"
172.16.1.41 | CHANGED | rc=0 >>
        inet 10.0.1.41  netmask 255.255.255.0  broadcast 10.0.1.255

172.16.1.31 | CHANGED | rc=0 >>
        inet 10.0.1.31  netmask 255.255.255.0  broadcast 10.0.1.255

3. copy 模块

copy – Copy files to remote locations
		将数据信息进行批量分发

01.拷贝m01的hostsname文件到其他主机的/opt目录下

[root@m01 ~]# ansible 172.16.1.31 -m copy -a "src=/etc/hostname dest=/opt"
172.16.1.31 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "checksum": "f434396716e2c9aed47cfde87c491cce5a2c08fa", 
    "dest": "/opt/hostname", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "318d7defb693a2eb0d4f1a7a96575a57", 
    "mode": "0644", 
    "owner": "root", 
    "size": 4, 
    "src": "/root/.ansible/tmp/ansible-tmp-1563780990.63-144254987732501/source", 
    "state": "file", 
    "uid": 0
}

02.在传输文件时修改文件属主和属组信息及权限信息

ansible 172.16.1.31 -m copy -a "src=/root/rsync.password dest=/etc/ owner=opesn group=opesn mode=0600"

03.创建文件并直接写入内容

ansible 172.16.1.31 -m copy -a "content='opesn' dest=/etc/rsync.password mode=0600"

05.复制目录
src后面目录没有/: 将目录本身以及目录下面的内容都进行远程传输复制

ansible 172.16.1.31 -m copy -a "src=/data dest=/data"

src后面目录有/: 只将目录下面的内容都进行远程传输复制

ansible 172.16.1.31 -m copy -a "src=/data/ dest=/data"

参数说明:

src #推送数据的源文件信息
dest #推送数据的目标路径
backup #对推送传输过去的文件,进行备份
content #直接批量在被管理端文件中添加内容
group #将本地文件推送到远端,指定文件属组信息
owner #将本地文件推送到远端,指定文件属主信息
mode #将本地文件推送到远端,指定文件权限信息

4. file 模块

01.创建文件夹

ansible all -m file -a "path=/root/test state=directory"

02.创建文件并更改属性

ansible all -m file -a "path=/root/test.txt state=touch mode=777 owner=root group=root"

03.创建软链接

ansible all -m file -a "src=/root/abc path=/root/abc_link state=link"

参数说明:

path #指定远程主机目录或文件信息
recurse #递归授权
state
directory #在远端创建目录
touch #在远端创建文件
link #link 或 hard 表示创建链接文件
absent #表示删除文件或目录
mode #设置文件或目录权限
owner #设置文件或目录属主信息
group #设置文件或目录属组信息

5.script(脚本模块)

script – Runs a local script on a remote node after transferring it
		在传输远程节点之后,在远程节点上运行一个本地脚本

# 编写脚本
[root@m01 ~]# mkdir -p /server/scripts
[root@m01 ~]# cat /server/scripts/yum.sh
#!/usr/bin/bash
yum install -y iotop
#在本地运行模块,等同于在远程执行,不需要将脚本文件进行推送目标主机执行
[root@m01 ~]# ansible oldboy -m script -a "/server/scripts/yum.sh"

6.cron 模块

01.创建一条定时任务

ansible all -m cron -a "minute=* hour=* day=* month=* weekday=* job='/bin/sh
/server/scripts/test.sh'"

02.添加定时任务名字信息,防止重复

ansible all-m cron -a "name='cron01' job='/bin/sh /server/scripts/test.sh'"

03.删除相应定时任务

ansible all -m cron -a "name='ansible cron02' minute=0 hour=0 job='/bin/sh
/server/scripts/test.sh' state=absent"

04.注释相应定时任务,使定时任务失效

ansible all -m cron -a "name='ansible cron01' minute=0 hour=0 job='/bin/sh
/server/scripts/test.sh' disabled=no"

mount模块

src:需要挂载的存储设备或文件信息
path:指定目标挂载点目录
fstype:指定挂载时的文件系统类型
state:presnet/mounted	---	进行挂载
			present:不会实现立即挂载修改fstab文件,实际开机自动挂载
			mounted:会实现立即挂载,并且会修改fstab文件,实际开机自动挂载
	  absent/umounted	---	进行卸载
			absent:会实现立即卸载,并且会删除fstab文件信息,禁止开机自动挂载
			unmounted:会实现立即卸载,但不会删除fstab文件信息

ansible web -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs state=present"
ansible web -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs state=mounted"
ansible web -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs state=unmounted"
ansible web -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs state=absent"

user模块

01.创建用户指定uid,gid,不创建家目录也不允许登陆

ansible all -m user -a "name=test uid=888 group=888 shell=/sbin/nologin create_home=no"

name #指定创建的用户名
uid #指定用户的 uid
group #指定用户组名称
groups #指定附加组名称
password #给用户添加密码
shell #指定用户登录 shell
create_home #是否创建家目录

group模块

01.创建用户组

ansible test -m group -a "name=test gid=888 state=present"

name #指定创建的组名
gid #指定组的 gid
state
absent #移除远端主机的组
present #创建远端主机的组(默认)

yum模块

name       #指定要安装的软件包名称
state      #指定使用 yum 的方法
installed, present #安装软件包
removed, absent #移除软件包
latest     #安装最新软件包

ansible test -m yum -a "name=httpd state=installed"

service模块:管理服务器的运行状态:停止、开启、重启

name # 定义要启动服务的名称
state # 指定服务状态
started #启动服务
stopped #停止服务
restarted #重启服务
reloaded #重载服务
enabled #开机自启

ansible oldboy -m service -a "name=nfs state=stopped enabled=yes"

unarchive(解压模块)

01.解压远程服务器的压缩包到指定目录
创建压缩包:
cd /etc && tar zxvf /opt/sys.tar.gz etc/fstab etc/hosts  
执行命令:
ansible 172.16.1.31 -m unarchive -a "src=/opt/sys.tar.gz dest=/opt/ remote_src=yes"

02.把本地文件解压到目标机器指定目录
创建命令
cd / && tar zcvf /opt/log.tar.gz var/log/messages
ansible 172.16.1.31 -m unarchive -a "src=/opt/log.tar.gz dest=/opt/"

archive(解压单个文件)

01.压缩单个文件

ansible 172.16.1.31 -m archive -a "path=/var/log/message dest=/tmp/log.tar.gz format=gz force_archive=true" 

setup 获取主机信息

01.直接执行获取主机信息

ansible 172.16.1.31 -m setup

02.只将主机某个信息打印出来

[root@m01 /server/scripts/test]# ansible 172.16.1.41 -m setup -a "filter=ansible_all_ipv4_addresses"              
172.16.1.41 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "172.16.1.41", 
            "10.0.1.41"
        ], 
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false
}

查看帮助

[root@mo1 ~]# ansible-doc -l			---	列出ansible简介
[root@mo1 ~]# ansible-doc -s fetch	---	指定一个模块详细说明
[root@mo1 ~]# ansible-doc fetch		---	查询模块在剧本中应用方法

Ansible输出信息颜色解释

01. 绿色信息:  查看主机信息/对主机未做改动
02. 黄色信息:  对主机数据信息做了修改
03. 红色信息:  命令执行出错了
04. 粉色信息:  忠告信息
05. 蓝色信息:  显示ansible命令执行的过程

远程主机无法管理问题分析

1)	管理端没有分发好主机的公钥
2)	被管理端远程服务出现问题SSH
3)	被管理端进程出现僵死情况
	/usr/sbin/sshd -D		---	负责建立远程连接
	sshd: root@pts/0		---	用于维护远程连接(windows---linux)
	sshd: root@notty		---	用户维护远程连接(ansible---被管理端)

posted @ 2019-08-03 20:07  helloord  阅读(357)  评论(0编辑  收藏  举报