自动化运维工具——ansible

一、简要

ansbile是一款简单的自动化运维工具
ansible是由主机清单(配置),playbook(配置),以及各模块插件组成;简单的说就是,用户(管理员)通过ansible的主机清单配置或Playbook配置(一组任务),调用ansible的各种模块及参数来对清单中的主机进行统一管理。
自动化运维工具——ansible_第1张图片

ansible的安装
# 首先要安装epel源
yum install epel-release -y
yum install ansible -y

二、配置及获取帮助说明

1、配置与执行文件说明

ansible的主配置文件

###### /etc/ansible/ansible.cfg
这个文件主要定义了roles_path路径,主机清单路径,连接清单中的主机方式等配置,这些大部的默认配置已经足够我们平时使用,如需要特别配置可以自行去修改;

###### /etc/ansible/hosts
这个配置文件就是默认主机清单配置文件,可通过ansible.cfg重新定义的

2、ansible 使用格式
ansible
HOST-PATTERN      #匹配主机模式,如all表示所有主机
-m MOD_NAME       #模块名   如:ping
-a MOD_ARGS        #模块执行的参数
-f FORKS                  #生成几个子进行程执行
-C                               #(不执行,模拟跑)
-u Username             #某主机的用户名
-c  CONNection        #连接方式(default smart)    

完整示例:

[root@ansible ~]# ansible all -m shell -a "ifconfig|grep enp0s3"
172.16.3.152 | SUCCESS | rc=0 >>
enp0s3: flags=4163  mtu 1500

172.16.3.216 | SUCCESS | rc=0 >>
enp0s3: flags=4163  mtu 1500
3、ansible-doc 获取帮助信息
ansible模块比较多,可以通过ansible-doc --help 显示帮助信息
ansible doc -l 获取所有当前版本下的可用模块及简要信息
ansible-doc -s 模块名 获取指定模块帮助信息说明``

三、ansible常用模块

1、copy模块

从本地copy文件分发到目录主机路径
参数说明:
src= 源文件路径
dest= 目标路径
注意src= 路径后面带/ 表示带里面的所有内容复制到目标目录下,不带/是目录递归复制过去
content= 自行填充的文件内容
owner 属主
group 属组
mode 权限
自动化运维工具——ansible_第2张图片

2、fetch模块

从远程主机拉取文件到本地自动化运维工具——ansible_第3张图片
说明:fetch使用很简单,src和dest,dest只要指定一个接收目录,默认会在后面加上远程主机及src的路径

3、command模块

在远程主机上执行命令,属于裸执行,非键值对显示;不进行shell解析;
自动化运维工具——ansible_第4张图片
自动化运维工具——ansible_第5张图片
这就是因为command模块不是shell解析属于裸执行导致的,为了能达成以上类似shell中的解析,ansible有一个shell模块;

4、shell模块

由于commnad只能执行裸命令(即系统环境中有支持的命令),至于管道之类的功能不支持,
shell模块可以做到
在这里插入图片描述

5、file模块

设置文件属性(创建文件)
常用参数:
path目标路径
state directory为目录,link为软件链接
group 目录属组
owner 属主
等,其他参数通过ansible-doc -s file 获取
自动化运维工具——ansible_第6张图片
创建软链接自动化运维工具——ansible_第7张图片

6、cron模块

通过cron模块对目标主机生成计划任务
常用参数:
除了分(minute)时(hour)日(day)月(month)周(week)外
name: 本次计划任务的名称
state: present 生成(默认) |absent 删除 (基于name)

ansible all -m cron -a 'name="a job for reboot" special_time=reboot job="/some/job.sh"'

ansible all -m cron -a 'name="yum autoupdate" weekday="2" minute=0 hour=12 user="root

ansible all -m cron  -a 'backup="True" name="test" minute="0" hour="5,2" job="ls -alh > /dev/null"'

ansilbe all -m cron -a 'cron_file=ansible_yum-autoupdate state=absent'
7、yum模块

