前几天由于工作上的事耽误了几天,特来追加更新

第1章 ansible软件概念说明

python语言是运维人员必会的语言,而ansible是一个基于Python开发的自动化运维工具 (saltstack)。其功能实现基于SSH远程连接服务;ansible可以实现批量系统配置、批量软件部署、批量文件拷贝、批量运行命令等功能

ansible软件相关参考链接信息:

http://docs.ansible.com/ansible/intro_installation.html
http://www.ansible.com.cn/
http://docs.ansible.com/modules_by_category.html
http://www.ansible.cn/docs/

1.1 软件特点概述

01.不需要单独安装客户端(no agents),基于系统自带的sshd服务,sshd就相当于ansible的客户端

02.不需要服务端(no servers)

03.需要依靠大量的模块实现批量管理

04.配置文件/etc/ansible/ansible.cfg(无需配置)

1.2 企业级生产场景批量管理-自动化管理方案

01.最简单/最常用/最强大的选择是ssh key+shell/pssh方案,一般中小型企业会用(50-100台以下规模企业)

a.利用ssh key执行命令,并将命令放在脚本里面

b.利用ssh key执行命令,将命令放在脚本里面,并加上相应循环语句或判断语句

02.sina cfengine/puppet较早的批量管理工具(现在基本上没有企业用)

03.门户级别比较流行的,puppet批量管理工具(复杂/笨重)

04.saltstack批量管理工具;特点:简单,功能强大(配置复杂)---赶集网/小米/ CDN公司

批量管理路线:ssh key-->cfengine-->puppet-->saltstack/ansible

注意:使用ansible软件的前提是ssh key公钥分发完成

1.3 实现集群规模架构一键部署自动化-步骤说明

01.5台服务器先配置好(kickstart,cobbler无人值守安装),高级实现云计算(按需分配,动态调整)-openstack,kvm

02.linux基本优化,包括ssh服务(可以自动化实现)

03.创建密钥信息(自动化免交互创建)

ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1

04.进行批量分发密钥(sshpass,expect自动化实现)

05.ansible软件安装(自动化实现)

06.网络服务自动化安装(ansible实现)

搭建yum仓库,定制rpm包

第2章 ansible软件实践部署

ansible软件部署安装需求

01. 需要有epel源

系统yum源(base epel--pip gem)

sshpass---epel

02. ssh+key免密码环境必须部署完成

2.1 ansible地址规划

服务器名称

网卡eth0

网卡eth1

用途说明

m01

10.0.0.61

172.16.1.61

批量管理服务器

nfs01

10.0.0.31

172.16.1.31

nfs共享存储服务器

backup

10.0.0.41

172.16.1.41

rsync备份服务器

web01

10.0.0.8

172.16.1.8

web服务器

说明:无特殊说明,子网掩码均为255.255.255.0,一个C类网段254台机器规模

2.2 ①部署ssh+key免密码登录方式

利用非交互式工具实现批量分发公钥与批量管理服务器

 sshpass -p123456 ssh-copy-id -i ~/.ssh/id_dsa.pub "-o StrictHostChecking=no 172.16.1.41"
sshpass -p123456 ssh -o StrictHostChecking=no root@172.16.1.41 "uptime"
sshpass -p123456 scp -o StrictHostChecking=no /etc/hosts root@172.16.1.41:~ <- -p:指定ssh连接用户的密码
<- -o:StrictHostChecking=no 避免第一次登录出现公钥检查

2.3 ②受控端安装ansible相关管理软件

保留yum安装的软件

sed -i.bak 's#keepcache=0#keepcache=1#g' /etc/yum.conf grep keepcache /etc/yum.conf

客户端配置

yum install libselinux-python -y

说明:由于初始我们关闭了selinux安全管理软件,故这里需要操作此步骤。不装这个软件只能关闭selinux,但是无论什么情况也不要开启,工作环境下视情况而定

2.4 ③管理端m01安装ansible软件

yum install ansible -y

2.4.1 查看版本信息

 [root@m01 ~]# ansible --version
ansible 2.3.2.0
config file = /etc/ansible/ansible.cfg #告知ansible软件配置文静路径
configured module search path = Default w/o overrides
python version = 2.6. (r266:, Aug , ::) [GCC 4.4. (Red Hat 4.4.-)]

2.4.2 查看软件相关安装信息

 [root@m01 ~]# rpm -ql ansible|egrep -v '/usr/share/|/usr/lib'
