ansible批量管理服务

一、ansible软件是什么?

1、ansible概念

  • ansible主要实现批量管理服务器,是基于python语言开发的自动化软件工具,基于SSH远程管理服务实现远程主机批量管理。
  • 串行批量管理:依次安装软件
  • 并行批量管理:同时进行安装软件

2、ansible软件作用

  • 批量管理系统服务
  • 批量管理服务部署
  • 批量分发数据信息
  • 批量采集数据信息

3、ansible软件意义

  • 提高工作效率
  • 提高工作准确度
  • 较少维护成本
  • 较少重复性工作

4、ansible软件特点

  • 管理端不需要启动服务程序
  • 管理端不需要编写配置文件
  • 受控制端不需要安装软件程序
  • 受控制端不需要启动服务程序
  • 服务程序管理操作模块多
  • 利用剧本编写来实现自动化

二、ansible软件功能组成

1、ansible主机清单inventory

2、ansible模块功能Module index

3、ansible剧本编写Playbook

4、ansible网络模块Network Module

三、ansible软件安装配置

1、yum install -y ansible

2、确认秘钥分发完成

测试:ssh 172.16.1.7 hostname
秘钥分发脚本

 for ip in {7,31,41}
    do 
       echo "=============== fenfa pub_key with 172.16.1.$ip =============== "
       sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub 172.16.1.$ip -o StrictHostKeyChecking=no &>/dev/null
       if [ $? -eq 0 ]
       then
          echo "公钥信息分发成功 [ok]"  
          echo ""         
       else
          echo "公钥信息分发失败 [failed]"
          echo ""
       fi
    done

秘钥检查 脚本

#!/bin/bash
    for ip in {7,31,41}
    do 
       echo "=============== check pub_key with 172.16.1.$ip =============== "
       ssh 172.16.1.$ip hostname >/dev/null
       if [ $? -eq 0 ]
       then
          echo "分发测试检查成功 [ok]"  
          echo ""         
       else
          echo "公钥测试检查失败 [failed]"
          echo ""
       fi
    done

3、确认epel源更新完成

4、配置目录

/etc/ansible/ansible.cfg 默认配置文件,添加及时生效
/etc/ansible/hosts 主机清单,定义可以管理的主机
/etc/ansible/roles 角色目录,规范化配置

5、ansible常用两个命令

/usr/bin/ansible
/usr/bin/ansible-playbook

6、ansible软件主机清单配置

①简单配置

vim /etc/ansible/hosts
172.16.1.7
172.16.1.31
172.16.1.41
[root@guanli ~]# ansible 172.16.1.7 -m  command -a "hostname"
172.16.1.7 | CHANGED | rc=0 >>
web01

②分组配置

vim /etc/ansible/hosts
[web]
172.16.1.7
[nfs]
172.16.1.31
172.16.1.41
[root@guanli ~]# ansible nfs -m  command -a "hostname"
172.16.1.31 | CHANGED | rc=0 >>
nfs01

172.16.1.41 | CHANGED | rc=0 >>
backup

③符号匹配配置

vim /etc/ansible/hosts
[web]
172.16.1.7
[nfs]
172.16.1.[30:40]
172.16.1.[1:100]
[root@guanli ~]# ansible all -m  command -a "hostname"
172.16.1.7 | CHANGED | rc=0 >>
web01

172.16.1.31 | CHANGED | rc=0 >>
nfs01

172.16.1.41 | CHANGED | rc=0 >>
backup

④配置特殊变量信息

vim /etc/ansible/hosts
[web]
172.16.1.7 ansible_user=root ansible_password=123456 ansible_port=22
[nfs]
172.16.1.[30:40]
172.16.1.[1:100]

⑤嵌入式方式配置

vim /etc/ansible/hosts
[rsync:children]
rsync_server
rsync_client

[rsync_server]
172.16.1.41

[rsync_client]
172.16.1.7
172.16.1.31

