一、Ansible 简介
1. ansible 是什么
ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
ansible是基于 paramiko 开发的,并且基于模块化工作,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远
程主机通讯的。ansible目前已经已经被红帽官方收购,是自动化运维工具中大家认可度最高的,并且上手容易,学习简单。是每位运维工程师必须掌握的技能之一。
2. ansible 特点
- 部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作;
- 默认使用SSH协议对设备进行管理;
- 有大量常规运维操作模块,可实现日常绝大部分操作;
- 配置简单、功能强大、扩展性强;
- 支持API及自定义模块,可通过Python轻松扩展;
- 通过Playbooks来定制强大的配置、状态管理;
- 轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
- 提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台。
3. ansible 架构图
二、Ansible 部署配置
1. 安装ansible
yum install epel-release -y # 安装epel源
yum install ansible -y # 安装ansible批量管理软件
yum install libselinux-python -y # Python依赖包
2. 配置hosts文件
[root@m01 ~]cat /etc/ansible/hosts # 在文件最下面配置主机列表
#定义可以管理的主机信息
[web]
172.16.1.7 ansible_ssh_user=root ansible_ssh_pass=123456
172.16.1.8 ansible_ssh_user=root ansible_ssh_pass=123456
[nfs]
172.16.1.31 ansible_ssh_user=root ansible_ssh_pass=123456
注:如果使用SSH密钥方式也可以不输入密码进行控制,SSH分发密钥方式查看SSH分发密钥文档
参数信息 | 参数类型 | 参数说明 |
---|---|---|
ansible_host | 通用连接参数 | 将要连接的远程主机名与想要设定的主机的别名不同的话,可通过此变量设置 |
ansible_port | 通用连接参数 | 设置SSH服务端口号,如果是默认22端口可以不设置 |
ansible_ssh_user | 通用连接参数 | 指定默认使用什么用户身份登录 |
ansible_ssh_pass | 通用连接参数 | 指定远程连接的主机密码信息 |
3. 使用ansible管理
[root@m01 ~]# ansible web -m command -a "hostname"
172.16.1.8 | CHANGED | rc=0 >>
web02
172.16.1.7 | CHANGED | rc=0 >>
web01
三、Ansible 批量管理命令
1. ansible语法格式
2. 命令参数
命令参数 | 命令说明 |
-a(MODULE_ARGS) | 指定使用模块的哪些参数,一般可以接操作的命令 |
-c | 不做任何改变,而是尝试预测一些可能发生的变化,就是测试 |
-f | 指定使用并行执行的进程数量(默认是5个),机器数量多时使用 |
-i | 指定被管理主机的列表清单文件路径信息(默认为/etc/ansible/hosts)或者用逗号分隔主机列表 |
--list-hosts | 输出匹配的主机列表信息,并不执行其他操作 |
-m | 指定使用的模块(默认不指定,使用command) |
--syntax-check | 在剧本上执行语法检测,但并不执行剧本 |
-k | 提示输入远程主机SSH的密码信息 |
-u | 指定用户身份远程进行操作,此用户在远程主机必须存在 |
3. ansible-doc 命令
ansible-doc -l # 列出所有ansible支持的模块
ansible-doc -s command # 查看某个模块的帮助参数
四、Ansible 常用模块
1. command 模块
选项参数 | 选项说明 |
---|---|
chdir | 在执行命令之前,通过cd命令进入到指定目录中 |
creates | 定义一个文件是否存在,如果不存在,则运行相应命令;如果存在则跳过相应命令 |
free_from (必有参数) | 参数信息中可以输入任何系统命令信息,实现远程管理 |
removes |
定义一个文件是否存在,如果存在,则运行相应命令;如果不存在则跳过相应命令 |
说明:命令中不能包含类似$HOME和参数类似"<",">","|",";" 和"&"等信息,如需使用请使用shell模块 |
例1:
[root@m01 ~]#ansible web -m "command" -a "uptime"
172.16.1.8 | CHANGED | rc=0 >>
18:07:33 up 37 min, 2 users, load average: 0.00, 0.01, 0.05
172.16.1.7 | CHANGED | rc=0 >>
18:07:33 up 5:14, 4 users, load average: 0.00, 0.01, 0.05
例2:
[root@m01 ~]# ansible web -m "command" -a "removes=/tmp ls /tmp"
172.16.1.8 | CHANGED | rc=0 >>
ansible_command_payload_ZeIcUx
rsync_fail_log.sh
172.16.1.7 | CHANGED | rc=0 >>
ansible_command_payload_bzbNln
rsync_fail_log.sh
2. shell 模块
选项参数 | 选项说明 |
---|---|
chdir | 在执行命令之前,通过cd命令进入到指定目录中 |
creates | 定义一个文件是否存在,如果不存在,则运行相应命令;如果存在则跳过相应命令 |
free_from (必有参数) | 参数信息中可以输入任何系统命令信息,实现远程管理 |
removes |
定义一个文件是否存在,如果存在,则运行相应命令;如果不存在则跳过相应命令 |
例1:
[root@m01 ~]# ansible web -m shell -a "ps -ef|grep sshd|grep -v grep"
172.16.1.8 | CHANGED | rc=0 >>
root 1415 1 0 17:30 ? 00:00:00 /usr/sbin/sshd -D
root 1699 1415 0 17:33 ? 00:00:00 sshd: root@pts/0
root 2221 1415 0 18:14 ? 00:00:00 sshd: root@pts/1
172.16.1.7 | CHANGED | rc=0 >>
root 1384 1 0 12:53 ? 00:00:00 /usr/sbin/sshd -D
root 2015 1384 0 14:05 ? 00:00:02 sshd: root@pts/1
root 5268 1384 0 16:52 ? 00:00:00 sshd: root@pts/0
例2:
[root@m01 ~]# ansible servers -m shell -a "tmp/check_disk.sh"
172.16.5.193 | CHANGED | rc=0 >>
disk_size=32%
unhealth
172.16.5.181 | CHANGED | rc=0 >>
disk_size=43%
unhealth
说明:执行脚本命令时,远程主机必须有此脚本才可使用
3. script 模块
选项参数 | 选项说明 |
---|---|
creates | 定义一个文件是否存在,如果不存在,则运行相应命令;如果存在则跳过相应命令 |
free_from (必有参数) | 参数信息中可以输入任何系统命令信息,实现远程管理 |
removes |
定义一个文件是否存在,如果存在,则运行相应命令;如果不存在则跳过相应命令 |
例1:
[root@m01 ~]# ansible web -m script -a "tmp/check_disk.sh"
172.16.1.7 | CHANGED | rc=0 >>
disk_size=32%
unhealth
172.16.1.8 | CHANGED | rc=0 >>
disk_size=43%
unhealth
说明:执行脚本命令时,脚本不需要在远程主机存在和授权
4. copy 模块
选项参数 | 选项说明 |
---|---|
src | 指定源文件路径,可以是相对路径,也可以是绝对路径,可以是目录 |
dest (必有参数) | 指定目标文件路径,只能是绝对路径,如果src是目录,此项必须是目录 |
owner | 定义文件/目录属主,类似于chown |
group |
定义文件/目录属组,类似于chown |
mode | 定义文件/目录权限,可以以数字指定比如0644 |
backup | 创建备份文件并且包含时间戳信息,以便能够还原文件。默认配置为no,并且指定信息为yes|no |
content | 当使用代替参数时,将文件的内容直接设置为指定值。远端创建有指定内容的文件,并且只能设置简单值。 |
force |
默认为yes,如果目标主机包含该文件,但内容不同,则强制覆盖 如果为no,则只有当目标主机的目标位置不存在该文件时,才复制 |
remote_src |
如果为False,将搜索源信息在本地/管理及机器上 如果为True,将到远程/目标主机的机器上搜索 默认为false,目前不支持递归复制 |
[root@m01 ~]# ansible web -m copy -a "src=./anaconda-ks.cfg dest=/data owner=www group=www mode=0644"
172.16.1.7 | CHANGED => {
"changed": true,
"checksum": "9d791df2961e299fac1206c2e1c6ab1cde2c86a2",
"dest": "/data/anaconda-ks.cfg",
"gid": 1086,
"group": "www",
"md5sum": "221e5656c9b59aec6c7596568fff8ad3",
"mode": "0644",
"owner": "www",
"size": 1499,
"src": "/root/.ansible/tmp/ansible-tmp-1548230667.08-106764271060692/source",
"state": "file",
"uid": 1086
}
例2:
[root@m01 ~]# ansible web -m copy -a "src=/etc/hosts dest=/data backup=yes"
172.16.1.7 | CHANGED => {
"backup_file": "/data/anaconda-ks.cfg.4263.2019-01-23@15:52:43~",
"changed": true,
"checksum": "9d791df2961e299fac1206c2e1c6ab1cde2c86a2",
"dest": "/data/anaconda-ks.cfg",
"gid": 0,
"group": "root",
"md5sum": "221e5656c9b59aec6c7596568fff8ad3",
"mode": "0644",
"owner": "root",
"size": 1499,
"src": "/root/.ansible/tmp/ansible-tmp-1548229931.86-180942706957431/source",
"state": "file",
"uid": 0
}
例3:
[root@m01 ~]# ansible web01 -m copy -a "content=test dest=/data/anaconda-ks.cfg "
172.16.1.7 | CHANGED => {
"changed": true,
"checksum": "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3",
"dest": "/data/anaconda-ks.cfg",
"gid": 1086,
"group": "www",
"md5sum": "098f6bcd4621d373cade4e832627b4f6",
"mode": "0644",
"owner": "www",
"size": 4,
"src": "/root/.ansible/tmp/ansible-tmp-1548231000.52-150895010308573/source",
"state": "file",
"uid": 1086
}
5. fetch 模块
选项参数 | 选项说明 |
---|---|
src | 指定远程主机源文件路径,必须是文件,而不是目录 |
dest | 指定本地主机文件路径,只能是绝对路径,必须是目录 |
例1:
[root@m01 ~]# ansible web -m fetch -a "src=/etc/hosts dest=/tmp"
172.16.1.7 | CHANGED => {
"changed": true,
"checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
"dest": "/tmp/hosts",
"md5sum": "d41d8cd98f00b204e9800998ecf8427e",
"remote_checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
"remote_md5sum": null
}
6. file 模块
选项参数 | 选项说明 |
---|---|
src | 要链接的文件路径(只能应用state=link),创建连接文件时使用 |
path (必有参数) | 文件路径管理:别名方式—:dest,name |
owner | 定义文件/目录属主,类似于chown |
group |
定义文件/目录属组,类似于chown |
mode | 定义文件/目录权限,可以以数字指定比如0644 |
state | directory:所有不存在的子目录将会被创建 file:如果文件不存在将不能被创建 link:符号链接文件将被创建或更改 hard:创建硬链接文件 touch:如果文件不存在,则会创建一个空文件,如果文件或目录已存在,接收更新文件访问和修改时间 absent:目录将被递归删除以及文件,而链接将被取消 |
例1:
[root@m01 ~] ansible web -m file -a 'path=/root/test owner=www mode=755'
172.16.1.7 | CHANGED => {
"changed": true,
"gid": 0,
"group": "root",
"mode": "0700",
"owner": "mariadb",
"path": "/root/test",
"size": 0,
"state": "file",
"uid": 997
}
7. yum 模块
选项参数 | 选项说明 |
---|---|
name | 需要安装的软件包名称信息,或包的版本标识信息 |
state | 是否安装(present or installed latest)或者移除(absent or removed)一个包 |
例1:
[root@m01 ~] ansible web -m yum -a "name=vsftpd state=installed"
172.16.1.7 | CHANGED => {
"ansible_facts": {
"pkg_mgr": "yum"
},
"changed": true,
"msg": "Repository 'cdrom' is missing name in configuration, using id\n",
"rc": 0, ##rc返回值为0代表执行成功
......
8. service/systemd 模块
选项参数 | 选项说明 |
---|---|
name | 定义所要管理的服务名称 |
state |
started/stopped 两个参数属于激活操作命令 restarted 重启操作将是始终支持的服务 reloaded 表示进行平滑重启 |
enable | 确认是否系统启动时运维指定的服务 |
例1:
[root@m01 ~] ansible web -m service -a 'name=httpd state=started enable=yes'
172.16.1.7 | CHANGED => {
"changed": true,
"name": "httpd",
"state": "started",
"status": {
"ActiveEnterTimestampMonotonic": "0",
"ActiveExitTimestampMonotonic": "0",
......
9. cron 模块
选项参数 | 选项说明 |
---|---|
minute | 分钟(0-59,*,*/2,……),不写默认为* |
hour | 小时(0-23,*,*/2,……),不写默认为* |
day | 日(1-31,*,*/2,……),不写默认为* |
month | 月(1-12,*,*/2,……),不写默认为* |
weekday | 周(0-7,*,……),不写默认为* |
job | 执行相应的命令 |
name | 定时任务条目的描述信息 |
state | 确认job或环境变量的开启或者关闭;即创建定时任务或删除定时任务 |
disabled |
如果job应该关闭(被注释掉)。只能影响状态是开启状态的定时任务条目 |
user | 指定修改与编写定时任务的用户信息 |
例1:
[root@m01 ~]# ansible web -m cron -a "name='ntpdate time' minute=*/5 job='/usr/sbin/ntpdate ntp1.aliyun.com &>/dev/null' "
172.16.1.7 | CHANGED => {
"changed": true,
"envs": [],
"jobs": [
"None",
"ntpdate time"
]
}
10. mount 模块
选项参数 | 选项说明 |
---|---|
src | 要挂载的设备 |
path | 挂载点 |
fstype | 挂载的文件系统类型 |
opts | 挂载的参数选项 |
state |
present:不会挂载,只会修改fstab文件 mounted:会进行挂载,会修改fstab文件 unmounted:会进行卸载,不会修改fstab文件 absent:会进行卸载,也会修改fstab文件信息 |
例1:
[root@m01 ~]# ansible web -m mount -a "src=172.16.1.31:/data/ path=/mnt fstype=nfs state=present"
#以上信息只是在/etc/fstab文件中添加了配置信息,不会真正进行挂载(mount -a)
[root@m01 ~]# ansible web -m mount -a "src=172.16.1.31:/data/ path=/mnt fstype=nfs state=mounted"
#以上信息是在/etc/fstab文件中添加了配置信息,并且也会真正进行挂载
11. user 模块
选项参数 | 选项说明 |
---|---|
create_home | 创建家目录,除非设置no,则不创建家目录 |
group | 创建用户组(主组) |
name | 创建的用户名 |
password | 创建用户的密码 |
uid |
创建用户的UID |
shell | 创建用户登录的shell |
state |
absent,移除远端主机的用户 present,创建远端的用户 |
例1:
[root@m01 ~]# ansible 172.16.1.31 -m user -a "name=rsync create_home=no shell=/sbin/nologin"
172.16.1.7 | CHANGED => {
"changed": true,
"comment": "",
"create_home": true,
"group": 1001,
"name": "mysql",
"shell": "/sbin/nologin",
"state": "present",
"system": false,
"uid": 1001
}
12. group 模块
选项参数 | 选项说明 |
---|---|
name | 指定创建的组名 |
gid |
指定组的GID |
state |
absent,移除远端主机的组 present,创建远端的主机组(默认) |
例1:
[root@m01 ~] ansible web -m group -a 'name=tomcat state=present'
172.16.1.7 | CHANGED => {
"changed": true,
"gid": 1000,
"name": "tomcat",
"state": "present",
"system": false
}
五、Ansible 剧本功能
1. 基本语法
- hosts: web # 管理的目标主机
tasks: # playbook所有的任务集合信息
- name: creategroup # 定义任务的名称,非必须
group: name=Tom # 定义一个任务的具体操作动作
- name: cretaeuser
user: name=Andey
2. hosts的定义方式:
方式一:定义所管理的主机IP
- hosts: 172.16.1.7
tasks:
方式二:定义所管理的主机名称信息
- hosts: web01
tasks:
方式三:定义所管理的多主机信息
- hosts: 172.16.1.6, web01
tasks:
3. tasks的定义方式:
方式一:采用变量格式设置任务
tasks:
- name: make sure apache is running
service: name=httpd state=started
方式二:采用字典格式设置任务
tasks:
- name: make sure apache is running
service:
name: httpd
state: started
4. 变量使用方式
方式一:将变量直接写在文件中
- hosts: nfs_server
vars:
Data_dir: /data
tasks:
- name: create data dir
file: path={{ Data_dir }} state=directory owner=nfsnobody group=nfsnobody
方式二:将变量写在变量文件中
- hosts: nfs_server
vars_files:
- vars/server_vars.yml
tasks:
- name: create data dir
file: path={{ Data_dir }} state=directory owner=nfsnobody group=nfsnobody
5. 剧本其他使用方式
#1. 在剧本中设置判断信息
- hosts: oldboy
remote_user: root
tasks:
- name: Check File
file: path=/tmp/this_is_{{ ansible_hostname }}_file state=touch
when: (ansible_hostname == "nfs") or (ansible_hostname == "backup")
#2. 在剧本中设置循环信息
- hosts: all
remote_user: root
tasks:
- name: Add Users
user: name={{ item.name }} groups={{ item.groups }} state=present
with_items:
- { name: 'testuser1', groups: 'bin' }
- { name: 'testuser2', groups: 'root' }
#3. 在剧本中设置忽略错误
- hosts: all
remote_user: root
tasks:
- name: Ignore False
command: /bin/false
ignore_errors: yes
#4. 在剧本中设置标签功能
- hosts: oldboy
remote_user: root
tasks:
- name: Check File
file: path=/tmp/this_is_{{ ansible_hostname }}_file state=touch
when: (ansible_hostname == "nfs01") or (ansible_hostname == "backup")
tags: t1
#指定执行哪个标签任务: ansible-playbook --tags=t1 test.yml
#跳过指定标签任务: ansible-playbook --skip-tags=t1 test.yml
#5. 在剧本中设置触发功能
- hosts: backup
remote_user: root
tasks:
- name: Install rsync
yum: name=rsync state=present
notify: restart rsync server
handlers:
- name: restart rsync server
service: name=rsyncd state=restarted
6. 剧本整合
方式一:include_tasks: f1.yml
- hosts: all
remote_user: root
tasks:
- include_tasks: f1.yml
- include_tasks: f2.yml
方式二:- import_playbook:
[root@m01 ansible-playbook]# cat main.yml
- import_playbook: base.yml
- import_playbook: rsync.yml
- import_playbook: nfs.yml
- import_playbook: oxxx.yml
- import_playbook: rsync.yml
- import_playbook: nfs.yml
7. 规范剧本目录
[root@m01 nfs]mkdir /etc/ansible/roles/nfs/{vars,tasks,templates,handlers,files} --- 创建角色目录下面的子目录
[root@m01 nfs]# tree
.
├── files # 存放需要传输的文件
│ └── exports
├── handlers # 保存触发器配置文件信息
│ └── main.yml
├── tasks # 保存要执行的动作信息文件
│ └── main.yml
├── templates # 保存需要分发模板文件 模板文件中可以设置变量信息
└── vars
└── main.yml # 保存变量信息文件
8. 执行剧本
ansible-playbook --syntax-check rsync_server.yaml # 检查剧本的语法格式命令
ansible-playbook -C rsync_server.yaml # 模拟执行剧本命令
ansible-playbook rsync_server.yaml # 执行剧本命令
来源:CSDN
作者:South_Bay
链接:https://blog.csdn.net/South_Bay/article/details/104430685