ansible批量管理服务介绍与部署

一. 批量管理服务知识介绍

a. ansible是一个基于Python开发的自动化运维工具
b. ansible是一个基于ssh协议实现远程管理的工具
c. ansible软件可以实现多种批量管理操作(批量系统配置、批量软件部署、批量文件拷贝、批量运行命令)
saltstack puppet

  1. 批量管理服务特征介绍
    a ansible软件服务端(管理端):不需要启动任何服务 默认服务端不需要任何的配置
    b ansible软件客户端(受控端):没有客户端软件安装

二. ansible软件安装部署

ansible软件自动化环境架构规划
管理主机1台:
10.0.0.61 m01
受控主机3台:
10.0.0.41 backup
10.0.0.31 nfs01
10.0.0.7 web01
Linux系统 6.9
ansible软件自动化部署条件
建议基于ssh密钥方式建立远程连接

1: ssh密钥对创建(管理主机)
ssh-keygen -t dsa
影响免交互创建密钥对创建因素:
1)需要指定私钥存放路径
-f /root/.ssh/id_dsa
2)需要进行私钥文件密码设定
-N/-P
-N “”/-P “”
免交互创建密钥对方法
ssh-keygen -t dsa -f /root/.ssh/id_dsa -N “”

2: 分发公钥文件(管理主机进行分发)

   ssh-copy-id -i /root/.ssh/id_dsa.pub 172.16.1.31
		影响免交互批量分发密钥因素
	1)需要有确认连接过程,需要输入yes/no
		   -o StrictHostKeyChecking=no
		   sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no 172.16.1.31"
	2)需要解决密码问题
		   sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub 172.16.1.31
           Now try logging into the machine, with "ssh '172.16.1.31'", and check in:
                      .ssh/authorized_keys
                  to make sure we haven't added extra keys that you weren't expecting.
  !!!!!!	免交互批量分发公钥脚本:
			     #!/bin/bash
        rm /root/.ssh/id_dsa
        ssh-keygen -t dsa -f /root/.ssh/id_dsa -N ""
        
        for ip in 31 41 7
        do
        sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no 172.1 6.1.$ip"
        done
=====================================
补充:
如果ssh端口号不是22,也可以在上面脚本最后添加指定端口号:
		sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no 172.1 6.1.$ip -p端口号"

================================================
3: 检查是否可以进行基于密钥远程管理
ssh 172.16.1.31 uptime
免交互批量检查测试脚本
ansible批量管理服务介绍与部署_第1张图片



	[root@m01 scripts]# sh fenfa_check.sh hostname
fenfa_check.sh: line 3: [1: command not found
========= info 172.16.1.31=====
nfs01

========= info 172.16.1.41=====
backup
========= info 172.16.1.7=====


web01 基于ssh口令方式建立远程连接(也可以)
	  vim /etc/ansible/hosts
	  [oldboy]
      172.16.1.7
      172.16.1.31 ansible_user=root ansible_password=123456
      172.16.1.41
例:
	  ansible 172.16.1.31 -m command -a "hostname" -k     --- 实现口令交互式远程管理
      SSH password: 
      172.16.1.31 | SUCCESS | rc=0 >>
      nfs01
===================================================================
	a, ansible软件下载安装
	  ansible管理主机软件安装:
	  yum install -y ansible
	  ansible受控主机软件安装:(可选)
	  yum install -y libselinux-python
	  
	d, ansible软件管理主机添加受控主机信息配置
	  cat /etc/ansible/hosts
      [oldboy]
      172.16.1.7
      172.16.1.31
      172.16.1.41

批量管理命令:ansible lwg -m command -a “hostname”

三: ansible软件应用过程

ansible软件模块
ansible-doc -l|wc -l
1378

命令形式:ansible 管理主机信息或者主机组信息 -m 模块名称 -a 相关模块参数

主机信息:远程主机IP地址 远程主机组名称 远程所有主机all
-m 指定相应模块
-a 利用模块中某些参数功能

命令类型模块:
**第一个模块:command **
官方参考链接:http://docs.ansible.com/ansible/latest/modules/command_module.html
1) 参数:chdir—在执行莫个命令前,先切换目录
[root@m01 ansible]# ansible 172.16.1.31 -m command -a “chdir=/tmp/ pwd”
172.16.1.31 | SUCCESS | rc=0 >>
/tmp

[root@m01 ansible]# ansible 172.16.1.31 -m command -a “chdir=/etc/ pwd”
172.16.1.31 | SUCCESS | rc=0 >>
/etc

