一、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 }}