[nfs_server]
172.16.1.31
[root@guanli ~]# ansible rsync -m  command -a "hostname"
172.16.1.7 | CHANGED | rc=0 >>
web01

172.16.1.31 | CHANGED | rc=0 >>
nfs01

172.16.1.41 | CHANGED | rc=0 >>
backup

⑥嵌入变量配置

vim /etc/ansible/hosts
[rsync:children]
rsync_server
rsync_client

[rsync_server]
172.16.1.41

[rsync_client]
172.16.1.7
172.16.1.31

[rsync_client:vars]
ansible_user=root
ansible_password=123456
ansible_port=22
[root@guanli ~]# ansible rsync_client -m  command -a "hostname"
172.16.1.31 | CHANGED | rc=0 >>
nfs01

172.16.1.7 | CHANGED | rc=0 >>
web01

7、ansible管理多台主机命令

语法格式
ansible 主机信息 -m 指定使用模块 -a 指定完成动作 "执行的命令"

四、ansible软件应用方法

1、模块

常用模块

①command(默认)

批量管理远程节点执行命令模块,一些特殊符号未能识别(参考官网)。

  • creates 创建目录,目录存在,不执行
  • removes 如果不存在 不执行
  • chdir 在执行命令操作前进行切换目录
[root@guanli ~]# ansible jzyue  -a "hostname"
172.16.1.7 | CHANGED | rc=0 >>
web01

②shell(万能模块)

  • creates 创建目录,目录存在,不执行
  • removes 如果不存在 不执行
  • chdir 在执行命令操作前进行切换目录

③copy

作用1:将管理端主机数据文件分发给被管理端
作用2:将被管理端目录中的数据移动到其他目录

  • src:将管理端什么数据进行分发
  • dest:将数据分发到远程主机什么路径中
  • owner:传输文件之后修改文件属主权限
  • group:传输文件后修改文件属组权限
  • mode:直接修改文件权限位(12位)
ansible 172.16.1.7 -m copy -a "src=/etc/hosts dest=/tmp owner=oldboy group=oldboy mode=666"
  • backup:分发传输之前将源文件按时间进行备份
  • remote_src:备份远程主机文件,no为管理端找数据进行分发,yes为被管理端找数据进行分发。
ansible 172.16.1.7 -m copy -a "dest=/etc/hosts src=/tmp/hosts.bak owner=oldboy group=oldboy mode=666 remote_src=yes"
  • content:在分发文件时创建简单信息
ansible 172.16.1.7 -m copy -a "content='oldboy123' dest=/tmp/oldboy.txt  mode=600"

④fetch

将远程数据进行拉取文件

  • src:远程主机数据信息
  • dest:本地保存数据的路径

⑤file

修改文件属性信息,用于创建数据信息(文件 目录 链接文件 删除数据)

  • path:指定处理的文件数据路径
  • owner:传输文件之后修改文件属主权限
  • group:传输文件后修改文件属组权限
  • mode:直接修改文件权限位(12位)
  • state:创建文件、目录、硬链接、软链接、删除数据信息
