Ansible概述

Ansible是一个配置管理系统configuration management system
python 语言是运维人员必须会的语言
ansible 是一个基于python 开发的自动化运维工具
其功能实现基于ssh远程连接服务
ansible 可以实现批量系统配置,批量软件部署,批量文件拷贝,批量运行命令等功能
除了ansible之外,还有saltstack 等批量管理软件

Ansible能做什么

ansible可以帮助我们完成一些批量任务,或者完成一些需要经常重复的工作。
比如:同时在100台服务器上安装nginx服务,并在安装后启动服务。
比如:将某个文件一次性拷贝到100台服务器上。
比如:每当有新服务器加入工作环境时,你都要为新服务器部署某个服务,也就是说你需要经常重复的完成相同的工作。
这些场景中我们都可以使用到ansible。

Ansible软件特点

1.ansible不需要单独安装客户端,SSH相当于ansible客户端。
2.ansible不需要启动任何服务,仅需安装对应工具即可。
3.ansible依赖大量的python模块来实现批量管理。
4.ansible配置文件/etc/ansible/ansible.cfg

Ansible基础架构


1.连接插件(connectior plugins) 用于连接主机 用来连接被管理端
2.核心模块(core modules) 连接主机实现操作, 它依赖于具体的模块来做具体的事情
3.自定义模块(custom modules) 根据自己的需求编写具体的模块
4.插件(plugins) 完成模块功能的补充
5.剧本(playbooks)ansible的配置文件,将多个任务定义在剧本中,由ansible自动执行
6.主机清单(host inventory)定义ansible需要操作主机的范围
最重要的一点是 ansible是模块化的 它所有的操作都依赖于模块
不需要单独安装客户端(no agents),基于系统自带的sshd服务,sshd就相当于ansible的客户端
不需要服务端(no sever)
需要依靠大量的模块实现批量管理
配置文件 /etc/ansible/ansible.cfg (前期不用配置)

ansible中查看模块

[root@m01 ~]# ansible-doc -l
列出所有模块信息
[root@m01 ~]# ansible-doc -s cron
参看指定模块的帮助

Ansible部署与使用

ansible命令语法格式

[root@m01 ~]# ansible nfsnobody -m command -a "hostname"
10.0.0.31 | SUCCESS | rc=0 >>
backup 10.0.0.41 | SUCCESS | rc=0 >>
nfs01

Ansible清单管理

inventory文件通常用于定义要管理主机的认证信息, 例如ssh登录用户名、密码以及key相关信息。如何配置Inventory文件
主机
1.支持主机名通配以及正则表达式,例如web[1:3].nfsnobody.com
2.支持基于非标准的ssh端口,例如web1.nfsnobody.com:6666
3.支持指定变量,可对个别主机的特殊配置,如登陆用户,密码等
主机组
1.支持嵌套组,例如[game:children],那么在game模块下面的组都会被game所包含
2.支持指定变量,例如[game:vars]在下面指定变量
以下操作都是在/etc/ansible/hosts 完成的
添加三台主机至webserver

[webservers]
web1.nfsnobody.com
web2.nfsnobody.com
web3.nfsnobody.com
添加三台主机至webserver[low改良版]
[webservers]
web[1:3].nfsnobody.com
添加三台主机至webserver[密码版]
[webservers]
web1.nfsnobody.com ansible_ssh_pass='123456'
web2.nfsnobody.com ansible_ssh_pass='123456'
web3.nfsnobody.com ansible_ssh_pass='123456'
添加三台主机至webserver[密码改良版]
[webservers]
web[1:3].nfsnobody.com ansible_ssh_pass='123456'
添加三台主机至webserver[密码拆分版]
[webservers]
web1.nfsnobody.com
web2.nfsnobody.com
web3.nfsnobody.com
[webservers:vars]
ansible_ssh_pass='123456'
定义多组,多组汇总整合
[apache]
web1.nfsnobody.com
web2.nfsnobody.com
web3.nfsnobody.com
[apache:vars]
ansible_ssh_pass='123456' [nginx]
10.0.0.7
10.0.0.31
10.0.0.41
10.0.0.61
[nginx:vars]
ansible_ssh_pass='123456'
webservers组包括两个子组[apapche,nginx]
[webservers:children]
apache
nginx ansible nginx --list-hosts
ansible apache --list-hosts
ansible websers --list-hosts

Ansible安装配置