/etc/ansible
/etc/ansible/ansible.cfg #ansible配置文件
/etc/ansible/hosts #定义ansible可以管理的主机信息
/etc/ansible/roles #主要在自动化部署多台主机时应用 /usr/bin/ansible
/usr/bin/ansible-playbook #执行ansible剧本命令

2.4.3 软件安装目录信息

[root@m01 ~]# tree /etc/ansible/

/etc/ansible/

├── ansible.cfg #ansible配置

├── hosts #被ansible管理的主机名单(分组)

└── roles

2.5 ④配置/etc/ansible/hosts文件

编辑ansible的主机配置文件hosts,添加主机组banana

 cp /etc/ansible/hosts{,.bak}

 [root@m01 ~]# vim /etc/ansible/hosts   #配置文件编写举例
[banana] #定义组名称
172.16.1.8
172.16.1.31
172.16.1.41
[root@m01 ~]# tail /etc/ansible/hosts

2.6 ⑤实践测试

 [root@m01 ~]# ansible banana -m command -a "hostname"  #-m指定命令的模块 -a指定参数(action)
172.16.1.31 | SUCCESS | rc= >> #主机IP|请求状态|返回值(0即成功,否则失败)
nfs01 #命令输出结果 172.16.1.8 | SUCCESS | rc= >>
web01 172.16.1.41 | SUCCESS | rc= >>
backup

2.6.1 ansible命令输出信息说明

输出内容为绿色,表示执行成功,仅查询但没有发生任何改变

输出内容为黄色,表示执行成功,但对受控主机产生了影响,发生了配置改变

输出内容为红色:表示执行失败!!!

第3章 ansible有关语法参数总结

3.1 语法格式图示

3.2 软件常用参数表

命令参数

参数说明

-m MODULE_NAME

相应名称的模块被执行(默认模块为command);

-m后面是模块的的名字

-a MODULE_ARGS

模块参数信息;

-a后面是要执行的命令,也可以写一个IP,针对一台机器来执行命令

-C,--check

不做任何改变;反而,只是尝试预言一些可能出现的改变

--syntax-check

执行语法检查在剧本上,但是并不执行剧本

第4章 ansible常用模块总结

常见模块

模块说明

command(重要模块)

执行命令模块,ansible命令执行默认模块

shell(重要模块)

执行shell脚本模块

script(重要模块)

把脚本发到客户端然后执行;执行脚本命令在远程服务器上

copy(重要模块)

把本地文件发送到远端

file

设定文件属性模块

service

系统服务管理模块

cron

计划任务管理模块

yum

yum软件包安装管理模块

synchronize

使用rsync同步文件模块

mount

挂载模块

ansible帮助信息系统中查看方法:ansible-doc -l        <-查看全部模块列表信息

ansible-doc -s [模块]   <-查看指定模块用法参数信息

4.1 ping模块

 [root@m01 ~]# ansible banana -m ping
172.16.1.41 | SUCCESS => {
"changed": false,
"ping": "pong"
} 172.16.1.31 | SUCCESS => {
"changed": false,
"ping": "pong"
}

说明:ansible连接测试成功结果

 ansible 172.16.1.8 -m ping

 172.16.1.8 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: Permission denied (publickey,password).\r\n",
"unreachable": true
}

说明:ansible连接测试不成功结果

模块概要:

a.ping是一个简单的测试模块,这个模块在成功连接时返回"pong"信息。在剧本中没有意义,但能够使用ansible命令验证登录能力和用于python的配置

b.这并不是传统的ICMP ping,而是先检查是否通过ssh登录节点,在检查python版本是否满足要求,能满足要求就返回pong

连接正常返回pong通过帮助信息可以获得:
ansible-doc -v ping 可以获得该模块的说明
ansible-doc -s file 参看模块的具体信息

实例:

 [root@m01 ~]# ansible-doc -v ping
Using /etc/ansible/ansible.cfg as config file
> PING (/usr/lib/python2./site-packages/ansible/modules/system/ping.py) A trivial test module, this module always returns `pong' on successful contact. It does not make sense in playbooks, but it is useful from `/usr/bin/ansible' to verify the ability to login and that a usable python is configured. This is NOT ICMP ping, this is just a trivial test module.

4.2 command模块

常见模块

模块说明

chdir

在执行命令之前,通过cd命令进入到指定目录中

ansible banana -m command -a "chdir=/tmp ls"

create

定义一个文件是否存在,如果不存在运行相应命令;如果存在跳过此步骤

executable

改变shell使用command进行执行,并且执行时要使用绝对路径

free_form

命令模块采用自由形式命令运行;即可以输入任意linux命令

removes

定义一个文件是否存在,如果存在运行相应命令;如果不存在跳过此步骤