创建文件
[root@guanli ~]# ansible 172.16.1.7 -m file -a "path=/tmp/test.txt state=touch"
172.16.1.7 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "dest": "/tmp/test.txt", 
    "gid": 0, 
    "group": "root", 
    "mode": "0644", 
    "owner": "root", 
    "size": 0, 
    "state": "file", 
    "uid": 0
}
创建目录
[root@guanli ~]# ansible 172.16.1.7 -m file -a "path=/tmp/dir state=directory"
172.16.1.7 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "gid": 0, 
    "group": "root", 
    "mode": "0755", 
    "owner": "root", 
    "path": "/tmp/dir", 
    "size": 6, 
    "state": "directory", 
    "uid": 0
}
创建软连接
[root@guanli ~]# ansible 172.16.1.7 -m file -a "src=/tmp/test.txt path=/tmp/testsoftlink  state=link"
172.16.1.7 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "dest": "/tmp/testsoftlink", 
    "gid": 0, 
    "group": "root", 
    "mode": "0777", 
    "owner": "root", 
    "size": 13, 
    "src": "/tmp/test.txt", 
    "state": "link", 
    "uid": 0
}
创建硬链接
[root@guanli ~]# ansible 172.16.1.7 -m file -a "src=/tmp/test.txt path=/tmp/testhardlink  state=hard"
172.16.1.7 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "dest": "/tmp/testhardlink", 
    "gid": 0, 
    "group": "root", 
    "mode": "0644", 
    "owner": "root", 
    "size": 0, 
    "src": "/tmp/test.txt", 
    "state": "hard", 
    "uid": 0
}
删除数据信息
[root@guanli ~]# ansible 172.16.1.7 -m file -a "path=/tmp/testsoftlink  state=absent"
172.16.1.7 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "path": "/tmp/testsoftlink", 
    "state": "absent"
}
删除目录
[root@guanli ~]# ansible 172.16.1.7 -m file -a "path=/tmp/dir  state=absent"
172.16.1.7 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "path": "/tmp/dir", 
    "state": "absent"
}
[root@guanli ~]# ansible jzyue -m file -a "path=/tmp/dir{1..3}  state=absent"
172.16.1.7 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "path": "/tmp/dir{1..3}", 
    "state": "absent"
}

⑥script

批量执行脚本信息,需完成以下两步:

  • 编写脚本
  • 批量运行脚本
[root@guanli scrips]# ansible jzyue -m script -a "/server/scrips/yum.sh"

⑦yum

批量部署软件程序

  • name:指定安装软件名称
  • state:安装和卸载程序
[root@guanli scrips]# ansible jzyue -m yum -a "name=htop state=installed"
172.16.1.7 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "msg": "", 
    "rc": 0, 
    "results": [
        "htop-2.2.0-3.el7.x86_64 providing htop is already installed"
    ]
}

⑧service

批量管理服务运行状态

  • name:指定服务名称
  • state:指定参数started restarted reload stopped
  • enabled:设置开机是否自动运行,yes启动,no不启动。

⑨cron

批量设置定时任务

  • name:定义任务注释信息
  • minute:分钟信息
  • hour:小时信息
  • day:日期信息
  • month:表示月份信息
  • weekday:表示星期信息
  • job:定义任务信息
  • state:present创建定时任务,absent删除定时任务。
创建定时任务
[root@guanli ~]# ansible jzyue -m cron -a "name='date sync' minute=*/5 job='ntpdate ntp1.aliyun.com &>dev/null' "
172.16.1.7 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "envs": [], 
    "jobs": [
        "date sync"
    ]
}
删除定时任务
[root@guanli ~]# ansible jzyue -m cron -a "name='date sync' state=absent  "
172.16.1.7 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "envs": [], 
    "jobs": []
}

⑩user

批量创建用户模块

  • name:指定用户名称
  • uid:指定用户uid信息
  • group:指定那个主要组
  • groups:指定那个附属组
  • password:指定用户密码信息(必须为密文信息)
  • shell:指定用户shell信息/sbin/nologin
  • create_home:no不创建家目录 yes创建家目录
创建用户:
ansible 172.16.1.7 -m user -a "name=oldgirl uid=777 group=oldboy groups=oldboy666 shell=/sbin/nologin create_home=no"
    
删除用户:
ansible 172.16.1.7 -m user -a "name=oldgirl state=absent"
    
设置用户密码信息:
ansible 172.16.1.7 -m user -a 'name=oldgirl password="$6$oldboy123$W3jkmkkVTr.9UStm4S50RT2uIEjB/4GEtaAeVCSZ..uWVN1YGxHvluss9JVfAPV0gSJoGn1qAfxGyttIsTjcz0"'

小提示:创建密文密码的两种方法
方法1:利用ansible模块功能
方法2:利用python模块功能

①①mount