实现从管理机m01到其他机器的密钥认证
说明:
ansible其功能实现基于SSH远程连接服务
使用ansible需要首先实现ssh密钥连接
ansible借助公钥批量管理
ssh服务分发公钥实质执行过程
①. 管理服务器创建私钥和公钥(密钥对)
②. 将公钥文件远程传送复制到被管理服务器相应用户~/.ssh/id_dsa.pub下,并修改.ssh目录权限为700
③. 修改公钥文件文件名称为authorized_keys,授权权限为600
④. 利用ssh服务配置文件的配置参数,进行识别公钥文件authorized_keys
⑤. 进而实现基于密钥远程登录服务器(免密码登录/非交互方式登录)
-P指定密码 -f指定存放的位置

[root@m01 ~]# ssh-keygen -t rsa
一直回车直到结束即可
Generating public/private dsa key pair.
Enter file in which to save the key (/root/.ssh/id_dsa): #私钥创建后保存的路径
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): #私钥需不需进行加密,设置密码
Enter same passphrase again: #私钥需不需进行加密,再次输入密码确认 ssh-keygen -P "" -f ~/.ssh/id_rsa 非交互式创建密码
[root@m01 ~]# ll .ssh/
total 8
-rw------- 1 root root 1679 Sep 11 03:15 id_rsa #创建出来的私钥
-rw-r--r-- 1 root root 390 Sep 11 03:15 id_rsa.pub #创建出来的公钥
#利用非交换式工具实现批量分发公钥与批量管理服务器
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.41
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.21
-i 指定要分发的公钥文件以及路径信息
[user@] 以什么用户身份进行分发
machine 将公钥分发到哪台主机上,远程主机IP地址

安装ansible

[root@m01 ~]# yum install ansible -y
检查ansible版本
[root@m01 ~]# ansible --version
ansible 2.6.1
配置ansible
软件安装完成,进行修改ansible下的hosts文件,注意文件的路径
[root@m01 ~]# vim /etc/ansible/hosts
[nfsnobody]
172.16.1.31
172.16.1.41
中括号中的名字代表组名
主机(hosts)部分可以使用域名、主机名、IP地址表示;一般此类配置中多使用IP地址;
组名下的主机地址就是ansible可以管理的地址
至此ansible 服务就部署完成

验证ansible

ansible是通过ssh端口探测通信
[root@m01 ~]# ansible nfsnobody -m ping
10.0.0.30 | SUCCESS => {
"changed": false,
"ping": "pong"
}
10.0.0.40 | SUCCESS => {
"changed": false,
"ping": "pong"
}

/etc/ansible下的文件

[root@m01 ansible]# ll
total 28
-rw-r--r-- 1 root root 18066 Sep 6 06:38 ansible.cfg #ansible配置文件
-rw-r--r-- 1 root root 1016 Sep 6 06:38 hosts #定义ansible可以管理的主机信息
drwxr-xr-x 2 root root 4096 Sep 6 06:38 roles #主要在自动化的时候部署多台主机时使用

Ansible内置变量

Ansible常用模块

在ansible中是指需要快速执行一条命令, 并且不需要保存的命令,对于复杂的命令则为playbook
Ansible注意事项->提示颜色信息说明
黄色:对远程节点进行相应修改
绿色:对远程节点不进行相应修改,或者只是对远程节点信息进行查看
红色:操作执行命令有异常
紫色:表示对命令执行发出警告信息(可能存在的问题,给你一下建议)

command与shell

command模块

默认模块, 执行命令

[root@m01 ~]# ansible nfsnobody  -a "hostname"

shell模块

如果需要一些管道操作,则使用shell
[root@m01 ~]# ansible nfsnobody -m shell -a "ifconfig|grep eth0" -f 50 # -f =forks /etc/ansible/ansible.cfg #结果返回的数量

yum安装模块

推送脚本文件至远程,远程执行脚本文件

[root@m01 ~]# ansible nfsnobody -m yum -a "name=httpd state=installed"
name ---指定要安装的软件包名称
state ---指定使用yum的方法
installed,present ---安装软件包
removed,absent ---移除软件包
latest ---安装最新软件包

copy模块

推送文件模块

[root@m01 ~]# ansible nfsnobody -m copy -a "src=/etc/hosts dest=/tmp/test.txt"
在推送覆盖远程端文件前,对远端已有文件进行备份,按照时间信息备份
[root@m01 ~]# ansible nfsnobody -m copy -a "src=/etc/hosts dest=/tmp/test.txt backup=yes"
直接向远端文件内写入数据信息,并且会覆盖远端文件内原有数据信息
[root@m01 ~]# ansible nfsnobody -m copy -a "content='nfsnobody' dest=/tmp/nfsnobody" src --- 推送数据的源文件信息 dest --- 推送数据的目标路径 backup --- 对推送传输过去的文件,进行备份 content --- 直接批量在被管理端文件中添加内容 group --- 将本地文件推送到远端,指定文件属组信息 owner --- 将本地文件推送到远端,指定文件属主信息 mode --- 将本地文件推送到远端,指定文件权限信息