warn

如果ansible配置文件中定义了命令警告,如果参数设置了no/false,将不会警告此行命令

实例01.

 [root@m01 ~]# ansible all -m command -a "date"
172.16.1.8 | SUCCESS | rc= >>
Thu Oct :: CST 172.16.1.31 | SUCCESS | rc= >>
Thu Oct :: CST 172.16.1.41 | SUCCESS | rc= >>
Thu Oct :: CST

实例02.

 [root@m01 ~]# ansible banana -m command -a "chdir=/tmp pwd"
172.16.1.31 | SUCCESS | rc= >>
/tmp 172.16.1.8 | SUCCESS | rc= >>
/tmp 172.16.1.41 | SUCCESS | rc= >>
/tmp

实例03.

 [root@m01 ~]# ansible banana -m command -a "pwd creates=/tmp/banana_file"

 172.16.1.31 | SUCCESS | rc= >>
skipped, since /tmp/banana_file exists 172.16.1.8 | SUCCESS | rc= >>
/root 172.16.1.41 | SUCCESS | rc= >>
/root

模块概要:

a.命令模块中的多个参数设置用空格进行分割

b.命令模块中不能出现 "<", ">", "|", ";" and "&",如需使用这些功能,可用shell模块

提示:command模块作为默认模块,在-m不指定具体模块时,即采用默认模块command

4.3 debug模块

msg:设置打印自定义消息;如果忽略,则打印通用信息

 [root@m01 ~]# ansible banana -m debug -a "msg=banana"
172.16.1.8 | SUCCESS => {
"msg": "banana"
} 172.16.1.31 | SUCCESS => {
"msg": "banana"
} 172.16.1.41 | SUCCESS => {
"msg": "banana"
}

模块概要:这个模块会打印语句在执行时,并且能够用于调试变量或表达式,可以不需要停止剧本;可以结合when指令一起进行调试

4.4 copy模块

参数

参数说明

src

被复制到远程主机的本地文件。如果路径是一个目录,它将递归复制。如果路径使用"/"来结尾,则只复制目录里的内容,如果没有使用"/"来结尾,则包含目录在内的整个内容全部复制

remote_src

如果这个值设置为True,将到远程/目标主机的机器上搜索

dest

必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录

owner

设置复制传输后的数据属主信息

group

设置复制传输后的数据属组信息

mode

设置文件数据权限信息(注意4位)

backup

在覆盖远端服务器文件之前,将远端服务器源文件备份,备份文件包含时间信息。有两个选项:yes|no

content

用于替代"src”,可以直接设定指定文件的值

force

如果目标主机包含该文件,但内容不同。

如果设置为yes,则强制覆盖;如果为no,则只有当目标主机的目标位置不存在该文件时才复制,默认为yes

directory_mode

递归设定目录的权限,默认为系统默认权限

模块概要:

a.copy模块拷贝文件从本地或远程机器到远程机器的一个目录区域中;使用fetch模块来拷贝文件从远程区域到本地

b.如果需要复制文件中插入的变量值,可以使用template模块

说明:第一次执行时结果为黄色,即文件传输;第二次执行没有发生任何改变,即为绿

实例01. 使用copy 模块,将/etc/hosts文件传输到各个服务器送,权限修改为044,属主属组为banana

 [root@m01 ~]# ansible banana -m copy -a "src=/etc/hosts dest=/tmp/ mode=0600 owner=banana group=banana "

 172.16.1.8 | SUCCESS => {
"changed": true,
"checksum": "b3c1ab140a1265cd7f6de9175a962988d93c629b",
"dest": "/tmp/hosts",
"gid": ,
"group": "banana",
"md5sum": "8c2b120b4742a806dcfdc8cfff6b6308",
"mode": "",
"owner": "banana",
"size": ,
"src": "/root/.ansible/tmp/ansible-tmp-1508410846.63-224022812989166/source",
"state": "file",
"uid":
}

实例02.移动远程主机上的文件remote_src=true参数

 [root@m01 ~]# ansible banana -m copy -a "remote_src=true src=/etc/hosts dest=/opt"

 172.16.1.41 | SUCCESS => {
"changed": false,
"checksum": "545f587595b5c60d66243fca48e052ed34eed782",
"dest": "/opt/hosts",
"gid": ,
"group": "root",
"md5sum": "fe08440ffebed54cab7a9b4cb3c3beda",
"mode": "",
"owner": "root",
"size": ,
"src": "/etc/hosts",
"state": "file",
"uid":
}

