python ansible服务及剧本编写


Posted in Python onDecember 29, 2017

第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 2 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.6 (r266:84292, Aug 18 2016, 15:13:37) [GCC 4.4.7 20120313 (Red Hat 4.4.7-17)]

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=0 >> #主机IP|请求状态|返回值(0即成功,否则失败)
nfs01       #命令输出结果
172.16.1.8 | SUCCESS | rc=0 >>
web01
172.16.1.41 | SUCCESS | rc=0 >>
backup

2.6.1 ansible命令输出信息说明

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

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

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

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

3.1 语法格式图示

python ansible服务及剧本编写

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       

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.6/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=0 >>
Thu Oct 19 17:12:27 CST 2017
172.16.1.31 | SUCCESS | rc=0 >>
Thu Oct 19 17:12:28 CST 2017
172.16.1.41 | SUCCESS | rc=0 >>
Thu Oct 19 17:12:27 CST 2017

实例02.

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

实例03.

[root@m01 ~]# ansible banana -m command -a "pwd creates=/tmp/banana_file"
172.16.1.31 | SUCCESS | rc=0 >>
skipped, since /tmp/banana_file exists
172.16.1.8 | SUCCESS | rc=0 >>
/root
172.16.1.41 | SUCCESS | rc=0 >>
/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": 500,
 "group": "banana",
 "md5sum": "8c2b120b4742a806dcfdc8cfff6b6308",
 "mode": "0600",
 "owner": "banana",
 "size": 357,
 "src": "/root/.ansible/tmp/ansible-tmp-1508410846.63-224022812989166/source",
 "state": "file",
 "uid": 500
}

实例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": 0,
 "group": "root",
 "md5sum": "fe08440ffebed54cab7a9b4cb3c3beda",
 "mode": "0644",
 "owner": "root",
 "size": 371,
 "src": "/etc/hosts",
 "state": "file",
 "uid": 0
}

实例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": 500,
 "group": "banana",
 "md5sum": "0a6bb40847793839366d0ac014616d69",
 "mode": "0600",
 "owner": "banana",
 "size": 13,
 "src": "/root/.ansible/tmp/ansible-tmp-1508649097.07-180967115147583/source",
 "state": "file",
 "uid": 500
}

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=0 >> 
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=0 >>
172.16.1.8 | SUCCESS | rc=0 >>
172.16.1.31 | SUCCESS | rc=0 >>

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

4.6 script模块

[root@m01 ~]# ansible banana -m script -a "/server/scripts/ip.sh"
172.16.1.8 | SUCCESS => {
 "changed": true,
 "rc": 0,
 "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": 0,
 "group": "root",
 "mode": "0755",
 "owner": "root",
 "path": "/tmp/banana_dir",
 "size": 4096,
 "state": "directory",
 "uid": 0
}

实例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": 0,
 "group": "root",
 "mode": "0644",
 "owner": "root",
 "size": 0,
 "state": "file",
 "uid": 0
}

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": 0,
 "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=0 >>
#time sync by banana at 2017-10-1
#web_backup by rsync
#*/5 * * * * /bin/sh /server/scripts/web_backup.sh &>/dev/null
#Ansible: banana666
#00 00 * * * /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": "0",
 "fstab": "/etc/fstab",
 "fstype": "nfs",
 "name": "/mnt",
 "opts": "ro",
 "passno": "0",
 "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": "0",
 "fstab": "/etc/fstab",
 "fstype": "nfs",
 "name": "/mnt",
 "opts": "ro",
 "passno": "0",
 "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 01.yml  进行剧本配置信息语法检查
ansible-playbook -C 01.yml  模拟剧本执行(彩排)

5.5.1 语法检查

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

5.5.2 模拟剧本执行

[root@m01 ansible-playbook]# ansible-playbook -C 01.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=2  changed=0  unreachable=0  failed=0
172.16.1.41        : ok=2  changed=0  unreachable=0  failed=0
172.16.1.8         : ok=2  changed=0  unreachable=0  failed=0

5.6 剧本示例

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

- hosts: all
  tasks:
   - name: restart-network
    cron: name='restart network' minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1'
   - name: sync time
    cron: name='sync time' minute=*/5 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=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1'
   - name: sync time
    cron: name='sync time' minute=*/5 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编写完,检?擞锓ê湍D獠馐栽诵?/p>

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   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 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

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.2.tar.gz
 cd pssh-2.2.2
 python setup.py install

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

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

[root@server pssh-2.2.2]# vim hosts_info.txt
 172.16.1.31:22
 172.16.1.41:22
 172.16.1.7:22 //注意我的端口号不仅是默认的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.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 