service服务模块

[root@m01 ~]# ansible nfsnobody -m service -a "name=crond state=stopped enabled=yes"

name        --- 定义要启动服务的名称
state --- 指定服务状态是停止或是运行,停止和运行指令要写成过去时
started --- 启动
stopped --- 停止
restarted --- 重启
reloaded --- 重载
enabled --- 是否让服务开启自启动

script模块

编写脚本

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

file配置模块

[root@m01 ~]# ansible nfsnobody -m file -a "path=/tmp/nfsnobody state=diretory"
[root@m01 ~]# ansible nfsnobody -m file -a "path=/tmp/tt state=touch mode=555 owner=root group=root"
[root@m01 ~]# ansible nfsnobody -m file -a "src=/tmp/tt path=/tmp/tt_link state=link" path --- 指定远程主机目录或文件信息
recurse --- 递归授权
state ---
directory --- 在远端创建目录
touch --- 在远端创建文件
link --- link或hard表示创建链接文件
absent --- 表示删除文件或目录
mode --- 设置文件或目录权限
owner --- 设置文件或目录属主信息
group --- 设置文件或目录属组信息

group模块

name            --- 指定创建的组名
gid --- 指定组的gid
state
absent --- 移除远端主机的组
present --- 创建远端主机的组(默认)
创建组,指定gid
[root@m01 ~]# ansible nfsnobody -m group -a "name=oldgirl gid=888"

user模块

[root@m01 ~]# echo "nfsnobody"| openssl passwd -1 -stdin
$1$1KmeCnsK$HGnBE86F/XkXufL.n6sEb.
[root@m01 ~]# ansible nfsnobody -m user -a 'name=xlw password="$1$1KmeCnsK$HGnBE86F/XkXufL.n6sEb."'
创建oldgirl,设定uid为888,并加入gid为888
[root@m01 ~]# ansible nfsnobody -m user -a "name=oldgirl uid=888 group=888 shell=/sbin/nologin create_home=no"
随机生成加密字符串(-1使用MD5进行加密 -stdin 非交互式 -salt 加密参数)
[root@m01 ~]# echo "nfsnobody" | openssl passwd -1 -stdin
固定加密字符串
[root@m01 ~]# echo "123"| openssl passwd -1 -stdin -salt 'salt
创建普通用户,并配置对应的用户密码
[root@m01 ~]# echo "nfsnobody" | openssl passwd -1 -stdin
$1$1KmeCnsK$HGnBE86F/XkXufL.n6sEb.
[root@m01 ~]# ansible nfsnobody -m user -a 'name=xlw password="$1$765yDGau$diDKPRoCIPMU6KEVEaPTZ0"'
uid --- 指定用户的uid
group --- 指定用户组名称
groups --- 指定附加组名称
password --- 给用户添加密码
shell --- 指定用户登录shell
create_home --- 是否创建家目录

crond模块

正常使用crond服务
[root@m01 ~]# crontab -l
* * * * * /bin/sh /server/scripts/yum.sh 使用ansible添加一条定时任务
[root@m01 ~]# ansible nfsnobody -m cron -a "minute=* hour=* day=* month=* weekday=* job='/bin/sh /server/scripts/test.sh'"
[root@m01 ~]# ansible nfsnobody -m cron -a "job='/bin/sh /server/scripts/test.sh'" 设置定时任务注释信息,防止重复,name设定
[root@m01 ~]# ansible nfsnobody -m cron -a "name='cron01' job='/bin/sh /server/scripts/test.sh'" 删除相应定时任务
[root@m01 ~]# ansible nfsnobody -m cron -a "name='ansible cron02' minute=0 hour=0 job='/bin/sh /server/scripts/test.sh' state=absent" 注释相应定时任务,使定时任务失效
[root@m01 scripts]# ansible nfsnobody -m cron -a "name='ansible cron01' minute=0 hour=0 job='/bin/sh /server/scripts/test.sh' disabled=no" minute 分 Minute when the job should run ( 0-59, *, */2, etc )
hour 时 Hour when the job should run ( 0-23, *, */2, etc )
day 日 Day of the month the job should run ( 1-31, *, */2, etc )
month 月 Month of the year the job should run ( 1-12, *, */2, etc )
weekday 周 Day of the week that the job should run ( 0-6 for Sunday-Saturday, *, etc )
job 工作 ;要做的事情
name 定义定时任务的描述信息
disabled 注释定时任务
state
absent 删除定时任务
present 创建定时任务(默认为present)