实例03.定义文件中的内容content=bananaedu.com默认没有换行

 [root@m01 ~]# ansible banana -m copy -a "content=bananaedu.com dest=/opt/banana.txt"

 172.16.1.31 | SUCCESS => {
"changed": true,
"checksum": "291694840cd9f9c464263ea9b13421d8e74b7d00",
"dest": "/opt/banana.txt",
"gid": ,
"group": "banana",
"md5sum": "0a6bb40847793839366d0ac014616d69",
"mode": "",
"owner": "banana",
"size": ,
"src": "/root/.ansible/tmp/ansible-tmp-1508649097.07-180967115147583/source",
"state": "file",
"uid":
}

4.5 shell模块

注意:shell模块在远程执行脚本时,远程主机上一定要有相应的脚本

01.把脚本文件复制到远程服务器,执行远程服务器的脚本

 [root@m01 ~]# ansible banana -m shell -a "/bin/sh /server/scripts/ssh-key.sh"
172.16.1.31 | SUCCESS | rc= >>
fenfa 172.16.1.31 [ OK ] fenfa 172.16.1.41 [ OK ] fenfa 172.16.1.8 [ OK ]

02.把/etc/hosts文件中的内容重定向到/banana.txt

 [root@m01 ~]# ansible banana -m shell -a "cat /etc/hosts >/banana.txt"

 172.16.1.41 | SUCCESS | rc= >>

 172.16.1.8 | SUCCESS | rc= >>

 172.16.1.31 | SUCCESS | rc= >>

说明:可支持command模块不能完成的特殊符号,同时汇总所有的模块

4.6 script模块

 [root@m01 ~]# ansible banana -m script -a "/server/scripts/ip.sh"

 172.16.1.8 | SUCCESS => {
"changed": true,
"rc": ,
"stderr": "Shared connection to 172.16.1.8 closed.\r\n",
"stdout_lines": [
"eth0 Link encap:Ethernet HWaddr 00:0C:29:4B:16:9D ",
" inet addr:10.0.0.8 Bcast:10.0.0.255 Mask:255.255.255.0",
" UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1",
" RX bytes:86527 (84.4 KiB) TX bytes:76532 (74.7 KiB)",
]
}

提示:script模块与shell模块的区别

shell:需要将脚本文件都知道远端服务器,然后sh执行远端服务器的脚本

script:不需要将脚本文件复制到远端服务器,实质是将脚本执行过程在远端服务器上进行执行

4.7 file模块

参数

参数说明

owner

设置复制传输后的数据属主信息

group

设置复制传输后的数据属组信息

mode

设置文件数据权限信息

dest

要创建的文件或目录命令,以及路径信息

src

指定要创建软链接的文件信息

state

参数

参数说明

directory

所有不存在的子目录将会被创建

file

文件不存在将不能被创建

link

符号链接(软链接)将被创建或更改

hard

创建出硬链接

absent

目录将被递归删除以及文件,链接被取消

注意:定义文件不存在不会失败,只是输出没有发生任何改变的结果

touch

如果路径不存在将创建一个空文件,如果文件或目录存在将接收更新的文件访问和修改时间

实例01.创建远端目录

 [root@m01 ~]# ansible banana -m file -a "dest=/tmp/banana_dir state=directory"

 172.16.1.41 | SUCCESS => {
"changed": true,
"gid": ,
"group": "root",
"mode": "",
"owner": "root",
"path": "/tmp/banana_dir",
"size": ,
"state": "directory",
"uid":
}

实例02.创建远端文件

 [root@m01 ~]# ansible banana -m file -a "dest=/tmp/banana_file state=touch"

 172.16.1.8 | SUCCESS => {
"changed": true,
"dest": "/tmp/banana_file",
"gid": ,
"group": "root",
"mode": "",
"owner": "root",
"size": ,
"state": "file",
"uid":
}

4.8 yum模块

参数

参数说明

name=name

指定安装的软件

state=installed

安装

 [root@m01 ~]# ansible banana -m yum -a "name=nmap state=installed"

 172.16.1.41 | SUCCESS => {
"changed": false,
"msg": "",
"rc": ,
"results": [
"nmap-2:5.51-6.el6.x86_64 providing nmap is already installed"
]
}

提示:这里的state状态均为过去式ed/d

4.9 service模块

参数

参数说明

name=service name

服务的名称

state=参数

停止服务 服务状态信息为过去时

stared/stoped/restarted/reloaded

enabled=yes

设置开机自启动

 [root@m01 ~]# ansible banana -m service -a "name=crond state=restarted"

 172.16.1.8 | SUCCESS => {
"changed": true,
"name": "crond",
"state": "started"
}

