本文转自https://www.cnblogs.com/bananaaa/p/8143345.html

ansible概述

ansible是基于python开发的自动化运维工具(saltstack),其功能实现基于SSH远程连接服务;ansible可实现批量系统配置、批量文件拷贝、批量运行命令的功能

软件特点

不需要单独安装客户端(no agent),基于系统自身的sshd服务

不需要服务端(no server)

需要依赖大量的模块实现批量管理

配置文件无需配置

批量管理-自动化管理方案

简单/易用/强大的选择是ssh key+shell/pssh方案

方法:

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

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

sina cfengine/puppet较早,现在基本没有企业使用

门户级别常用puppet批量管理(复杂/笨重)

saltstack:简单,功能强大(配置复杂)

ansible软件实践部署

1、yum安装:需要先配置epel源

2、基于python pip库安装。参考《ansible简易安装》

部署完成后需要生成公钥,并对受管主机进行免密操作,方便日常运维

[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剧本命令

主机管理方法

配置hosts文件文件格式

[group_name]
IP
IP
...

ansible语法参数总结

语法格式

ansible group_name -m command -a 'command'
命令 主机组模块名 指定模块参数 模块名称 指定利用模块执行的动作参数 执行的命令/脚本
命令参数 参数说明
-m module_name

相应名称的模块被执行

-m后边是模块的名称

-a module_args

模块参数信息

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

-C,--check 不做任何改变,只是尝试预言一些可能出现的改变
--syntax-check 执行语法检查再剧本上,但是并不执行剧本

ansible常用模块

常用模块 模块说明
command(重要模块) 执行命令模块,ansible命令执行默认模块
shell(重要模块) 执行shell脚本模块
script(重要模块) 把脚本发到客户端然后执行,执行脚本命令再远程服务器上
copy(重要模块) 把本地文件发送到远端
file 设定文件属性模块
service 系统服务管理模块
cron 计划任务管理模块
yum yum软件包安装管理模块
synchronize 使用rsync同步文件模块
mount 挂载模块

ansible帮助信息系统中查看方法:

ansible-doc -l  查看全部模块列表信息

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

ping模块

测试主机连通性

ansible group -m ping

模块概要:

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

非传统ICMP ping,而是先检查是否通过ssh登陆节点,再检查python版本是否满足要求,能满足要求返回pong

command模块

常见模块 模块说明
chdir

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

ansible group_name -m command -a "chdir=/tmp ls"
create 定义一个文件是否存在,如果不存在运行相应命令,如果存在跳过此步骤 ansible group_name -m command -a "pwd creates=/tmp/test_file"
executable 改变shell使用command进行执行,并且执行时要使用绝对路径
free_from 命令模块采用自由形式命令运行,即可以输入任意Linux命令
removes 定义一个文件是否存在,如果存在运行相应命令,如果不存在跳过此步骤
warn 如果ansible配置文件中定义了命令警告,如果参数设置了no/false,将不会警告此行命令

模块概要:

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

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

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

debug模块

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

ansible group_name -m debug -a "msg=hello"

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

copy模块

参数

参数说明

src

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

remote_src

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

dest

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

owner

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

group

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

mode

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

backup

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

content

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

force

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

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

directory_mode

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

模块概要:

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

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

将test.txt文件复制到远程主机,权限0600,属主、属组为appuser

ansible group_name -m copy -a "src=/test.txt dest=/tmp/ mode=0600 owner=appuser group=appuser"

移动远程主机上的文件到某个位置remote_src=true参数

拷贝test.txt文件到tmp下,权限600

ansible group_name -m copy -a "remote_src=true src=/opt/test.txt dest=/tmp mode=0600"

通过content定义文件内容,默认不换行

ansible group_name -m copy -a "content=helloworld dest=/opt/test.txt"

shell模块

shell模块在远程执行脚本时,远程主机上一定要有相应的脚本,且脚本路径一致

ansible group_name -m shell -a "sh /path/test.sh"

执行shell语句

ansible group_name -m shell -a "cat /etc/passwd >> /tmp/test.txt"

script模块

script与shell的区别

shell:需要脚本文件都在远端服务器的相同位置才能执行脚本

script:只需要本地有脚本文件,不要将脚本复制到远端服务器,是将脚本的执行过程在远端服务器执行

ansible group_name -m script -a "/test.sh"

file模块

参数

参数说明

owner

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

group

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

mode

设置文件数据权限信息

dest

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

src

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

state

参数

参数说明

directory

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

file

文件不存在将不能被创建

link

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

hard

创建出硬链接

absent

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

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

touch

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

创建远端目录

ansible group_name -m file -a "dest=/tmp/test_dir state=directory"

创建远端文件

ansible group_name -m file -a "dest=/tmp/test_txt state=touch"

yum模块

参数

参数说明

name=name

指定安装的软件

state=installed

安装

远端安装apache

ansible group_name -m yum -a "name=httpd state=installed"

state状态均为过去是ed/d

service模块

参数

参数说明

name=service name

服务的名称

state=参数

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

stared/stoped/restarted/reloaded

enabled=yes

设置开机自启动

重启计划任务服务,name为服务名称,state为动作,并取消开机自启动

ansible group_name -m service -a "name=crond state=restarted enabled=no"

cron模块

参数
说明
minute 用于设置计划任务中分钟的值,比如minute=5为每小时的5分钟,默认为*
hour 用于设置计划任务中小时的值,与分钟一致
day 用于设置计划任务中日的值
month
用于设置计划任务中月的值
weekday 用于设置计划任务中周几的值
special_time

计划任务的时间设定格式为 @reboot 或者@hourly。@reboot 表示重启时执行,@hourly 表示每小时执行一次,相当于设置成”0 0 * * *” ,这种@开头的时间设定格式则需要使用 special_time 参数进行设置,special_time 参数的可用值有 reboot(重启后)、yearly(每年)、annually(每年,与yearly相同)、monthly(每月)、weekly(每周)、daily(每天)、hourly(每时)

注意:当上述时间单位设定参数都未指定时,计划任务的时间设定默认会被设定为”* * * * *”,这样表示每秒都会执行一次计划任务,所以,在使用cron模块时,我们应该确定对应的时间参数设置正确

user
此参数用于设置当前计划任务所属的用户,默认为root
job 用于指定计划任务中需要执行的命令或者脚本
name
此参数用于设置计划任务名称,计划任务名称辉在注释中显示,当不指定计划任务的名称时,会默认为计划任务加注释,计划任务名称应该具有唯一性,方便以后修改名称或删除计划任务
state 当计划任务有名称时,我们可以根据名称修改或删除对应的任务,当删除计划任务时,需要将state设置为absent
disabled

当计划任务有名称时,我们可以根据名称使对应的任务失效

注意,此参数除了需要指定任务的名称,还愮同时指定任务的job以及任务的时间设定,而且任务的时间设定必须和对应任务完全相同,否则再注释任务的同时,任务的时间设定会被修改

backup

如果参数设置为yes,那么修改或删除对应的计划任务时,会先对计划任务进行备份,然后再对计划任务进行修改或删除,cron模块会再远程主机的/tmp目录下创建备份文件,以crontab开头并且随机加入一些字符,具体的备份文件名称会在返回信息的backup_file字段中看到,推荐将此参数设置为yes

创建定时任务,name识别定时任务唯一性,只管理ansible信息

ansible group_name -m cron -a "name=01 minute=*/5 job='/usr/sbin/ntpdate time.nist.gov > /dev/null 2>&1'"

删除定时任务

ansible group_name -m cron -a "name=None minute=*/5"

fetch模块

参数

参数说明

dest

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

src

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

flat

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

拉取远端主机文件

ansible group_name -m fetch -a "dest=/tmp src=/tmp/test.txt"

拉取时不创建目录(同名会覆盖)

ansible group_name -m fetch -a "dest=/tmp/ src=/tmp/test.log flat=yes"

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,但不影响目前的挂载

挂载

ansible group_name -m mount -a "fstype=nfs opts=ro src=xxx.xxx.xxx.xxx:/dirname path=/mnt state=mounted"

卸载

ansible group_name -m mount -a "fstype=nfs opts=ro src=xxx.xxx.xxx.xxx:/dirname path=/mnt state=umounted"

palybook编写

ansible特点:

  • 可以实现批量管理、部署

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

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

  • 编写剧本(playbook)针对重复性操作

ansible核心功能

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

  • paramiko:远程连接与数据传输

  • Jinja2:用于编写ansible模板信息

playbook编写规则:

    1. 缩进/空格

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

    2. 冒号

      1.  每个冒号前后一定要有空格(以冒号结尾不需要空格,表示路径的模板不需要空格)

    3. 短横线

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

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

剧本示例:vim httpd.yml

install httpd    #名称
- hosts: 192.168.40.110   #所处理的服务器IP,可以为all格式(-(空)hosts:(空)IP/all)
 tasks:                 #要做什么
   - name: install httpd  #要做的事情
    yum: name=httpd state=installed #模块名称:(空)模块对应的功能

剧本检查方法

ansible-playbook --syntax-check httpd.yml ##语法检查
ansible-playbook -C httpd.yml ##剧本模拟(彩排)可以查看修改了哪些内容

完整示例安装、启动和停止、卸载apache

install and uninstall httpd
- hosts: 192.168.40.110
 tasks:
   - name: install httpd
    yum: name=httpd state=installed
   - name: start httpd
    service:
      name: httpd
      state: started
      enabled: true
   - name: stop httpd
    service: name=httpd state=stopped
   - name: uninstall httpd
    yum: name=httpd state=removed

多主机格式

- hosts: 10.1.1.x
  tasks:
    - name: xxxx
      module: name=xxx state=xxxx
- hosts: 10.1.1.x
  tasks:
    - name: xxxx
      module: name=xxx state=xxxx

剧本排错方法

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

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

  3. 将参数中的脚本文件推送到远程服务器,再远程服务器本地执行脚本

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