mount模块

仅将挂载的配置写入/etc/fstab,并不会执行挂载操作
[root@m01 ~]# ansible nfsnobody -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs opts=defaults state=present"
临时挂载设备,并将挂载信息写入/etc/fstab
[root@m01 ~]# ansible web -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs opts=defaults state=mounted"
临时卸载,不会清理/etc/fstab
[root@m01 ~]# ansible web -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs opts=defaults state=unmounted"
卸载,不仅临时卸载,同时会清理/etc/fstab
[root@m01 ~]# ansible web -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs opts=defaults state=absent"
present ---开机挂载,仅将挂载配置写入/etc/fstab(不常用)
mounted ---挂载设备,并将配置写入/etc/fstab
unmounted ---卸载设备,不会清除/etc/fstab写入的配置
absent ---卸载设备,会清理/etc/fstab写入的配置

Ansible常见错误

ansible编写剧本排错思路

1.ansible-playbook编写完,检査语法和模拟测试运行
2.打开剧本,定位异常问題原因,将剧本中的内容转换命令执行一次
cron: name=clsn64 minute=ee hour=03 job='/bin/sh /server/scripts/test.sh &>/dev/null'
ansible clsn -m cron -a "name=clsn64 minute=00 hour=03 job='/bin/sh /server/scripts/test.sh &>/dev/null
3.将参数中的脚本文件推送到远程屎务器,在远程服务器本地执行脚本 sh -x test.sh
说明:ansible执行时,加1上-vvvv显示ansible详细执行过程,也可以定位异常原因!
排错逻辑
01. 剧本执行中的错误
02. 把剧本中的内容转换为ansible命令执行
    ansible clsn -m yum -a "name=rsync state=installed"
03. 把ansible服务器上执行的命令放在被管理主机上执行
    yum install -y rsync

ansible 无法正常使用

在被控端上 root@notty 进程一直存在

[root@backup ~]# ps -ef|grep sshd
root 35274 1 0 15:25 ? 00:00:00 /usr/sbin/sshd
root 37004 35274 0 16:23 ? 00:00:00 sshd: root@pts/2
root 37062 35274 0 16:55 ? 00:00:00 sshd: root@notty
root 37154 37006 0 16:55 pts/2 00:00:00 grep --color=auto sshd

解决办法
将该进程kill掉
kill pid
然后使用ansible的 -vvvv 参数查看执行的错误信息

Loading callback plugin minimal of type stdout, v2.0 from /usr/lib/python2.6/site-packages/ansible/plugins/callback/__init__.pyc
META: ran handlers
Using module file /usr/lib/python2.6/site-packages/ansible/modules/system/ping.py
<172.16.1.8> ESTABLISH SSH CONNECTION FOR USER: None
<172.16.1.8> SSH: EXEC ssh -vvv -C -o ControlMaster=auto -o ControlPersist=60s -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o ConnectTimeout=10 -o ControlPath=/root/.ansible/cp/923ebeb605 172.16.1.8 '/bin/sh -c '"'"'echo ~ && sleep 0'"'"''
……
找到在哪里出错。
可能会出现的错误
在 /etc/ssh/sshd_config 文件中的第132行为空,导致sftp 无法连接,出错~
133 Subsystem sftp /usr/libexec/openssh/sftp-server

常见问题二

[root@m01 ~]# ansible  -k 172.16.1.51 -m ping
SSH password:
[WARNING]: No hosts matched, nothing to do
原因分析:
在ansible的hosts文件中,没有配置相应主机地址信息

常见问题三

# ansible -k 172.16.1.51 -m ping
SSH password:
172.16.1.51|FAILED! => {
"failed": true,
"msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host's fingerprint to your known_hosts file to manage this host."
}
原因分析:
因为没有受控端的指纹信息,在known_hosts文件中

