第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 语法格式图示
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.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编写完,检査语法和模拟测试运行
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 "htmlcode">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-server6.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命令使用场景说明
背景:若同时给上千台服务器执行一个命令,拷贝一个文件,杀一个进程等,有什么简化运维管理的工具呢"htmlcode">
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 it02.pscp 把文件并行地复制到多个主机上(从服务器端给客户端传送文件)
[root@server pssh-2.2.2]# pscp -h test.txt /etc/sysconfig/network /tmp/network03.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/etc04.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服务及剧本编写,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新动态
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]