说明:此时name即服务名,表示将名为crond的服务停止,并且取消开机自启动

4.10 cron模块

实例01.创建定时任务

 [root@m01 ~]# ansible banana -m cron -a "name=01 minute=*/5 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1'"   #name识别定时任务唯一性的标识,但只管理ansible信息

 172.16.1.41 | SUCCESS => {
"changed": true,
"envs": [],
"jobs": [
"None",
"banana666"
]
}

实例02.删除定时任务

 [root@m01 ~]# ansible banana -m cron -a "name=None minute=*/5 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1' state=absent"

 172.16.1.41 | SUCCESS => {
"changed": true,
"envs": [],
"jobs": [
"banana666"
]
}

实例03.查看定时任务

 [root@m01 ~]# ansible banana -m shell -a "crontab -l"

 172.16.1.8 | SUCCESS | rc= >>
#time sync by banana at -- #web_backup by rsync
#*/ * * * * /bin/sh /server/scripts/web_backup.sh &>/dev/null
#Ansible: banana666
# * * * /bin/sh /server/scripts/ip.sh &>/dev/null

4.11 fetch模块

参数

参数说明

dest

将远程主机拉取过来的文件保存在本地的路径信息

src

指定从远程主机要拉取的文件信息,只能拉取文件

flat

默认设置为no,如果设置为yes,将不显示172.16.1.8/etc/信息

实例01.从远程主机拉取文件

 [root@m01 ~]# ansible banana -m fetch -a "dest=/tmp  src=/etc/hosts"

 172.16.1.8 | SUCCESS => {
"changed": true,
"checksum": "bd9a0f82db17051a305f6a5974fa1fd95ead73d5",
"dest": "/tmp/172.16.1.8/etc/hosts",
"md5sum": "27b1ddf7c360698b439627b057f77d51",
"remote_checksum": "bd9a0f82db17051a305f6a5974fa1fd95ead73d5",
"remote_md5sum": null
}

实例02.拉取时不创建目录(同名文件会覆盖)

 [root@m01 ~]# ansible banana -m fetch -a "dest=/tmp/  src=/etc/hosts flat=yes"

 172.16.1.41 | SUCCESS => {
"changed": true,
"checksum": "bcb7c85bad6008ede9e73d18ae0bb78f2b11f612",
"dest": "/tmp/hosts",
"md5sum": "211bd00bf9ba8a735db1c7953d7cebc4",
"remote_checksum": "bcb7c85bad6008ede9e73d18ae0bb78f2b11f612",
"remote_md5sum": null
}

4.12 mount模块

参数

参数说明

fstype

指定挂载文件类型;-t nfs == fstype=nfs

opts

设定挂载的参数选项信息;-o ro == opts=ro

path

指定挂载点 path=/mnt

src

要被挂载的目录设备信息 src=172.16.1.31:/data/w

state

01.如果为mountd

在fstab文件中的设备将被激活挂载和适当配置

02.如果为unmounted

设备将被卸载并不会改变fstab文件信息,absent和present只处理fstab,但不影响目前的挂载

实例01.挂载

 [root@m01 ~]#ansible banana -m mount -a “fstype=nfs opts=ro src=172.16.1.31:/data path=/mnt state=mounted”

 172.16.1.41 | SUCCESS => {
"changed": true,
"dump": "",
"fstab": "/etc/fstab",
"fstype": "nfs",
"name": "/mnt",
"opts": "ro",
"passno": "",
"src": "172.16.1.31:/data/w"
}

实例02.卸载

 [root@m01 tmp]# ansible banana -m mount -a "fstype=nfs opts=ro src=172.16.1.31:/data path=/mnt state=unmounted"

     172.16.1.8 | SUCCESS => {
"changed": false,
"dump": "",
"fstab": "/etc/fstab",
"fstype": "nfs",
"name": "/mnt",
"opts": "ro",
"passno": "",
"src": "172.16.1.31:/data"
}

第5章 ansible剧本编写

5.1 ansible基础知识部分补充

5.1.1 ansible软件特点

01.可以实现批量管理

02.可以实现批量部署

03.ad-hoc(批量执行命令)---针对临时性的操作

ansible banana -m command -a "hostname"   <-批量执行命令举例

04.编写剧本-脚本(playbook)---针对重复性的操作

5.1.2 ansible核心功能

01.pyYAML  <-用于ansible编写剧本所使用的语言格式(saltstack---python)

02.paramiko  <-远程连接与数据传输

03.Jinja2     <-用于编写ansible的模板信息