Ansible-上部的更多相关文章

  1. 002. Ansible部署及配置介绍

    一 Ansible的安装部署 1.1 PIP方式 安装PIP 略,可参考<001.Pip简介及使用>. 提示:建议将PIP升级到最新:pip install --upgrade pip. ...

  2. Ansible部署及配置介绍

    原文转自:https://www.cnblogs.com/itzgr/p/10233932.html作者:木二 目录 一 Ansible的安装部署 1.1 PIP方式 1.2 YUM方式 二 Ansi ...

  3. 如何利用ansible callback插件对执行结果进行解析

    最近在写一个批量巡检工具,利用ansible将脚本推到各个机器上执行,然后将执行的结果以json格式返回来. 如下所示: # ansible node2 -m script -a /root/pyth ...

  4. 《Ansible权威指南》笔记(2)——Inventory配置

    四.Inventory配置ansible通过Inventory来定义主机和组,使用时通过-i指定读取,默认/etc/ansible/hosts.可以存在多个Inventory,支持动态生成.1.定义主 ...

  5. useful Ansible commands

    This article includes some useful Ansible commands. I will try to write blogs by English. You may wa ...

  6. 《Ansible权威指南》笔记(4)——Playbook

    七.Playbook1.语法特性如下:(1)"---"首行顶格开始(2)#号注释(3)缩进统一,不同的缩进代表不同的级别,缩进要对齐,空格和tab不能混用(4)区别大小写,键值对k ...

  7. 《Ansible权威指南》笔记(3)——Ad-Hoc命令集,常用模块

    五.Ad-Hoc命令集1.Ad-Hoc命令集通过/usr/bin/ansible命令实现:ansible <host-pattern> [options]    -v,--verbose  ...

  8. 《Ansible权威指南》笔记(1)——安装,ssh密钥登陆,命令

    2016-12-23 读这本<Ansible权威指南>学习ansible,根据本书内容和网上的各种文档,以及经过自己测试,写出以下笔记.另,这本书内容很好,但印刷错误比较多,作者说第二版会 ...

  9. 自动化运维工具ansible部署以及使用

    测试环境master 192.168.16.74webserver1 192.168.16.70webserver2 192.168.16.72安装ansiblerpm -Uvh http://ftp ...

  10. Ansible Ubuntu 安装部署

    一.安装: $ sudo apt-get install ansible 二.配置: a.基本配置 $ cd /etc/ansible/ $ sudo cp hosts hosts_back 备份一个 ...

随机推荐

  1. 力扣(LeetCode)加一 个人题解

    给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一. 最高位数字存放在数组的首位, 数组中每个元素只存储一个数字. 你可以假设除了整数 0 之外,这个整数不会以零开头. 示例 1: 输入 ...

  2. Microsoft Dynamics CRM 批量上传web资源(非官方WebResourceUtility)并替换实体图标

    背景: 去年以前可以按照目录WebResourceUtility批量上传web资源,昨天发现用不了了,拿到WebResourceUtility源码改了一下都不是很方便,感觉官方写的太冗余,太长了,跟我 ...

  3. robatframework+jenkins+email集成部署方案

    准备工作: 1.jenkins.war包 下载地址:https://jenkins.io/zh/download/ 2.Jdk1.8 下载地址:http://www.oracle.com/techne ...

  4. setBounds方法,与setLayout(null)

    首先把相关容器的布局方式设为 setLayout(null); 然后调用组件的  setBounds() 方法 设置button的位置为(100,100) 长宽分别为 60,25 jButton.se ...

  5. C#取视频某一帧图片

    首先下载 ffmpeg http://ffmpeg.org/ 注意一定要从官网下载,其他地方可以会有问题 解压后在 bin 目录下找到 ffmpeg.exe 用到的使命是 -i 视频地址 -ss 第几 ...

  6. 【设计模式大法】Iterator模式

    Iterator模式 --一个一个遍历 在Java中的for语句中 i++的作用是让 i 的值在每次循环后自增1,这样就可以访问数组中的下一个元素.下下一个元素.再下下一个元素,也就实现了从头至尾逐一 ...

  7. 【w、vmstat、top、sar、nload】各个命令 使用介绍

    第7周第1次课(5月7日) 课程内容: 10.1 使用w查看系统负载10.2 vmstat命令10.3 top命令10.4 sar命令10.5 nload命令 10.1 使用w查看系统负载 w命令查看 ...

  8. Tensorflow Serving Docker compose 部署服务细节(Ubuntu)

    [摘要] Tensorflow Serving 是tf模型持久化的重要工具,本篇介绍如何通过Docker compose搭建并调试TensorFlow Serving TensorFlow Servi ...

  9. 从React 编程到"好莱坞"

    目录 概念 面向流设计 异步化 响应式宣言 参考文档 概念 Reactive Programming(响应式编程)已经不是一个新东西了. 关于 Reactive 其实是一个泛化的概念,由于很抽象,一些 ...

  10. Python一秒搭建ftp服务器,帮助你在局域网共享文件

    "老板 来碗面" "要啥面?" "内牛满面.." 最近项目上的事情弄得人心累,本来是帮着兄弟项目写套入口代码,搞着搞着就被拉着入坑了.搞开发 ...