gpt4 book ai didi

python ansible服务及剧本编写

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章python ansible服务及剧本编写由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

第1章 ansible软件概念说明 。

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

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

?
1
2
3
4
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.创建密钥信息(自动化免交互创建) 。

?
1
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免密码登录方式 。

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

?
1
2
3
4
5
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安装的软件 。

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

客户端配置 。

?
1
yum install libselinux - python - y

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

2.4 ③管理端m01安装ansible软件 。

?
1
yum install ansible - y

2.4.1 查看版本信息 。

?
1
2
3
4
5
[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 查看软件相关安装信息 。

?
1
2
3
4
5
6
7
[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 软件安装目录信息 。

?
1
2
3
4
5
[root@m01 ~] # tree /etc/ansible/
  / etc / ansible /
  ├── ansible.cfg #ansible配置
  ├── hosts #被ansible管理的主机名单(分组)
  └── roles

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

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

?
1
2
3
4
5
6
7
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 ⑤实践测试 。

?
1
2
3
4
5
6
7
[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        <-查看全部模块列表信息 。

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

4.1 ping模块 。

?
1
2
3
4
5
6
7
8
9
[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连接测试成功结果 。

?
1
2
3
4
5
6
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 。

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

实例:

?
1
2
3
4
[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. 。

?
1
2
3
4
5
6
7
[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. 。

?
1
2
3
4
5
6
7
[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. 。

?
1
2
3
4
5
6
7
[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:设置打印自定义消息;如果忽略,则打印通用信息 。

?
1
2
3
4
5
6
7
8
9
10
[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 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[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参数 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[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默认没有换行 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[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.把脚本文件复制到远程服务器,执行远程服务器的脚本 。

?
1
2
3
4
5
[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 。

?
1
2
3
4
[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模块 。

?
1
2
3
4
5
6
7
8
9
10
11
12
[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.创建远端目录 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
[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.创建远端文件 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
[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 。

安装 。

?
1
2
3
4
5
6
7
8
9
[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 。

设置开机自启动 。

?
1
2
3
4
5
6
7
[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.创建定时任务 。

?
1
2
3
4
5
6
7
8
9
10
[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.删除定时任务 。

?
1
2
3
4
5
6
7
8
[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.查看定时任务 。

?
1
2
3
4
5
6
7
[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.从远程主机拉取文件 。

?
1
2
3
4
5
6
7
8
9
[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.拉取时不创建目录(同名文件会覆盖) 。

?
1
2
3
4
5
6
7
8
9
10
[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.挂载 。

?
1
2
3
4
5
6
7
8
9
10
11
[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.卸载 。

?
1
2
3
4
5
6
7
8
9
10
11
12
[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 剧本书写格式 。

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

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

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

5.4.1 剧本格式示例 。

?
1
2
3
4
5
6
[root@m01 ansible - playbook] # vim rsync_sever.yml
 
  - hosts: 172.16 . 1.41
   tasks:
    - name: install rsync
     yum: name = rsync state = installed

5.5 剧本编写后检查方法 。

?
1
2
ansible - playbook - - syntax - check 01.yml  进行剧本配置信息语法检查
ansible - playbook - C 01.yml  模拟剧本执行(彩排)

5.5.1 语法检查 。

  。

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

5.5.2 模拟剧本执行 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[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 剧本编写内容扩展:剧本任务编写多个任务 。

?
1
2
3
4
5
6
- 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 剧本编写内容扩展:剧本任务编写多个主机 。

?
1
2
3
4
5
6
7
8
9
10
- 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命令执行 。

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

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

?
1
sh - x / server / scripts / test.sh

6.3 ansible无法正常使用 。

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

?
1
2
3
4
5
[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 参数查看执行的错误信息 。

?
1
2
3
4
5
6
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 无法连接出错 。

?
1
133 Subsystem    sftp  / usr / libexec / openssh / sftp - server

6.3.2 常见问题二:

?
1
2
3
[root@m01 ~] # ansible -k 172.16.1.51 -m ping
  SSH password:
  [WARNING]: No hosts matched, nothing to do

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

6.3.3 常见问题三:

?
1
2
3
4
5
6
# 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软件 。

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

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

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

?
1
2
3
4
5
6
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 多主机并行运行命令 。

?
1
2
3
4
[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 目录 选项 。

参数说明:

?
1
2
3
- 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 把文件并行地复制到多个主机上(从服务器端给客户端传送文件) 。

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

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

?
1
2
[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方向相反 。

?
1
2
3
4
5
6
7
8
9
10
11
[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服务及剧本编写,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我网站的支持! 。

原文链接:https://www.cnblogs.com/bananaaa/p/8143345.html 。

最后此篇关于python ansible服务及剧本编写的文章就讲到这里了,如果你想了解更多关于python ansible服务及剧本编写的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com