5.2 ansible剧本编写规则说明

①规则一:缩进/空格

yaml使用一个固定的缩进风格表示数据层结构关系,Saltstack需要每个缩进级别由两个空格组成,一定不能使用tab键

注意:编写ansible-playbook文件,一定忘记有tab键

②规则二:冒号

CMD="echo"

yaml :

mykey :

注意:每个冒号前后一定要有空格(以冒号结尾不需要空格,表示文件路径的模板不需要空格)

③规则三:短横线

想要表示列表项,使用一个短横杠加一个空格。多个项使用同样的缩进级别作为同一个列表的一部分

核心规则:有效的利用空格进行剧本的编写,剧本编写是不支持tab的

5.3 剧本编写环境准备

外网IP

内网IP

主机名

10.0.0.8

172.16.1.8

web01

10.0.0.31

172.16.1.31

nfs01

10.0.0.41

172.16.1.41

backup

10.0.0.61

172.16.1.61

m01

5.4 剧本书写格式

 剧本的开头,可以不写
- hosts: all #处理所有服务器,找到所有服务器; -(空)hosts:(空)all
tasks: #剧本所要干的事情; -(空)(空)task:
- command: echo hello banana linux.
(空)(空)(空)(空)-(空)模块名称:(空)模块中对应的功能
ansible all -m command -a "echo hello banana linux"

剧本编写内容扩展:剧本任务定义名称

 - hosts: 172.16.1.7   #处理指定服务器                   -(空)hosts:(空)all
task: #剧本所要干的事情; -(空)(空)task:
- name:
command: echo hello banana linux.
(空)(空)(空)(空)-(空)模块名称:(空)模块中对应的功能

5.4.1 剧本格式示例

 [root@m01 ansible-playbook]# vim rsync_sever.yml

 - hosts: 172.16.1.41
tasks:
- name: install rsync
yum: name=rsync state=installed

5.5 剧本编写后检查方法

:ansible-playbook --syntax-check .yml   进行剧本配置信息语法检查

:ansible-playbook -C .yml   模拟剧本执行(彩排)

5.5.1 语法检查

[root@m01 ansible-playbook]# ansible-playbook --syntax-check .yml

playbook: .yml

5.5.2 模拟剧本执行

 [root@m01 ansible-playbook]# ansible-playbook -C .yml

 PLAY [all] ***************************************************************

 TASK [Gathering Facts] ***************************************************************
ok: [172.16.1.41]
ok: [172.16.1.8]
ok: [172.16.1.31] TASK [cron] ***************************************************************
ok: [172.16.1.8]
ok: [172.16.1.41]
ok: [172.16.1.31] PLAY RECAP ***************************************************************
172.16.1.31 : ok= changed= unreachable= failed=
172.16.1.41 : ok= changed= unreachable= failed=
172.16.1.8 : ok= changed= unreachable= failed=

5.6 剧本示例

5.6.1 剧本编写内容扩展:剧本任务编写多个任务

 - hosts: all
tasks:
- name: restart-network
cron: name='restart network' minute= hour= job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1'
- name: sync time
cron: name='sync time' minute=*/ job="/usr/sbin/ntpdate pool.ntp.com >/dev/null 2>&1"

5.6.2 剧本编写内容扩展:剧本任务编写多个主机

 - hosts: 172.16.1.7
tasks:
- name: restart-network
cron: name='restart network' minute= hour= job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1'
- name: sync time
cron: name='sync time' minute=*/ job="/usr/sbin/ntpdate pool.ntp.com >/dev/null 2>&1"
- hosts: 172.16.1.31
tasks:
- name: show ip addr to file
shell: echo $(hostname -i) >> /tmp/ip.txt

5.7 剧本编写方式

01.多主机单任务编写方式

02.多主机多任务编写方式

03.不同主机多任务编写方式

第6章 ansible编写剧本排错思路

6.1 剧本排错方法

1. ansible-playbook编写完,检査语法和模拟测试运行

2.打开剧本,定位异常问題原因,将剧本中的内容转换命令执行一次

3. 将参数中的脚本文件推送到远程屎务器,在远程服务器本地执行脚本 sh -x test.sh

说明:ansible执行时,加上-vvvv显示ansible详细执行过程,也可以定位异常原因

--syntax-check或-C ansible语法检查和模拟执行(彩排)

6.2 排错逻辑

01.剧本执行中的错误

02.把剧本中的内容转换为ansible命令执行

ansible banana -m yum -a "name=rsync state=installed"

03.把参数中的脚本文件推送到远端服务器,放在远端被管理服务器本地上执行