[1] 14:53:54 [SUCCESS] 192.168.9.102 9922
[2] 14:53:54 [SUCCESS] 192.168.9.104 9922
[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/
总计 4.0K
-rw-r--r-- 1 root root 60 2011-04-22 14:53 test
[root@server ~]# ll /tmp/test/192.168.9.104/
总计 4.0K
-rw-r--r-- 1 root root 60 2011-04-22 14:53 test

总结

以上所述是小编给大家介绍的ansible服务及剧本编写,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python判断字符串与大小写转换
Jun 08 Python
python 连接各类主流数据库的实例代码
Jan 30 Python
python使用代理ip访问网站的实例
May 07 Python
Python计算一个给定时间点前一个月和后一个月第一天的方法
May 29 Python
Python实现对字典分别按键(key)和值(value)进行排序的方法分析
Dec 19 Python
spark dataframe 将一列展开,把该列所有值都变成新列的方法
Jan 29 Python
Python获取时间戳代码实例
Sep 24 Python
Centos7 下安装最新的python3.8
Oct 28 Python
TensorFlow2.0:张量的合并与分割实例
Jan 19 Python
python使用Thread的setDaemon启动后台线程教程
Apr 25 Python
python源码剖析之PyObject详解
May 18 Python
Python日志模块logging用法
Jun 05 Python
详解python 拆包可迭代数据如tuple, list
Dec 29 #Python
详解Python异常处理中的Finally else的功能
Dec 29 #Python
Python2.7+pytesser实现简单验证码的识别方法
Dec 29 #Python
Python实现破解12306图片验证码的方法分析
Dec 29 #Python
解决python使用open打开文件中文乱码的问题
Dec 29 #Python
python爬虫获取京东手机图片的图文教程
Dec 29 #Python
python通过getopt模块如何获取执行的命令参数详解
Dec 29 #Python
You might like
一道关于php变量引用的面试题
2010/08/08 PHP
PHP 多维数组的排序问题 根据二维数组中某个项排序
2011/11/09 PHP
(PHP实现)只使用++运算实现加法,减法,乘法,除法
2013/06/27 PHP
PHP加密3DES报错 Call to undefined function: mcrypt_module_open() 如何解决
2016/04/17 PHP
php微信高级接口群发 多客服
2016/06/23 PHP
PHP中的多种加密技术及代码示例解析
2016/10/20 PHP
phpcms中的评论样式修改方法
2016/10/21 PHP
Laravel Validator自定义错误返回提示消息并在前端展示
2019/05/09 PHP
解决PhpStorm64不能启动的问题
2020/06/20 PHP
javascript replace方法与正则表达式
2008/02/19 Javascript
从jQuery.camelCase()学习string.replace() 函数学习
2011/09/13 Javascript
用js实现控件的隐藏及style.visibility的使用
2013/06/14 Javascript
js整数字符串转换为金额类型数据(示例代码)
2013/12/26 Javascript
jQuery中:text选择器用法实例
2015/01/03 Javascript
JavaScript学习笔记之JS函数
2015/01/22 Javascript
jQuery实现跨域
2015/02/03 Javascript
JQuery标签页效果实例详解
2015/12/24 Javascript
JS 实现导航菜单中的二级下拉菜单的几种方式
2016/10/31 Javascript
JavaScript中英文字符长度统计方法示例【按照中文占2个字符】
2017/01/17 Javascript
node实现的爬虫功能示例
2018/05/04 Javascript
详解Angular6.0使用路由步骤(共7步)
2018/06/29 Javascript
微信小程序使用map组件实现路线规划功能示例
2019/01/22 Javascript
vue+element模态框中新增模态框和删除功能
2019/06/11 Javascript
python中的多线程实例教程
2014/08/27 Python
Python实现将doc转化pdf格式文档的方法
2018/01/19 Python
Python处理文本换行符实例代码
2018/02/03 Python
Django 用户认证Auth组件的使用
2020/11/30 Python
VSCODE配置Markdown及Markdown基础语法详解
2021/01/19 Python
Python创建自己的加密货币的示例
2021/03/01 Python
CSS3中的元素过渡属性transition示例详解
2016/11/30 HTML / CSS
html2canvas把div保存图片高清图的方法示例
2018/03/05 HTML / CSS
客服实习的个人自我鉴定
2013/10/20 职场文书
2014年幼儿园园务工作总结
2014/12/05 职场文书
《我的美好婚事》动画化决定纪念插画与先导PV公开
2022/04/06 日漫
MySQL数据库如何查看表占用空间大小
2022/06/10 MySQL
Spring Boot项目如何优雅实现Excel导入与导出功能
2022/06/10 Java/Android