2) 参数:creates—判断一个文件是否存在,如果已经存在了,后面的命令就不会执行
[root@m01 ansible]# ansible 172.16.1.41 -m command -a “creates=/etc/rsyncd.conf hostname”
172.16.1.41 | SUCCESS | rc=0 >>
skipped, since /etc/rsyncd.conf exists

[root@m01 ansible]# ansible 172.16.1.41 -m command -a “creates=/etc/rsyncd.conf.bak hostname”
172.16.1.41 | SUCCESS | rc=0 >>
skipped, since /etc/rsyncd.conf.bak exists

[root@m01 ansible]# ansible 172.16.1.41 -m command -a “creates=/etc/rsyncd.123456 hostname”
172.16.1.41 | SUCCESS | rc=0 >>
backup

3) 参数:removes—判断一个文件是否存在,如果不存在,后面的命令就不会执行
[root@m01 ansible]# ansible 172.16.1.41 -m command -a “removes=/etc/rsyncd.conf hostname”
172.16.1.41 | SUCCESS | rc=0 >>
backup

[root@m01 ansible]# ansible 172.16.1.41 -m command -a "removes=/etc/rsyncd.1212213123 hostname"
172.16.1.41 | SUCCESS | rc=0 >>
skipped, since /etc/rsyncd.1212213123 does not exist

4) 参数(必须要有的):free_form—表示执行command模块时,必须要有linux合法命令信息
ansible 172.16.1.41 -m command -a “ls”
172.16.1.41 | SUCCESS | rc=0 >>
1
anaconda-ks.cfg
dead.letter
heqing

第二个模块:shell模块(万能模块)
参数:chdir—在执行莫个命令前,先切换目录
参数:creates—判断一个文件是否存在,如果已经存在了,后面的命令就不会执行
参数:removes—判断一个文件是否存在,如果不存在,后面的命令就不会执行
参数(必须要有的):free_form—表示执行command模块时,必须要有linux合法命令信息
[root@m01 ansible]# ansible 172.16.1.41 -m shell -a “ls;pwd”
172.16.1.41 | SUCCESS | rc=0 >>
1
anaconda-ks.cfg
dead.letter
/root
说明:shell模块可以满足command模块所有功能,并且可以支持识别特殊字符信息 < > | ;

第三个模块:script—专门运行脚本模块
参数:chdir—在执行某个命令前,先切换目录
参数:creates—判断一个文件是否存在,如果已经存在了,后面的命令就不会执行
参数:removes—判断一个文件是否存在,如果不存在,后面的命令就不会执行
参数(必须要有的):free_form—表示执行command模块时,必须要有linux合法命令信息
[root@m01 ansible]# ansible 172.16.1.31 -m script -a “/server/scripts/yum.sh”

文件类型模块:
第一个模块:copy----复制模块
1) 参数:backup—对数据信息进行备份,把文件推送过去,不会覆盖源文件
[root@m01 ansible]# ansible 172.16.1.41 -m copy -a “src=/tmp/file01.txt dest=/tmp/ backup=yes”
172.16.1.41 | SUCCESS => {
“backup_file”: “/tmp/file01.txt.71887.2018-04-02@23:33:19~”,
“changed”: true,
“checksum”: “029b054db136cc36d5605e3818305825ff4b8ffb”,
“dest”: “/tmp/file01.txt”,
“gid”: 0,
“group”: “root”,
“md5sum”: “434660b5ad7deeba8815349f71409405”,
“mode”: “0644”,
“owner”: “root”,
“size”: 6,
“src”: “/root/.ansible/tmp/ansible-tmp-1522683197.05-52744169892601/source”,
“state”: “file”,
“uid”: 0
}

2) 参数:src—定义要推送数据信息
3) 参数:dest—定义将数据推送到远程主机什么目录中
会覆盖源文件:
[root@m01 ansible]# touch /tmp/file01.txt
[root@m01 ansible]# ansible 172.16.1.41 -m copy -a “src=/tmp/file01.txt dest=/tmp/”
172.16.1.41 | SUCCESS => {
“changed”: true,
“checksum”: “da39a3ee5e6b4b0d3255bfef95601890afd80709”,
“dest”: “/tmp/file01.txt”,
“gid”: 0,
“group”: “root”,
“md5sum”: “d41d8cd98f00b204e9800998ecf8427e”,
“mode”: “0644”,
“owner”: “root”,
“size”: 0,
“src”: “/root/.ansible/tmp/ansible-tmp-1522682948.27-60532389065095/source”,
“state”: “file”,
“uid”: 0
}
[root@m01 ansible]# ansible 172.16.1.41 -m shell -a “ls -l /tmp/”
172.16.1.41 | SUCCESS | rc=0 >>
total 24
-rw-r–r-- 1 root root 0 Apr 2 23:29 file01.txt