故名思义就是yum安装软件包的模块;
常用参数说明:
enablerepo,disablerepo表示启用与禁用某repo库
name 安装包名
state (present’ orinstalled’, latest’)表示安装, (absent’ or `removed’) 表示删除自动化运维工具——ansible_第8张图片

8、service模块

服务管理模块
常用参数:
name:服务名
state:服务状态
enabled: 是否开机启动 true|false
runlevel: 启动级别 (systemed方式忽略)自动化运维工具——ansible_第9张图片

9、script模块

把本地的脚本传到远端执行;前提是到远端可以执行,不要把Linux下的脚本同步到windows下执行;
自动化运维工具——ansible_第10张图片

四、Playbook实战

playbook是Ansible的配置,部署和编排的语言。他们可以描述你所希望的远程系统强制执行的政策,或者在一般的IT流程的一组步骤;形象点的说就是:如果ansible的各模块(能实现各种功能)是车间里的各工具;playbook就是指导手册,目标远程主机就是库存和原料对象.

1、playbook的核心元素

hosts : playbook配置文件作用的主机
tasks: 任务列表 variables: 变量
templates:包含模板语法的文本文件
handlers :由特定条件触发的任务
roles:用于层次性、结构化地组织playbook。roles 能够根据层次型结构自动装载变量文件、tasks以及handlers等

2、playbook运行方式
ansible-playbook --check 	# 只检测可能会发生的改变,但不真执行操作
ansible-playbook --list-hosts	# 列出运行任务的主机
ansible-playbook --syntax-check playbook.yaml 	#语法检测
ansible-playbook -t TAGS_NAME playbook.yaml 	# 只执行TAGS_NAME任务
ansible-playbook playbook.yaml 	# 运行
3、通过playbook安装管理redis服务

第一步:在家目录下创建playbooks

[root@ansible ~]# mkidr playbooks  
[root@ansible ~]# cd playbooks 
[root@ansible playbooks]# cat redis_first.yaml
- hosts: all    remote_user: root   tasks:
  - name: install redis
    yum: name=redis state=latest

  - name: start redis
    service: name=redis state=started

第二步:语法检测

[root@ansible playbooks]# ansible-playbook --syntax-check redis_first.yaml 

playbook: redis_first.yaml

将要执行的主机:
[root@ansible playbooks]# ansible-playbook --list-hosts redis_first.yaml
playbook: redis_first.yaml
  play #1 (all): all    TAGS: []
    pattern: [u'all']
    hosts (2):
      192.168.0.88
      192.168.0.99

第三步:执行

[root@ansible playbooks]# ansible-playbook redis_first.yaml
PLAY [all] *****************************************************************************************************************
TASK [Gathering Facts] *****************************************************************************************************
ok: [192.168.0.88]
ok: [192.168.0.99]
TASK [install redis] *******************************************************************************************************
changed: [192.168.0.88]
changed: [192.168.0.99]
TASK [start redis] *********************************************************************************************************
changed: [192.168.0.88]
changed: [192.168.0.99]
PLAY RECAP *****************************************************************************************************************
192.168.0.88               : ok=3    changed=2    unreachable=0    failed=0   
192.168.0.99               : ok=3    changed=2    unreachable=0    failed=0   

# 说明:自上而下列出了三个任务,分别是[Gathering Facts] , [install redis], [start redis],其中各主机上成功为ok=3,有两项任务执行结果是changed
# 不可达 和失败的任务均为0;
# 由于上面的操作是直接安装redis服务并启动,并没有配置文件,这还不能往生产环境中使用,生产环境中的redis肯定有不同的配置项,因此需要在安装时提供配置文件
4、带配置文件的安装管理redis

第一步:复制一个redis.conf到本地并进行修改

[root@ansible ~]# ansible 192.168.0.88 -m fetch -a "src=/etc/redis.conf dest=./" 
[root@ansible ~]# mv /root/192.168.0.88/etc/redis.conf /root/playbooks/redis.conf

第二步:创建 .yaml 文件

[root@ansible playbooks]# vim redis_second.yaml
[root@ansible playbooks]# cat redis_second.yaml
- hosts: all                   #所有远程主机
  remote_user: root      #以远程主机上root用户执行
  tasks:                        #任务
  - name: install redis      #任务之安装
    yum: name=redis state=latest        #动作调用yum模块安装
  - name: copy config file     #任务之复制同步配置文件到远程目标主机
    copy: src=/root/playbooks/redis.conf dest=/etc/redis.conf owner=redis       #动作copy模块执行
    notify: restart redis      #触发的动作
    tags: configfile         #任务标记名configfile
  - name: start redis      #任务之启动redis
    service: name=redis state=started    #动作调用sevice模块
  handlers:              #特定情况下,接收到其他任务的通知时被触发
  - name: restart redis
    service: name=redis state=restarted

第三步:再次测试并执行

[root@ansible playbooks]# ansible-playbook  redis_second.yaml 

PLAY [all] ****************************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************************
ok: [192.168.0.88]
ok: [192.168.0.99]
TASK [install redis] ******************************************************************************************************
ok: [192.168.0.88]
ok: [192.168.0.99]
TASK [copy config file] ***************************************************************************************************
changed: [192.168.0.88]
changed: [192.168.0.99]
TASK [start redis] ********************************************************************************************************
ok: [192.168.0.88]
ok: [192.168.0.99]
RUNNING HANDLER [restart redis] *******************************************************************************************
changed: [192.168.0.88]
changed: [192.168.0.99]
PLAY RECAP ****************************************************************************************************************
192.168.0.88               : ok=5    changed=2    unreachable=0    failed=0   
192.168.0.99               : ok=5    changed=2    unreachable=0    failed=0 

可以发现只是加了一个配置文件,所有的任务都执行了,我们可以只执行新添加的任务。
这里就要通过 ansible-playbook -t TAGS_NAME 来执行了

[root@ansible playbooks]# ansible-playbook -t configfile redis_second.yaml 
PLAY [all] ****************************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************************
ok: [192.168.0.88]
ok: [192.168.0.99]
TASK [copy config file] ***************************************************************************************************
changed: [192.168.0.88]
changed: [192.168.0.99]
RUNNING HANDLER [restart redis] *******************************************************************************************
changed: [192.168.0.88]
changed: [192.168.0.99]
PLAY RECAP ****************************************************************************************************************
192.168.0.88               : ok=3    changed=2    unreachable=0    failed=0   
192.168.0.99               : ok=3    changed=2    unreachable=0    failed=0 

以上执行结果就只有更新和重启。

总结:

ansible通过常用模块在命令行就可以针对主机清单来管理配置远程主机,无需要代理客户端程序,但需要目标主机有ssh和python2.4+。

基于ssh协议既可以通过用户名和密码,也可以通过私钥,推荐使用私钥。

ansible-playbook 基于YAML语法配置,可以对playbook文件进行测试,解析并执行应用于指定无端主机,非常方便我们统一编排分发管理远程主机。

你可能感兴趣的:(笔记,学习,linux,运维)