sh -x /server/scripts/test.sh

6.3 ansible无法正常使用

6.3.1 常见问题一:在被控端上 root@notty进程一直存在

 [root@backup ~]# ps -ef|grep sshd

 root               : ?        :: /usr/sbin/sshd
root : ? :: sshd: root@pts/
root : ? :: sshd: root@notty
root : pts/ :: grep --color=auto sshd

解决思路:kill pid将该进程杀死,然后使用ansible的 -vvvv 参数查看执行的错误信息

Loading callback plugin minimal of type stdout, v2. from /usr/lib/python2./site-packages/ansible/plugins/callback/__init__.pyc

META: ran handlers
Using module file /usr/lib/python2./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= -o ControlPath=/root/.ansible/cp/923ebeb605 172.16.1.8 '/bin/sh -c '"'"'echo ~ && sleep 0'"'"''

可能为:在/etc/ssh/sshd_config 文件中的第132行为空,导致sftp 无法连接出错

 Subsystem       sftp    /usr/libexec/openssh/sftp-server

6.3.2 常见问题二:

[root@m01 ~]# ansible -k 172.16.1.51 -m ping

SSH password:

[WARNING]: No hosts matched, nothing to do

解决思路:在ansible的hosts文件中,没有配置相应主机地址信息

6.3.3 常见问题三:

 # 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文件中没有受控端指纹信息

6.4 [附录]pssh命令使用扩展

6.4.1 pssh命令使用场景说明

背景:若同时给上千台服务器执行一个命令,拷贝一个文件,杀一个进程等,有什么简化运维管理的工具呢?

在小型企业中通常使用for循环,但是数量巨大时:一方面不确定操作是否成功;另一方面for循环语句性能不好估计且是否是同步并行执行,故此时会用到批量并行执行的命令如 pdsh,mussh,cssh,dsh等,及下面说明提到的pssh

6.4.2 pssh软件安装部署方式

①通过yum安装pssh软件

yum install -y pssh <-pssh软件下载需要依靠epel源

说明:pssh是一个软件大礼包,里面有很多软件命令

②通过编译方式安装pssh软件

 wget http://peak.telecommunity.com/dist/ez_setup.py
python ez_setup.py
wget http://parallel-ssh.googlecode.com/files/pssh-2.2.2.tar.gz
tar zxvf pssh-2.2..tar.gz
cd pssh-2.2.
python setup.py install

③pssh软件使用操作说明(ssh key认证密钥配置完毕)

01.pssh 多主机并行运行命令

 [root@server pssh-2.2.]# vim hosts_info.txt

 172.16.1.31:
172.16.1.41:
172.16.1.7: //注意我的端口号不仅是默认的22

说明:如果想将执行命令的批量输出信息重定向到一个文件 加-o 目录 选项

参数说明:

-h HOST_FILE,  --hosts=HOST_FILE       hosts file (each line "[user@]host[:port]")
-o OUTDIR, --outdir=OUTDIR output directory for stdout files (OPTIONAL)
-P, --print print output as we get it

02.pscp 把文件并行地复制到多个主机上(从服务器端给客户端传送文件)

[root@server pssh-2.2.]# pscp -h test.txt /etc/sysconfig/network /tmp/network

03.prsync 使用rsync协议从本地计算机同步到远程主机

[root@server ~]# pssh -h test.txt -P mkdir /tmp/etc

[root@server ~]# prsync -h test.txt -l dongwm -a -r /etc/sysconfig /tmp/etc

04.pslurp 将文件从远程主机复制到本地,和pscp方向相反

 [root@server ~]# pslurp -h test.txt   -L /tmp/test -l root /tmp/network test 

 [] :: [SUCCESS] 192.168.9.102
[] :: [SUCCESS] 192.168.9.104 [root@server ~]# ll /tmp/test/192.168.9.10
192.168.9.102/ 192.168.9.104/ [root@server ~]# ll /tmp/test/192.168.9.102/
总计 .0K
-rw-r--r-- root root -- : test [root@server ~]# ll /tmp/test/192.168.9.104/
总计 .0K
-rw-r--r-- root root -- : test

此笔记是本人学习摘记整理而成,此为初稿(尚有诸多不完善之处),原创作品允许转载,转载时请务必以超链接形式标明文章原始出处,作者信息和本声明,否则将追究法律责任。http://www.cnblogs.com/bananaaa/