挂载模块

  • src:指定需要被挂载的存储数据信息,分区或共享目录。
  • path:挂载点目录信息
  • fstype:文件类型
  • state:mounted(临时和永久挂载) 、present(永久挂载)、 unmounted(临时卸载) 、absent(临时和永久卸载,挂载目录也会删除)

①②ping

①③setup

①④debug

①⑤mysql(相关模块)

①⑥unarchive

相关模块目前有将近三千个,如需要更深入的了解其它模块,请参考官网。

小提示:ansibile输出结果颜色定义:绿色代表命令执行成功,没有对远程主机做任何修改。黄色代表命令执行成功,大部分情况表示对远程主机做了更改。红色代表命令执行失败。粉色代表警告或是建议。蓝色代表显示命令或剧本执行的过程。
小提示:可通过ansible-doc -s +模块名 进行查看帮助信息。

2、剧本

剧本作用

  • 将多个模块功能进行整合
  • 重复工作简单化
  • 实现批量管理特殊需求

如何编写剧本

角色信息+任务信息
hosts:表示角色信息
tasks:表示任务信息

剧本编写规范

pythonyaml格式
①缩进:两个空格表示一个缩进关系
②冒号:创建键值对信息(key--value),冒号后面必须有空格,例:age: 18
冒号结尾或注释信息不需要有空格。
③列表:相同的信息出现多次,多个列表使用短横线空格。

编写角色信息

编写剧本信息

测试剧本

执行剧本

五、ansible自动部署rsync服务

  - hosts: rsync_server
      tasks:
        - name: 01:安装部署软件
          yum: name=rsync state=installed 
        - name: 02:分发配置文件
          copy: src=./rsyncd.conf dest=/etc/rsyncd.conf
        - name: 03:创建虚拟用户
          user: name=rsync shell=/sbin/nologin create_home=no
        - name: 04:创建备份目录
          file: path=/backup state=directory owner=rsync group=rsync
        - name: 05:创建密码文件
          copy: content='rsync_backup:oldboy123' dest=/etc/rsync.password  mode=600
        - name: 06:启动服务程序
          service: name=rsyncd state=started enabled=yes
    
    - hosts: rsync_client
      tasks:
        - name: 01:创建密码文件
          copy: content='oldboy123' dest=/etc/rsync.password mode=600

六、ansible扩展配置说明

1、剧本编写设置变量

①在剧本中设置变量

- hosts: 172.16.1.7
  vars:
    dir_info: /etc/
    dest_file: hosts_bak
  tasks:
    - name: 传输文件
      copy: src={{ dir_info }}hosts  dest={{ dir_info  }}{{ dest_file }}

②在命令行指定变量

- hosts: 172.16.1.7
  tasks:
    - name: 传输文件
      copy: src={{ dir_info }}hosts  dest={{ dir_info  }}{{ dest_file }}
ansible-playbook -e dir_info=/etc/ -e dest_file=hosts_bak test_变量功能.yaml

③在主机清单中指定

[rsync_client]
172.16.1.7
172.16.1.31
[rsync_client:vars]
dir_info=/etc/
dest_file=hosts_bak

- hosts: 172.16.1.7
  tasks:
    - name: 传输文件
      copy: src={{ dir_info }}hosts  dest={{ dir_info  }}{{ dest_file }}

2、剧本编写注册信息

- hosts: 172.16.1.7
  tasks:
    - name: 启动SSH
      service: name=sshd state=started
    - name: 检查SSH
      shell: netstat -lntup|grep 22
      register: port_info
    - name: 显示SSH端口
      debug: msg={{ port_info.stdout_lines }}

3、剧本编写循环功能

4、剧本编写判断功能

5、剧本编写忽略错误功能

6、剧本编写标签功能

7、剧本编写忽略采集功能

8、剧本编写触发功能

9、剧本编写汇总功能

七、ansible剧本角色配置

你可能感兴趣的:(ansible批量管理服务)