第二个模块:file----文件属性修改/目录创建/文件创建
1) 参数:owner—设置复制后的文件属主权限
2) 参数:group—设置复制后的文件属组权限
3) 参数:mode—设置复制后的文件权限(600 755)
ansible 172.16.1.41 -m file -a “dest=/tmp/file01.txt owner=oldboy group=oldboy mode=600”
172.16.1.41 | SUCCESS => {
“changed”: true,
“gid”: 500,
“group”: “oldboy”,
“mode”: “0600”,
“owner”: “oldboy”,
“path”: “/tmp/file01.txt”,
“size”: 6,
“state”: “file”,
“uid”: 500
}

## 4) 参数:state—用于指定创建目录或文件

创建文件
ansible 172.16.1.41 -m file -a “dest=/tmp/file01.txt state=touch”
172.16.1.41 | SUCCESS => {
“changed”: true,
“dest”: “/tmp/file01.txt”,
“gid”: 0,
“group”: “root”,
“mode”: “0644”,
“owner”: “root”,
“size”: 0,
“state”: “file”,
“uid”: 0
}

创建目录:
ansible 172.16.1.41 -m file -a “dest=/tmp/dir01 state=directory”
172.16.1.41 | SUCCESS => {
“changed”: true,
“gid”: 0,
“group”: “root”,
“mode”: “0755”,
“owner”: “root”,
“path”: “/tmp/dir01”,
“size”: 4096,
“state”: “directory”,
“uid”: 0
}

包管理模块类型

模块:yum—安装软件包模块
1) name:执行要安装软件的名称,以及软件的版本
2) state:installed安装 absent(卸载)
ansible 172.16.1.41 -m yum -a “name=iftop state=installed”
ansible 172.16.1.41 -m yum -a “name=iftop state=absent”

list:指定软件名称,查看软件是否可以安装,以及是否已经安装过了
ansible 172.16.1.41 -m yum -a “list=iftop”

系统模块类型

1) 模块:service—管理服务状态模块
name: 指定要管理的服务名称(管理的服务一定在chkconfig中可以看到)
state:stopped started restarted reloaded
enabled:yes表示服务开机自启动 no表示服务开机不要自动启动

ansible 172.16.1.41 -m service -a “name=crond state=started enabled=yes”

cron—定时任务模块
* * * * * /bin/sh /server/scripts/test.sh &>/dev/null

时间格式: minute=0-59 * */n , - hour day mweekonth day job=’/bin/sh /server/scripts/test.sh &>/dev/null’

1) 添加定时任务
ansible 172.16.1.41 -m cron -a “name=oldboy02 minute=0 hour=0 job=’/bin/sh /server/scripts/test.sh &>/dev/null’”

2) 删除定时任务
ansible 172.16.1.41 -m cron -a “name=oldboy02 minute=0 hour=0 job=’/bin/sh /server/scripts/test.sh &>/dev/null’ state=absent”
精简化删除: ansible 172.16.1.41 -m cron -a “name=oldboy01 state=absent”

3) 注释定时任务
注释掉: ansible 172.16.1.41 -m cron -a “name=oldboy01 minute=0 hour=0 job=’/bin/sh /server/scripts/test.sh &>/dev/null’ disabled=yes”
解除注释: ansible 172.16.1.41 -m cron -a “name=oldboy01 job=’/bin/sh /server/scripts/test.sh &>/dev/null’ disabled=no”

总结ansible颜色信息:
绿色:查看远程主机信息,不会对远程主机系统做任何修改
红色:执行操作出现异常错误
黄色:对远程主机系统进行修改操作
粉色:警告或者忠告信息

ansible软件剧本
编写剧本规范:
http://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html
遵循pyyaml
①. - 用法说明,表示列表显示的内容
水果信息:
- 苹果
- 香蕉
- 西瓜
②.冒号 : 用法说明:
姓名: 张三
性别: 男
人员信息:
- 运维人员: sa
- 开发人员: dev
- 存储人员: dba
③. 空格 用法说明:
对内容进行分级时,需要有两个空格表示分级
软件安装步骤:
- 服务端安装步骤:
第一个里程碑: 检查软件是否安装
第二个里程碑: 编写配置文件内容
- 客户端安装步骤:
补充:必须使用空格分隔ansible剧本级别,一定不要使用tab键进行分割

执行脚本方法:
正常执行: ansible-playbook /etc/ansible/ansible-playbook/test.yaml
模拟执行: ansible-playbook -C /etc/ansible/ansible-playbook/test.yaml

ansible批量管理服务介绍与部署_第2张图片
作业:
1. nfs服务一键化部署
2. inotify/sersync软件一键化部署

你可能感兴趣的:(linux服务)