ansible
ansible批量部署
1 批量管理服务知识介绍
1.ansible是一个基于python开发的自动化运维工具
2.ansible是一个基于ssh协议实现远程管理的工具
3.ansible软件可以实现多种批量管理操作(批量系统配置、批量软件部署、批量文件拷贝)
2 批量管理服务特征介绍
1.ansible软件服务端:不需要启动任何服务,默认服务端不需要任何的配置
2.ansible软件客户端:没有客户端软件安装
3 absible软件安装部署
3.1 a ansible软件自动化环境架构规划
管理主机m01
受控主机:其他
3.2 b ansible软件自动化部署条件
建议基于ssh密钥方式建立远程链接
1.ssh密钥对创建(管理主机)
影响免交互创建密钥对的因素
a.需要指定私钥的存放路径
-f /root/.ssh/id_dsa
b.需要进行私钥文件密码设定
-N/-P
-N "" / -P ""
2.公钥文件分发
3.检查
影响免交互分发的因素
1.需要输入yes确认
-o StrictHostKeyChecking=no ---不检查
2.需要输入密码
sshpass -p123
sshpass -p123 ssh-copy-id -i /root/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no" 172.16.1.31
编写脚本批量分发并检查
[ scripts]# vim fenfa_key.sh
#!/bin/sh
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
if [ ! -f /root/.ssh/id_dsa ];then
ssh-keygen -t dsa -f /root/.ssh/id_dsa -N ""
else
for n in 31 41 7
do
sshpass -p123 ssh-copy-id -i /root/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no" 172.16.1.$n>/dev/null
2>&1
ssh 172.16.1.$n hostname
done
fi
shift的作用
若用户要求Shell在不知道变量个数的情况下,还能逐个处理参数,也就是在$1之后是$2,$2之后是$3。在未运行shift命令之前$1是可用的,当使用shift命令之后,原来的$2会变成$1,并且原有的$1变得不可用,通过$#命令获得的参数个数也会少1。
#测试shift命令(x_shift.sh)
until [ $# -eq 0 ]
do
echo "第一个参数为: $1 参数个数为: $#"
shift
done
执行以上程序x_shift.sh:
$./x_shift.sh 1 2 3 4
结果显示如下:
第一个参数为: 1 参数个数为: 4
第一个参数为: 2 参数个数为: 3
第一个参数为: 3 参数个数为: 2
第一个参数为: 4 参数个数为: 1
shift命令一次移动参数的个数由其所带的参数指定。例如当shell程序处理完前九个命令行参数后,可以使用shift9命令把$10移到$1。
3.3 ansible软件下载安装
主控端软件安装
yum -y install ansible
受控端软件安装(可选)
yum -y install libselinux-python <---解决selinux开启后selinux阻止
3.4 ansible软件受控主机添加配置
/etc/ansible/hosts 《===配置管理的主机
[dxy]
172.16.1.31 ansible_user=root ansible_password=123 <==可以指定账号和密码信息
172.16.1.41
172.16.1.7
ansible.cfg 《===ansible的配置文件
3.5 实践
[ ansible]# ansible dxy -m command -a "hostname"
172.16.1.41 | CHANGED | rc=0 >>
backup
172.16.1.7 | CHANGED | rc=0 >>
web01
172.16.1.31 | CHANGED | rc=0 >>
nfs01
3.6 命令参数
参数 | 含义 |
dxy或者是地址 | 组名称 |
-m | 指定模块信息 |
-a | 利用模块中某些参数功能 |
-k | 基于交互式输入密码 |
absible-doc -l 查看模块
4 ansible应用
4.1 ansible软件模块
4.1.1 command模块
简介:
命令模块采用命令名,后跟空格分隔的参数列表。
给定的命令将在所有选定的节点上执行。
命令不会通过shell处理,因此$home之类的变量和“<”、“>”、“”、“;”和“&”之类的操作将不起作用。如果需要这些特性,请使用shell模块。
要创建更易于读取的命令任务,请使用args task关键字传递参数。
对于windows目标,请改用win_命令模块。
官方网站:https://docs.ansible.com/ansible/latest/modules/command_module.html#command-module
参数 | 作用 |
chdir | 先切换到别的目录下在执行命令 |
creates | 当文件存在时就不执行后边的命令 |
removes | 当文件不存在时不执行后边的命令 |
chdir实例
[ ansible]# ansible 172.16.1.31 -m command -a "chdir=/tmp pwd"
172.16.1.31 | CHANGED | rc=0 >>
/tmp
creates实例
[ ansible]# ansible 172.16.1.31 -m command -a "creates=/tmp pwd"
172.16.1.31 | SUCCESS | rc=0 >>
skipped, since /tmp exists
[ ansible]# ansible 172.16.1.31 -m command -a "creates=/tmp1 pwd"
172.16.1.31 | CHANGED | rc=0 >>
/root
removes实例
[ ansible]# ansible 172.16.1.31 -m command -a "removes=/tmp hostname"
172.16.1.31 | CHANGED | rc=0 >>
nfs01
[ ansible]# ansible 172.16.1.31 -m command -a "removes=/tmp1 hostname"
172.16.1.31 | SUCCESS | rc=0 >>
skipped, since /tmp1 does not exist
4.1.2 shell模块
可以使用特殊符号,shell模块支持command模块的所有功能
chdir实例
[ ansible]# ansible 172.16.1.31 -m shell -a "chdir=/tmp pwd"
172.16.1.31 | CHANGED | rc=0 >>
/tmp
creates实例
[ ansible]# ansible 172.16.1.31 -m shell -a "creates=/tmp pwd"
172.16.1.31 | SUCCESS | rc=0 >>
skipped, since /tmp exists
[ ansible]# ansible 172.16.1.31 -m shell -a "creates=/tmp1 pwd"
172.16.1.31 | CHANGED | rc=0 >>
/root
removes实例
[ ansible]# ansible 172.16.1.31 -m shell -a "removes=/tmp hostname"
172.16.1.31 | CHANGED | rc=0 >>
nfs01
[ ansible]# ansible 172.16.1.31 -m shell -a "removes=/tmp1 hostname"
172.16.1.31 | SUCCESS | rc=0 >>
skipped, since /tmp1 does not exist
4.1.3 script模块:专门运行脚本
简介:Runs a local script on a remote node after transferring it
ansible 172.16.1.31 -m script -a "/server/scripts/yum.sh"
4.2 文件类型的模块
4.2.1 copy---- Copy files to remote locations
synop
复制模块将文件从本地或远程计算机复制到远程计算机上的某个位置。
使用fetch模块将文件从远程位置复制到本地框。
如果在复制的文件中需要变量插值,请使用模板模块。在内容字段中使用变量将导致不可预测的输出。
对于windows目标,请改用win_copy模块sis
参数 | 含义 |
src | 要复制文件本地的路径,如果是目录/结尾,复制的时候不包含目录 |
dest | 应将文件复制到的远程绝对路径。 如果src是一个目录,那么它也必须是一个目录。 如果DEST是一个不存在的路径,如果要么以“//”结束,要么SRC是一个目录,则创建DEST。 如果dest是相对路径,则起始目录由远程主机确定。 如果SRC和DEST是文件,则未创建DEST的父目录,如果该任务不存在,则任务失败。 |
backup | 创建一个包含时间戳信息的备份文件,以便在不正确地删除原始文件时可以将其取回。 |
owner | 应该拥有该文件/目录的用户的名称,该名称将被馈送给chown。 |
group | 设置文件所属组 |
mode | 设置复制后的文件权限 例如:600 755 等等 |
src与dest实例
ansible 172.16.1.31 -m copy -a "src=1.txt dest=./"
backup
[ ~]# ansible 172.16.1.31 -m copy -a "src=1.txt dest=./ backup=yes"
172.16.1.31 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"backup_file": "./:08:50~",
"changed": true,
"checksum": "47f5487a006fd6ce0f74306c7c8594b219b72d08",
"dest": "./1.txt",
"gid": 0,
"group": "root",
"md5sum": "91dc86f0a5e0bede58197f3f22883180",
"mode": "0644",
"owner": "root",
"secontext": "unconfined_u:object_r:admin_home_t:s0",
"size": 188,
"src": "/root/.ansible/tmp/ansible-tmp-1572599329.88-195785710959257/source",
"state": "file",
"uid": 0
}
[ ~]# ansible 172.16.1.31 -m shell -a "ls ./1.txt*"
172.16.1.31 | CHANGED | rc=0 >>
./1.txt
./:08:50~
4.2.2 file模块
synopsis
设置文件、符号链接或目录的属性。
或者,删除文件、符号链接或目录。
许多其他模块支持与文件模块相同的选项,包括复制、模板和组装。
对于Windows目标,请改用Win_文件模块。
[ ~]# ansible 172.16.1.31 -m file -a "path=/tmp/1.txt owner=test group=test mode=600"
172.16.1.31 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"gid": 1000,
"group": "test",
"mode": "0600",
"owner": "test",
"path": "/tmp/1.txt",
"secontext": "unconfined_u:object_r:user_tmp_t:s0",
"size": 0,
"state": "file",
"uid": 1000
}
path是路径 相当于dest
state:用于指定创建
[ ~]# ansible 172.16.1.31 -m file -a "dest=/tmp/1.txt state=file"
[ ~]# ansible 172.16.1.31 -m file -a "dest=/tmp/dir state=directory"
4.2.3 yum模块
简介(synopsis)
使用yum包管理器安装、升级、降级、删除和列出包和组。
此模块仅适用于Python2如果需要Python 3支持,请参阅dnf模块。
name:需要安装软件的名称
state:installed安装absent卸载
list:指定软件的名称查看是否可以安装,以及是否已经安装过了
ansible 172.16.1.31 -m yum -a "name=iftop state=removed"
ansible 172.16.1.31 -m yum -a "name=iftop state=installed"
ansible 172.16.1.31 -m yum -a "list=iftop"
4.2.4 系统模块---server
synopsis
控制远程主机上的服务支持的init系统包括bsd init、openrc、sysv、solaris smf、systemd和upstart。
对于Windows目标,请改用Win_服务模块。
name:指定管理的服务名称(管理的服务一定在chkconfig中可以看到)
state:对应的状态 reloaded restarted stopped started
enabled:服务是否开机自启动 yes no
4.2.5 系统模块---systemd
synopsis
控制远程主机上的系统服务。
name:指定管理的服务名称(管理的服务一定在chkconfig中可以看到)
state:对应的状态 reloaded restarted stopped started
enabled:服务是否开机自启动 yes no
4.2.6 cron模块---Manage cron.d and crontab entries
synopsis
使用此模块管理crontab和环境变量项。此模块允许您创建环境变量和命名的crontab条目、更新或删除它们。
当crontab作业被管理时:模块包含一行crontab条目“ansibe:<name>”的描述,与传递给模块的“name”相对应,将来ansibe/module调用将使用该条目查找/检查状态。“name”参数应该是唯一的,更改“name”值将导致创建一个新的cron任务(或删除另一个任务)。
管理环境变量时,不添加注释行,但是,当模块需要查找/检查状态时,它使用“name”参数来查找环境变量定义行。
使用%等符号时,必须正确转义。
参数:
name 给定时任务定义名称
state=absent 删除一条规则
disabled=yes 注释定时任务
minute=0-59 or * or */ 分钟
hour=0-23 * */ 时
day=1-31 * */ 日
month 月 weekday 周 job=对应的命令 默认是*
[ ~]# ansible 172.16.1.31 -m cron -a "name=test01 minute=0 hour=0 job=‘/usr/sbin/sh /server/scripts/test.sh >/dev/null 2>&1‘"
172.16.1.31 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"envs": [],
"jobs": [
"test01"
]
}
[ ~]# ansible 172.16.1.31 -m command -a "crontab -l"
172.16.1.31 | CHANGED | rc=0 >>
##time update
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1
###Pack and backup at 00:00 every day####
###00 00 * * * /usr/bin/sh /server/scripts/back.sh >/dev/null 2>&1
#Ansible: test01
0 0 * * * /usr/sbin/sh /server/scripts/test.sh >/dev/null 2>&1
[ ~]# ansible 172.16.1.31 -m cron -a "name=test01 minute=0 hour=0 job=‘/usr/sbin/sh /server/scripts/test.sh >/dev/null 2>&1‘ disabled=yes"
172.16.1.31 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"envs": [],
"jobs": [
"test01",
"None"
]
}
[ ~]# ansible 172.16.1.31 -m command -a "crontab -l" 172.16.1.31 | CHANGED | rc=0 >>
##time update
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1
###Pack and backup at 00:00 every day####
###00 00 * * * /usr/bin/sh /server/scripts/back.sh >/dev/null 2>&1
#Ansible: test01
#0 0 * * * /usr/sbin/sh /server/scripts/test.sh >/dev/null 2>&1
[ ~]# ansible 172.16.1.31 -m cron -a "name=test01 state=absent" 172.16.1.31 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"envs": [],
"jobs": [
"None"
]
}
[ ~]# ansible 172.16.1.31 -m command -a "crontab -l"
172.16.1.31 | CHANGED | rc=0 >>
##time update
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1
###Pack and backup at 00:00 every day####
###00 00 * * * /usr/bin/sh /server/scripts/back.sh >/dev/null 2>&1
4.3 ansible软件脚本
编写的规范:
https://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html
遵循pyyaml
4.3.1 1.-用法说明,表示列表显示的内容
水果信息:
- 苹果
- 香蕉
4.3.2 : 用法说明key:value键值对的方式
姓名: lisi
年龄: 20
4.3.3 空格的用法说明
对编写的内容进行分级时,需要有两个空格表示分级
软件安装步骤:
- server端安装步骤:
第一步:
第二步:
- 客户端安装步骤:
4.4 脚本实例:
4.4.1 编写安装nginx的脚本
[ ~]# vim 1.yml
- hosts: 172.16.1.7
tasks:
- name: instsll nginx
yum: name=nginx state=installed
- name: check install
shell: rpm -qa|grep nginx
- name: start nginx
systemd: name=nginx state=started
- name: check start
shell: ss -lntup|grep nginx
4.4.2 测试模拟运行
[ ~]# ansible-playbook -C 1.yml
[ ~]# ansible-playbook 1.yml
测试安装成功