本文转自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语法参数总结

语法格式

ansiblegroup_name-mcommand-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计划任务管理模块
yumyum软件包安装管理模块
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详细执行过程,也可以定位异常原因