ansible服务及剧本编写的更多相关文章

  1. Linux中ansible批量管理软件部署及剧本编写

    服务器版本信息: Centos6.9 [root@db02 ~]# uname -a Linux db02 2.6.32-696.el6.x86_64 #1 SMP Tue Mar 21 19:29: ...

  2. ansible服务部署与使用

    第1章 ssh+key实现基于密钥连接(ansible使用前提) 说明:    ansible其功能实现基于SSH远程连接服务    使用ansible需要首先实现ssh密钥连接 1.1 部署ssh ...

  3. ansible基础-playbook剧本的使用

    ansible基础-playbook剧本的使用 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.YAML概述 1>.YAML的诞生 YAML是一个可读性高,用来表达数据序 ...

  4. Ansible之playbook剧本

    Ansible之playbook剧本 目录 Ansible之playbook剧本 1. playbook的组成 2. 剧本示例test1 2.1 剧本制作 2.2 准备http.conf 2.3 运行 ...

  5. ansible服务模块和组模块使用

    本篇文章主要是介绍ansible服务模块和组模块的使用. 主要模块为ansible service module和ansible group moudle,下面的内容均是通过实践得到,可以直接运行相关 ...

  6. ansible基本命令及剧本

    ansible常用命令 1. -v, –verbose 详细模式,如果命令执行成功,输出详细的结果(-vv –vvv -vvvv) 2. -i, –inventory=PATH 指定host文件的路径 ...

  7. ansible 五 playbooks剧本使用

    一.Playbook 简介 Playbooks与Ad-Hoc相比,是一种完全不同的运用Ansible的方式,而且是非常之强大的:也是系统ansible命令的集合,其利用yaml语言编写,运行过程,an ...

  8. ansible的playbook剧本

    一.playbook剧本介绍 1)playbook介绍 Playbooks是Ansible的配置,部署和编排语言.它们可以描述您希望远程系统执行的策略,或一般IT流程中的一组步骤. 如果说ansibl ...

  9. ansible服务的部署与使用

      简介:   ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点,实现了批量系统配置.批量程序 ...

随机推荐

  1. .net SignalR winform 推送广播

    最近在做一个项目,需要用到服务端主动推送给客户端,最开始用的是自己比较顺手的Remoting,可后来发现把服务端架到外网上,就猴子它哥了,后来又尝试WCF,虽然能推送,但是推了几次也猴子它哥了,后来找 ...

  2. FreeRTOS 移植到WIN10

    背景 标题表述的不准确,大意是移植到WIN10的PC机,Intel I5. 最近因为项目接触了FreeRTOS 实时操作系统,想对这个操作系统有一个更深入的了解,所以决定下载源码看看,下面这个链接的随 ...

  3. ViewPager +无限轮播+滑动速度修改+指示小点

    养成习惯,做过代码记录总结. ViewPager 使用记录 1. ViewPage 位于V4包. 2.主要用来做banner轮播. 3.原理:适配器重用提高效率,与listview等一个原理. 下面记 ...

  4. react入门到进阶(一)

    一.何为react Facebook在F8会议上首次提出这个概念,一套全新的框架就此诞生. React 不是一个完整的 MVC.MVVM 框架,其只负责 View 层 React 跟 Web Comp ...

  5. linux网络、性能相关命令

    netstat -tunpl #查看进程列表 top #查看系统资源统计 服务器速度测试 ping 123.57.92.9 -t 每一个被发送出的IP信息包都有一个TTL域,该域被设置为一个较高的数值 ...

  6. Thinkphp使用phpexcel导入文件并写入数据库

    现实中,我们往往很多地方都需要这样批量导入数据,除了phpexcel还有csv等方法可以解决 下面详细介绍一下使用方法 首先在官方下载安装包解压到本地,然后复制保存到tp框架下的vendor目录下 h ...

  7. ##6.1 Neutron控制节点-- openstack pike

    ##6.1 Neutron控制节点 openstack pike 安装 目录汇总 http://www.cnblogs.com/elvi/p/7613861.html ##6.1 Neutron控制节 ...

  8. go语言常用开源库整理

    框架 https://github.com/go-martini/martini 图形验证码 https://github.com/dchest/captcha ORM https://github. ...

  9. React Native学习——动画Animated(笔记)

    很多地方都需要用到动画,先看下文档吧. 一.两个互补的动画系统 LayoutAnimation:用于全局的布局动画 Animated:用于创建更精细的交互控制的动画(主要是这个) 二.Animated ...

  10. liunx分布式监控工具

    监控你的WEB服务器或者WEB主机运行是否正常与健康是非常重要的.你要确保用户始终可以打开你的网站并且网速不慢.服务器监控工具允许你收集和分析有关你的Web服务器的数据. 有许多非常好的服务器监控解决 ...