Ansible 是一个开源的服务器配置管理工具。部署 Ansible 的主控端(中控机)通过 SSH 协议,对同一网段中的受控端(服务器)进行远程控制管理,受控端只需要安装 SSH (Linux 默认安装)。Ansible 能够通过预定义剧本对所有受控端进行自动化批量操作,如:服务器的初始化配置、安全基线配置、更新和打补丁系统,安装软件包等。自动化脚本作为任务在主控端上执行后,可一次性完成所有受控端的配置工作,因此受控端数量越多,则节省的人力成本越大。
Ansible 具有以下特点:
1、默认使用 SSH 协议对受控端进行管理,部署简单。通常只需在主控端上部署 Ansible 环境,受控端无需做任何操作;
2、配置简单、功能强大、扩展性强,已预制大量常规运维操作模块,可满足日常大多数运维工作的需要;
3、通过剧本来定制个性化的配置管理自动化批量操作;
4、并行通信,高效运行自动化任务;
5、目前只能部署在 Linux 系统中。
本方案基于CentOS8系统设计,建议在RedHat/CentOS系统中使用。
目录
1.核心概念
2.部署拓扑图
3.主控端安装和配置
4.主控端通过 SSH 秘钥文件免密访问受控端
5.Ansible 使用指南
6.Ansible 剧本
1.核心概念
1.1.相关术语
1、主控端(Control Node):指部署 Ansible 工具的主机。主控端主要用于发布运行任务,执行控制命令。
2、受控端(Controlled Nodes):指通过 Ansible 工具来执行配置管理操作的受控服务器。
3、清单(Inventory):指 Ansible 工具用来识别受控端的主机列表。清单默认安装在 Ansible 工具的 "/etc/ansible/hosts" 文件中。它使用受控端的 IP 地址或者主机名来表示具体的管理主机和认证信息,并可以根据主机的用途进行分组。
4、模块(Modules):指 Ansible 工具执行特定任务的代码块。比如:添加用户,上传文件和对受控端执行 ping 操作等。Ansible 预制超过450个模块,Ansible Galaxy 公共存储库则包含大约 1600 个模块。
5、任务(Task):指 Ansible 工具在受控端上执行的操作。可以通过 "ad-hoc" 指令执行一个任务。
6、剧本(Playbook):指 Ansible 工具利用 YAML 标记语言编写的可重复执行的任务的列表,启动剧本可以实现对受控端自定义的批量操作。在 Github 上有大量共享的Ansible 剧本。
1.2.程序结构
- Ansible:主程序。
- Core Modules: 预定义模块。
- Custom Modules: 核心模块功能不足时,用户添加的扩展模块。
- Plugins: 通过插件来实现记录日志,发送邮件或其他功能。
- Playbooks: YAML格式剧本文件,多个任务定义在一个文件中,定义受控端批量调用的模块。
- Connectior Plugins: ansible基于连接插件连接到各个主机上,默认是使用ssh
- Host Inventory: 记录受控端的主机信息,包括端口、密码、IP 等。
1.2.工作模式
1、任务模式:
1)【ad-hoc 模式】(点对点模式):调用单个模块,面向多个受控端执行单条指令的任务。
2)【playbook 模式】(剧本模式):将多个模块编写成剧本文件,面向多个受控端执行批量指令的任务。
2、工作流程:
2.部署拓扑图
网络资源规划:
1、主控端
- 主机名:Master
- IP 地址:192.168.0.10
- 程序:Ansible 、OpenSSH
- 系统:CentOS8
2、受控端
节点名 | 主机名 | IP:PORT | 程序 | 操作系统 | 远程控制账户 |
---|---|---|---|---|---|
受控端-1 | Slave-1 | 192.168.0.21:22 | OpenSSH | CentOS8 | centos |
受控端-2 | Slave-2 | 192.168.0.22:22 | OpenSSH | CentOS8 | centos |
受控端≥3 | Slave-3 | 192.168.0.23:22 | OpenSSH | CentOS8 | centos |
3.主控端安装和配置
1、安装 EPEL 的 Yum 源。
使用文本编辑器创建仓库配置文件:
[centos@Master ~ ]$ sudo gedit /etc/yum.repos.d/epel.repo
在文件中编写以下内容并保存:
[epel-modular]
name=Extra Packages for Enterprise Linux Modular $releasever - $basearch
baseurl=http://mirrors.aliyun.com/epel/$releasever/Modular/$basearch
enabled=1
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-8
[epel]
name=Extra Packages for Enterprise Linux $releasever - $basearch
baseurl=http://mirrors.aliyun.com/epel/$releasever/Everything/$basearch
enabled=1
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-8
更新 Yum 源:
[centos@Master ~]$ sudo dnf clean all
[centos@Master ~]$ sudo dnf makecache
Extra Packages for Enterprise Linux Modular 8 - 429 kB/s | 118 kB 00:00
Extra Packages for Enterprise Linux 8 - x86_64 3.7 MB/s | 6.9 MB 00:01
元数据缓存已建立。
EPEL(Extra Packages for Enterprise Linux)是企业级 Linux 操作系统的扩展包仓库,为 Redhat/CentOS系统提供大量的额外软件包。
2、安装 Ansible (OpenSSH 已默认安装)。
[centos@Master ~]$ sudo dnf install ansible
注意:程序文件在"/usr/bin"目录中,配置文件在"/etc/ansible"目录中。
3、设置 Ansible 配置文件常用参数。
使用文本编辑器打开配置文件:
[centos@Master ~]$ sudo gedit /etc/ansible/ansible.cfg
修改或验证文件中的以下参数并保存:
# 表示是否检查受控端的 SSH 密钥,默认为 True 。当 SSH 使用【账号/口令】认证的方式登录受控端时,应设置为 "False"(当注释该选项时,默认值为 "True");当 SSH 使用【非对称加密】认证的方式登录受控端应设置为 "True"。
host_key_checking = False
# 表示受控端清单文件的位置。默认为 【/etc/ansible/hosts】 。
inventory = /etc/ansible/hosts
# 表示远程执行临时文件目录。默认为 【~/.ansible/tmp】 。
remote_tmp = ~/.ansible/tmp
# 表示本地临时文件目录。默认为 【~/.ansible/tmp】 。
local_tmp = ~/.ansible/tmp
# 表示存放模块的目录,多个目录使用冒号(:)分隔。默认为 【 /usr/share/ansible】 。
library = /usr/share/ansible
# 表示存放角色的目录。认为 【/etc/ansible/roles】 。
roles_path = /etc/ansible/roles
# 表示受控端的并发连接数,默认为 5 。
forks = 5
# 表示 sudo 程序,默认为 sudo 。
sudo_exe = sudo
# 表示使用 sudo 执行指令的用户,默认为 root 。
sudo_user = root
# 表示每次执行指令时是否询问 sudo 口令,默认为 True 。
ask_sudo_pass = True
# 表示是否允许提权。默认为 True 。
become=True
# 表示提权指令,如:sudo、su 。 默认为 sudo。
become_method=sudo
# 表示默认的提权用户。默认为 root 。
become_user=root
# 表示每次执行指令时是否询问提权口令,默认为 False 。
become_ask_pass=False
# 表示使用 sudo 执行指令的 Shell 环境。
executable = /bin/sh
# ssh 远程登录用户名,默认为 root 。
remote_user = root
# 表示每次执行指令时是否询问 ssh 口令,默认为 True 。
ask_pass = True
# 表示受控端的 SSH 服务端口,默认为22。
remote_port = 22
# 表示 SSH 的连接超时时间,单位为秒,默认为 60 秒。
timeout = 60
# 表示传输模式,默认为 smart 。
transport = smart
# 表示默认执行的模块,默认为 command 。
module_name = command
# 表示日志文件的位置,默认不记录日志。
log_path = /var/log/ansible.log
注意:其他选项一般情况下使用默认设置即可。当技术环境发生特定变化时(如:受控端的 SSH 服务端口变化为"2211"),修改对应的特定参数(如:"remote_port = 2211")即可。
4、设置受控端主机清单。
使用文本编辑器打开主机清单文件:
[centos@Master ~]$ sudo gedit /etc/ansible/hosts
在文件中的追加以下内容并保存:
[autobots]
192.168.0.21
# 192.168.0.21 ansible_ssh_host=192.168.0.21 ansible_ssh_port=22
192.168.0.22
# 192.168.0.22 ansible_ssh_host=192.168.0.22 ansible_ssh_port=22
192.168.0.23
# 192.168.0.23 ansible_ssh_host=192.168.0.23 ansible_ssh_port=22
[autobots:vars]
ansible_ssh_user=centos
ansible_ssh_pass=password
ansible_become_pass=password
受控端主机定义规范说明:
# 定义每个主机的 IP/DNS 和 个性化选项。
[分组标识]
<IP/DNS> [选项1=值1] [选项2=值2] [选项..]
# 定义同一分组中主机的共用选项。
[分组标识:vars]
[选项1=值1]
[选项2=值2]
[选项..]
可选项说明(优先级高于 "/etc/ansible/ansible.cfg"文件定义的值):
- ansible_ssh_host:指定受控端别名对应的IP。
- ansible_ssh_port:指定连接到这个主机的ssh端口,默认 22。
- ansible_ssh_user:连接到该主机的 ssh 用户。
- ansible_ssh_pass:连接到该主机的 ssh 密码。
- ansible_become:是否允许提权,默认是 true 。
- ansible_become_user:默认提权用户账号,默认是 root 。
- ansible_become_method:默认提权指令,如:sudo / su,默认是 sudo 。
- ansible_become_pass:默认提权指令口令。
- ansible_connection:连接类型,可以是 local 、 ssh 或 paramiko 。
- ansible_ssh_private_key_file:私钥文件路径。
- ansible_shell_type:目标系统的 Shell 环境,默认为 /bin/sh 。
5、测试。
1)在主控端显示受控端的网络连接情况:
[centos@Master ~]$ ansible all -m ping
192.168.0.21 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
192.168.0.22 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
192.168.0.23 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
2)在主控端显示受控端的当前用户名:
[centos@Master ~]$ ansible all -m shell -a "whoami"
192.168.0.23 | CHANGED | rc=0 >>
centos
192.168.0.21 | CHANGED | rc=0 >>
centos
192.168.0.22 | CHANGED | rc=0 >>
centos
3)在主控端显示受控端的 root 用户名(使用 sudo 提升到管理员权限):
[centos@Master ~]$ ansible all -m shell -a "whoami" --become
192.168.0.21 | CHANGED | rc=0 >>
root
192.168.0.22 | CHANGED | rc=0 >>
root
192.168.0.23 | CHANGED | rc=0 >>
root
4)在主控端显示受控端的当前用户ID和用户名(执行 2 条指令,多条指令使用 ";" 分隔):
[centos@Master ~]$ ansible all -m shell -a "id -u;whoami"
192.168.0.21 | CHANGED | rc=0 >>
1000
centos
192.168.0.22 | CHANGED | rc=0 >>
1000
centos
192.168.0.23 | CHANGED | rc=0 >>
1000
centos
4.主控端通过 SSH 秘钥文件免密访问受控端
SSH 提供两种访问方式:
一是通过【账号/口令】的方式,主控端在登录受控端时,使用账号和口令进行认证。当使用这种方式时远程访问时,Ansible 需要在 "/etc/ansible/hosts"(受控端清单文件) 中定义所有的主机登录账号和口令。
二是通过【非对称加密】的方式,主控端创建一组 SSH 非对称秘钥,并为受控端的登录信息创建加密文件,主控端在登录受控端时,使用加密文件进行认证。当使用这种方式时远程访问时,Ansible 不需要在 "/etc/ansible/hosts"(受控端清单文件) 中定义主机的登录账号和口令。
通过【非对称加密】的方式远程控制受控端的方式如下:
4.1.主控端配置。
1、创建 SSH 非对称秘钥。
[centos@Master ~]$ ssh-keygen
2、创建受控端的登录信息加密文件。
[centos@Master ~]$ ssh-copy-id centos@192.168.0.21
[centos@Master ~]$ ssh-copy-id centos@192.168.0.22
[centos@Master ~]$ ssh-copy-id centos@192.168.0.23
3、设置 Ansible 配置文件常用参数。
使用文本编辑器打开配置文件:
[centos@Master ~]$ sudo gedit /etc/ansible/ansible.cfg
修改或验证文件中的以下参数并保存:
# 表示是否检查受控端的 SSH 密钥,默认为 True 。当 SSH 使用【非对称加密】认证的方式登录受控端应设置为 "True"。
host_key_checking = True
4、设置受控端主机清单。
使用文本编辑器打开配置文件:
[centos@Master ~]$ sudo gedit /etc/ansible/hosts
在文件中的追加以下内容并保存:
[autobots]
192.168.0.21
# 192.168.0.21 ansible_ssh_host=192.168.0.21 ansible_ssh_port=22
192.168.0.22
# 192.168.0.22 ansible_ssh_host=192.168.0.22 ansible_ssh_port=22
192.168.0.23
# 192.168.0.23 ansible_ssh_host=192.168.0.23 ansible_ssh_port=22
4.2.受控端配置
在全部受控端上建立登录账号的免密提权,以"Slave-1"为例:
使用文本编辑器打开【sudo】权限配置文件:
[centos@Slave-1 ~]$ sudo gedit /etc/sudoers
在文件末尾追加以下参数并保存:
centos ALL=(ALL) NOPASSWD: ALL
注意:其他"受控端"节点上全部需要按照以上步骤配置。
5.Ansible 使用指南
1、Ansible 常用模块
模块名 | 功能说明 |
---|---|
ping | 测试受控端主机连通性。 |
command | 在受控端主机上执行指令,不支持管道。 |
shell | 在受控端主机上调用 Shell 解析器,支持管道命令。 |
copy | 将主控端的文件复制到受控端主机,支持写入文件内容和修改文件权限。 |
file | 创建、删除受控端主机上目录、文件、链接。 |
fetch | 从受控端主机上复制文件(不支持目录)到主控端。 |
cron | 管理受控端主机的定时任务。 |
yum | 管理受控端主机的软件安装。 |
service | 管理受控端主机的服务。 |
user | 管理受控端主机的用户。 |
group | 管理受控端主机的用户组。 |
script | 将主控端的脚本文件在受控端主机上运行。 |
setup | 收集受控端主机的内存、CPU等主机信息。 |
2、Ansible 常用的指令格式
ansible 受控端 -m 模块 [-a '指令'] [-u 登录账户] [-become -become-method 提权指令 -become-user 提权账户]
- ansible
程序名。 - 受控端
受控端主机标识。可以是:"all" 标识全部主机;"分组标识" 标识同一分组的主机;"主机别名"标识特定的一个主机。如:ansible all -m ping、ansible slavehosts -m ping、ansible 192.168.0.21 -m ping。 - -m 模块
调用的模块。如:ping / command / shell / copy / file / fetch / cron / yum / service / user / group / script / setup / ... - [-a '指令']
调用模块运行的指令。如:-m copy -a 'src=~/copy.test dest=~/copy-dest.test'。 - [-u 登录账户]
受控端的管理账户,不指定使用配置文件中的账号或 SSH 加密文件的账号。 - [-become]
受控端提权管理。 - [-become-method]
受控端提权的指令,不指定时使用配置文件中的设置值,默认为 "sudo" 。 - [-become-user]
受控端提权的账户,不指定时使用配置文件中的设置值,默认为 "root" 。
3、ping 模块使用示例
测试受控端主机连通性。
[centos@Master ~]$ ansible all -m ping
# 响应信息
192.168.0.21 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
192.168.0.22 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
192.168.0.23 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
4、command 模块使用示例
在受控端主机上执行指令,不支持管道。
[centos@Master ~]$ ansible all -m command -a 'whoami'
# 响应信息
192.168.0.22 | CHANGED | rc=0 >>
centos
192.168.0.21 | CHANGED | rc=0 >>
centos
192.168.0.23 | CHANGED | rc=0 >>
centos
5、shell 模块使用示例
在受控端主机上调用 Shell 解析器,支持管道命令。
[centos@Master ~]$ ansible all -m shell -a 'whoami;id -G'
# 响应信息
192.168.0.23 | CHANGED | rc=0 >>
centos
1000 10
192.168.0.22 | CHANGED | rc=0 >>
centos
1000 10
192.168.0.21 | CHANGED | rc=0 >>
centos
1000 10
6、copy 模块使用示例
将主控端的文件复制到受控端主机,支持写入文件内容和修改文件权限。
选项说明:
选项 | 说明 |
---|---|
src | 主控端的源文件(目录)。 |
content | 主控端设置的源内容。 |
dest | 受控端目标文件(目录)的存放位置(绝对路径)。 |
backup | "yes/no"。 设置为"yes"时,若受控端目标文件(目录)已存在,则自动重命名旧文件(目录)。默认为"no"。 |
directory_mode | 受控端目标目录的递归权限,如:755。 |
mode | 受控端目标文件的权限,如:755。 |
force | "yes/no"。 当设置为"yes"时,若受控端目标文件(目录)已存在则覆盖;当设置为"yes"时,跳过已存在的目标文件(目录)。默认为"yes"。 |
1)从主控端复制文件到受控端。
[centos@Master ~]$ ansible all -m copy -a 'src=~/copy.test dest=~/copy-dest.test'
[centos@Master ~]$ ansible all -m shell -a 'ls ~/copy-dest.test'
192.168.0.21 | CHANGED | rc=0 >>
/home/centos/copy-dest.test
192.168.0.23 | CHANGED | rc=0 >>
/home/centos/copy-dest.test
192.168.0.22 | CHANGED | rc=0 >>
/home/centos/copy-dest.test
2)给定内容创建新文件(覆盖旧文件)到受控端。
[centos@Master ~]$ ansible all -m copy -a 'content="ansible copy test\n" dest=~/copy-dest.test mode=666'
[centos@Master ~]$ ansible all -m shell -a 'ls ~/copy-dest.test;cat ~/copy-dest.test'
192.168.0.23 | CHANGED | rc=0 >>
/home/centos/copy-dest.test
ansible copy test new
192.168.0.22 | CHANGED | rc=0 >>
/home/centos/copy-dest.test
ansible copy test new
192.168.0.21 | CHANGED | rc=0 >>
/home/centos/copy-dest.test
ansible copy test new
3)给定内容创建新文件(备份并覆盖旧文件)到受控端。
[centos@Master ~]$ ansible all -m copy -a 'content="ansible copy test new\n" dest=~/copy-dest.test mode=666 backup=yes'
[centos@Master ~]$ ansible all -m shell -a 'ls ~/copy-dest.test*'
192.168.0.23 | CHANGED | rc=0 >>
/home/centos/copy-dest.test
/home/centos/copy-dest.test.28587.2020-06-12@16:15:13~
192.168.0.21 | CHANGED | rc=0 >>
/home/centos/copy-dest.test
/home/centos/copy-dest.test.12017.2020-06-12@16:15:13~
192.168.0.22 | CHANGED | rc=0 >>
/home/centos/copy-dest.test
/home/centos/copy-dest.test.28421.2020-06-12@16:15:13~
7、file 模块使用示例
创建、删除受控端主机上目录、文件、链接。
选项说明:
选项 | 说明 |
---|---|
path | 受控端目标文件的存放位置(绝对路径)。 |
state | 受控端目标文件的操作模式,包括:directory(创建目录)/touch(创建文件)/ link(创建软链接)/ hard(创建硬链接)/ absent(删除目录、文件或取消链接) |
owner | 受控端文件(目录)的所属用户。 |
group | 受控端文件(目录)的所属用户组。 |
src | 创建链接文件时,指定源文件的绝对路径。当"state=link"时使用。 |
force | "yes" 或 "no"。 设置为"yes"时,表示强制创建或覆盖软链接文件(即使源文件不存在)。当"state=link"时使用。默认为"no"。 |
1)创建目录到受控端。
[centos@Master ~]$ ansible all -m file -a 'path=~/dir-dest state=directory'
[centos@Master ~]$ ansible all -m shell -a 'cd ~/dir-dest;pwd'
192.168.0.21 | CHANGED | rc=0 >>
/home/centos/dir-dest
192.168.0.23 | CHANGED | rc=0 >>
/home/centos/dir-dest
192.168.0.22 | CHANGED | rc=0 >>
/home/centos/dir-dest
2)创建目录到受控端,并指定目录所属的用户和组。
[centos@Master ~]$ ansible all -m file -a 'path=~/dir-dest state=directory owner=centos group=centos' --become
[centos@Master ~]$ ansible all -m shell -a 'ls -l ~ | grep dir-dest;cd ~/dir-dest;pwd' --become
192.168.0.23 | CHANGED | rc=0 >>
drwxr-xr-x. 2 centos centos 6 6月 13 21:44 dir-dest
/root/dir-dest
192.168.0.21 | CHANGED | rc=0 >>
drwxr-xr-x. 2 centos centos 6 6月 13 21:44 dir-dest
/root/dir-dest
192.168.0.22 | CHANGED | rc=0 >>
drwxr-xr-x. 2 centos centos 6 6月 13 21:44 dir-dest
/root/dir-dest
3)创建文件到受控端。
[centos@Master ~]$ ansible all -m file -a 'path=~/file-dest.test state=touch'
[centos@Master ~]$ ansible all -m shell -a 'ls ~/file-dest.test'
192.168.0.21 | CHANGED | rc=0 >>
/home/centos/file-dest.test
192.168.0.23 | CHANGED | rc=0 >>
/home/centos/file-dest.test
192.168.0.22 | CHANGED | rc=0 >>
/home/centos/file-dest.test
4)创建文件到受控端,并指定文件所属的用户和组。
[centos@Master ~]$ ansible all -m file -a 'path=~/file-dest state=touch owner=centos group=centos' --become
[centos@Master ~]$ ansible all -m shell -a 'ls -l ~ | grep file-dest' --become
192.168.0.23 | CHANGED | rc=0 >>
-rw-r--r--. 1 centos centos 0 6月 13 21:49 /root/file-dest
192.168.0.22 | CHANGED | rc=0 >>
-rw-r--r--. 1 centos centos 0 6月 13 21:49 /root/file-dest
192.168.0.21 | CHANGED | rc=0 >>
-rw-r--r--. 1 centos centos 0 6月 13 21:49 /root/file-dest
注意:创建文件和目录时,如果文件或目录不存在,则创建一个新的文件或目录;如果已存在,则更新最后修改时间。
5)创建软链接。
[centos@Master ~]$ ansible all -m file -a 'path=~/file-dest.link src=~/file-dest.test state=link'
[centos@Master ~]$ ansible all -m shell -a 'ls -l ~/file-dest.link'
192.168.0.21 | CHANGED | rc=0 >>
lrwxrwxrwx. 1 centos centos 27 6月 13 21:56 /home/centos/file-dest.link -> /home/centos/file-dest.test
192.168.0.22 | CHANGED | rc=0 >>
lrwxrwxrwx. 1 centos centos 27 6月 13 21:56 /home/centos/file-dest.link -> /home/centos/file-dest.test
192.168.0.23 | CHANGED | rc=0 >>
lrwxrwxrwx. 1 centos centos 27 6月 13 21:56 /home/centos/file-dest.link -> /home/centos/file-dest.test
6)创建硬链接。
[centos@Master ~]$ ansible all -m file -a 'path=~/file-dest.hard src=~/file-dest.test state=hard'
[centos@Master ~]$ ansible all -m shell -a 'ls -l ~/file-dest.hard'
92.168.0.23 | CHANGED | rc=0 >>
-rw-rw-r--. 2 centos centos 0 6月 13 21:47 /home/centos/file-dest.hard
192.168.0.22 | CHANGED | rc=0 >>
-rw-rw-r--. 2 centos centos 0 6月 13 21:47 /home/centos/file-dest.hard
192.168.0.21 | CHANGED | rc=0 >>
-rw-rw-r--. 2 centos centos 0 6月 13 21:47 /home/centos/file-dest.hard
7)删除指定的目录、文件或者取消链接文件(不能识别通配符)。
[centos@Master ~]$ ansible all -m file -a 'path=~/file-dest.test state=absent'
[centos@Master ~]$ ansible all -m shell -a 'ls ~/file-dest.test'
192.168.0.21 | FAILED | rc=2 >>
ls: 无法访问'/home/centos/file-dest.test': 没有那个文件或目录non-zero return code
192.168.0.23 | FAILED | rc=2 >>
ls: 无法访问'/home/centos/file-dest.test': 没有那个文件或目录non-zero return code
192.168.0.22 | FAILED | rc=2 >>
ls: 无法访问'/home/centos/file-dest.test': 没有那个文件或目录non-zero return code
8、fetch 模块使用示例
从受控端主机上复制文件(不支持目录)到主控端。
选项说明:
选项 | 说明 |
---|---|
src | 受控端源文件的存放位置(绝对路径)。 |
dest | 主控端目标文件的存放位置(绝对路径)。 |
[centos@Master ~]$ ansible all -m file -a 'path=~/fetch.test state=touch'
[centos@Master ~]$ ansible all -m fetch -a 'src=~/fetch.test dest=~'
[centos@Master ~]$ find ~ -name fetch.test
/home/centos/192.168.0.23/home/centos/fetch.test
/home/centos/192.168.0.22/home/centos/fetch.test
/home/centos/192.168.0.21/home/centos/fetch.test
9、cron 模块使用示例
管理受控端主机的定时任务。
选项说明:
选项 | 说明 |
---|---|
name | 受控端定时任务名称(说明)。 |
job | 受控端定时任务执行的shell。 |
user | 受控端定时任务执行的用户。 |
special_time | 受控端定时任务执行的时机,包括:reboot(重启时),annually(每年),monthly(每月),weekly(每周),daily(每天),hourly(每小时)。 |
month | 受控端定时任务运行的【月】( crontab 语法)。 |
weekday | 受控端定时任务运行的【周】( crontab 语法)。 |
day | 受控端定时任务运行的【天】(crontab 语法)。 |
hour | 受控端定时任务运行的【点】( crontab 语法)。 |
minute | 受控端定时任务运行的【分】( crontab 语法)。 |
state | 受控端定时任务的操作模式,包括:present(添加,默认值)/absent(删除) |
补充知识:
crontab 时间格式:分 时 日 月 周
数值表达方法:
分:0-59
时:0-23
日:1-31
月:1-12
周:0-7(0和7都表示周日)特殊字符表达方法:
【 * 】(星号):表示任何时刻都接受的意思。如执行时机是连续执行,则表示为:* * * * * 。
【 , 】(逗号):表示分隔时段的意思。如执行时机是3点和6点,则表示为:0 3,6 * * * 。
【 - 】(减号):表示一段时间范围内。如执行时机是8点到12点之间的每小时的20分,则表示为: 20 8-12 * * * 。
【 /n 】(斜线):表示每隔n个时间单位间隔的意思。如每五分钟进行一次,则表示为: */5 * * * * 。
1)创建定时任务。
[centos@Master ~]$ ansible all -m cron -a 'name="cron-test" minute=* job="echo \"cron test\" >> ~/cron.test"'
[centos@Master ~]$ ansible all -m shell -a 'crontab -l'
192.168.0.21 | CHANGED | rc=0 >>
#Ansible: cron-test
* * * * * echo "cron test" >> ~/cron.test
192.168.0.23 | CHANGED | rc=0 >>
#Ansible: cron-test
* * * * * echo "cron test" >> ~/cron.test
192.168.0.22 | CHANGED | rc=0 >>
#Ansible: cron-test
* * * * * echo "cron test" >> ~/cron.test
2)删除定时任务。
[centos@Master ~]$ ansible all -m cron -a 'name="cron-test" state=absent'
[centos@Master ~]$ ansible all -m shell -a 'crontab -l'
192.168.0.23 | CHANGED | rc=0 >>
192.168.0.22 | CHANGED | rc=0 >>
192.168.0.21 | CHANGED | rc=0 >>
10、yum 模块使用示例
管理受控端主机的软件安装。
选项说明:
选项 | 说明 |
---|---|
name | 受控端计划安装、升级、卸载的 rpm 包名。 |
state | 受控端安装的操作模式,包括:present(安装)/ latest(升级)/ absent(删除卸载) |
update_cache | 受控端强制更新 yum 源文件。 |
1)安装软件。
[centos@Master ~]$ ansible all -m yum -a 'name=openssh state=present' -become
2)升级软件。
[centos@Master ~]$ ansible all -m yum -a 'name=openssh state=latest' -become
3)卸载软件。
[centos@Master ~]$ ansible all -m yum -a 'name=openssh state=absent' -become
4)更新 yum 源。
[centos@Master ~]$ ansible all -m yum -a 'update_cache=yes' -become
11、service 模块使用示例
管理受控端主机的服务。
选项说明:
选项 | 说明 |
---|---|
name | 受控端服务名。 |
state | 受控端服务的操作模式,包括:started(启动)/ stopped(停止)/ restarted(重新启动)/ reloaded(重载配置) |
enabled | 设置为"yes"时,受控端服务开启开机自启动;设置为"no"时,受控端服务禁止开机自启动。 |
sleep | 在重启服务的过程中,关闭后再次开启前间隔的时间,单位为秒。 |
1)启动服务。
[centos@Master ~]$ ansible all -m service -a 'name=sshd state=started' -become
2)启动服务并设置开启自启动。
[centos@Master ~]$ ansible all -m service -a 'name=sshd state=started enabled=true' -become
3)停止服务。
[centos@Master ~]$ ansible all -m service -a 'name=sshd state=stopped' -become
4)重启服务。
[centos@Master ~]$ ansible all -m service -a 'name=sshd state=restarted' -become
5)重载配置。
[centos@Master ~]$ ansible all -m service -a 'name=sshd state=reloaded' -become
6)开启服务开机自启动。
[centos@Master ~]$ ansible all -m service -a 'name=sshd enabled=yes' -become
7)禁止服务开机自启动。
[centos@Master ~]$ ansible all -m service -a 'name=sshd enabled=no' -become
11、user 模块使用示例
管理受控端主机的用户。
选项说明:
选项 | 说明 |
---|---|
uid | 受控端用户ID。 |
name | 受控端用户名。 |
password | 受控端用户口令(密文)。 |
group | 受控端用户所属的主要组。 |
groups | 受控端用户所属的附加组,如果指定为"groups="则表示删除所有组。 |
createhome | "yes/no"。设置为"yes"时,受控端创建用户时创建主目录;设置为"no"时,受控端创建用户时不创建主目录 。 |
home | 受控端用户的主目录,当 "createhome=yes" 时使用。 |
shell | 受控端用户的默认 shell 。 |
comment | 受控端用户的说明 。 |
state | 受控端用户的操作模式,不指定时表示创建用户,如果指定为"state=absent"则表示删除用户。 |
remove | 设置为"yes"时,删除用户时同步删除用户的主目录。 |
force | 设置为"yes"时,强制删除用户和用户主目录。 |
system | 设置为"yes"时,创建时设置为系统用户。 |
1)获取用户口令的密文。
[centos@Master ~]$ openssl passwd "password"
FIee9ppkFJh1U
2)创建用户。
[centos@Master ~]$ ansible all -m user -a 'name=ansible password=FIee9ppkFJh1U' -become
[centos@Master ~]$ ansible all -m shell -a 'id ansible'
192.168.0.22 | CHANGED | rc=0 >>
uid=1001(ansible) gid=1001(ansible) 组=1001(ansible)
192.168.0.21 | CHANGED | rc=0 >>
uid=1001(ansible) gid=1001(ansible) 组=1001(ansible)
192.168.0.23 | CHANGED | rc=0 >>
uid=1001(ansible) gid=1001(ansible) 组=1001(ansible)
3)创建用户(不创建主目录)。
[centos@Master ~]$ ansible all -m user -a 'name=ansible password=FIee9ppkFJh1U createhome=no' -become
[centos@Master ~]$ ansible all -m shell -a 'id ansible'
192.168.0.22 | CHANGED | rc=0 >>
uid=1001(ansible) gid=1001(ansible) 组=1001(ansible)
192.168.0.21 | CHANGED | rc=0 >>
uid=1001(ansible) gid=1001(ansible) 组=1001(ansible)
192.168.0.23 | CHANGED | rc=0 >>
uid=1001(ansible) gid=1001(ansible) 组=1001(ansible)
3)创建用户(指定 shell )。
[centos@Master ~]$ ansible all -m user -a 'name=ansible password=FIee9ppkFJh1U shell=/bin/sh' -become
[centos@Master ~]$ ansible all -m shell -a 'id ansible'
192.168.0.22 | CHANGED | rc=0 >>
uid=1001(ansible) gid=1001(ansible) 组=1001(ansible)
192.168.0.21 | CHANGED | rc=0 >>
uid=1001(ansible) gid=1001(ansible) 组=1001(ansible)
192.168.0.23 | CHANGED | rc=0 >>
uid=1001(ansible) gid=1001(ansible) 组=1001(ansible)
4)删除用户。
[centos@Master ~]$ ansible all -m user -a 'name=ansible state=absent remove=yes' -become
[centos@Master ~]$ ansible all -m shell -a 'id ansible'
192.168.0.22 | FAILED | rc=1 >>
id: “ansible”:无此用户non-zero return code
192.168.0.21 | FAILED | rc=1 >>
id: “ansible”:无此用户non-zero return code
192.168.0.23 | FAILED | rc=1 >>
id: “ansible”:无此用户non-zero return code
4)删除用户(不删除用户主目录)。
[centos@Master ~]$ ansible all -m user -a 'name=ansible state=absent remove=no' -become
[centos@Master ~]$ ansible all -m shell -a 'id ansible'
192.168.0.22 | FAILED | rc=1 >>
id: “ansible”:无此用户non-zero return code
192.168.0.21 | FAILED | rc=1 >>
id: “ansible”:无此用户non-zero return code
192.168.0.23 | FAILED | rc=1 >>
id: “ansible”:无此用户non-zero return code
12、group 模块使用示例
管理受控端主机的用户组。
选项说明:
选项 | 说明 |
---|---|
gid | 受控端用户组ID。 |
name | 受控端用户组名。 |
state | 受控端用户组的操作模式,不指定时表示创建用户组,如果指定为"state=absent"则表示删除用户组。 |
system | 设置为"yes"时,创建时设置为系统用户组。 |
1)创建用户组。
[centos@Master ~]$ ansible all -m group -a 'name=ansible' -become
[centos@Master ~]$ ansible all -m shell -a 'cat /etc/group | grep ansible' -become
192.168.0.23 | CHANGED | rc=0 >>
ansible:x:1001:
192.168.0.22 | CHANGED | rc=0 >>
ansible:x:1001:
192.168.0.21 | CHANGED | rc=0 >>
ansible:x:1001:
2)删除用户组。
[centos@Master ~]$ ansible all -m group -a 'name=ansible state=absent' -become
[centos@Master ~]$ ansible all -m shell -a 'cat /etc/group | grep ansible' -become
192.168.0.23 | FAILED | rc=1 >>
non-zero return code
192.168.0.21 | FAILED | rc=1 >>
non-zero return code
192.168.0.22 | FAILED | rc=1 >>
non-zero return code
13、script 模块使用示例
将主控端的脚本文件在受控端主机上运行。
[centos@Master ~]$ echo 'echo "ansible script test" >> ~/script.test' > ~/script.sh
[centos@Master ~]$ chmod 755 ~/script.sh
[centos@Master ~]$ ansible all -m script -a '~/script.sh'
[centos@Master ~]$ ansible all -m shell -a 'cat ~/script.test'
192.168.0.23 | CHANGED | rc=0 >>
ansible script test
192.168.0.21 | CHANGED | rc=0 >>
ansible script test
192.168.0.22 | CHANGED | rc=0 >>
ansible script test
14、setup 模块使用示例
收集受控端主机的内存、CPU等主机信息。
1)查看信息。
[centos@Master ~]$ ansible all -m setup -a 'filter=ansible_all_ipv4_addresses'
192.168.0.23 | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"192.168.0.23"
],
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false
}
192.168.0.22 | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"192.168.0.22"
],
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false
}
192.168.0.21 | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"192.168.0.21"
],
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false
}
filter 选项( 使用通配符 "*"):
- ansible_all_ipv4_addresses:仅显示ipv4的信息。
- ansible_devices:仅显示磁盘设备信息。
- ansible_distribution:显示是什么系统,例:centos,suse等。
- ansible_distribution_major_version:显示是系统主版本。
- ansible_distribution_version:仅显示系统版本。
- ansible_machine:显示系统类型,例:32位,还是64位。
- ansible_eth0:仅显示eth0的信息。
- ansible_hostname:仅显示主机名。
- ansible_kernel:仅显示内核版本。
- ansible_lvm:显示lvm相关信息。
- ansible_memtotal_mb:显示系统总内存。
- ansible_memfree_mb:显示可用系统内存。
- ansible_memory_mb:详细显示内存情况。
- ansible_swaptotal_mb:显示总的swap内存。
- ansible_swapfree_mb:显示swap内存的可用内存。
- ansible_mounts:显示系统磁盘挂载情况。
- ansible_processor:显示cpu个数(具体显示每个cpu的型号)。
- ansible_processor_vcpus:显示cpu个数(只显示总的个数)。
2)保存信息。
[centos@Master ~]$ ansible all -m setup -a 'filter=ansible_all_ipv4_addresses' --tree ~/host
6.Ansible 剧本
1、Ansible 剧本文件的格式
文件扩展名为 ".yml",内容包括:
- hosts: <受控端1>
[remote_user: <登录账户>]
[sudo_user:<提权账户>]
tasks:
- name: <任务描述1>
<模块>:<指令>
- hosts: <受控端...>
[remote_user: <登录账户>]
[sudo_user:<提权账户>]
tasks:
- name: <任务描述...>
<模块>:<指令>
- hosts <受控端>
受控端主机标识。可以是:"all" 标识全部主机;"分组标识" 标识同一分组的主机;"主机别名"标识特定的一个主机。多个主机用 ":" 分隔。 - [remote_user <管理账户>]
受控端的管理账户,不指定使用配置文件中的账号或 SSH 加密文件的账号。 - [sudo_user <提权账户>]
受控端提权的账户,不指定时使用配置文件中的设置值,默认为 "root" 。 - tasks
任务列表。 - tasks name <任务说明>
任务描述。 - tasks <模块>:<指令>
调用的模块。如:ping / command / shell / copy / file / fetch / cron / yum / service / user / group / script / setup / ...
调用模块运行的指令。如:-m copy -a 'src=~/copy.test dest=~/copy-dest.test'。
2、Ansible 制作剧本
使用文本编辑器创建或修改剧本文件:
[centos@Master ~]$ gedit ~/playbook-test.yml
编写剧本文件内容并保存:
- hosts: all
tasks:
- name: create test file
file: path=~/playbook.test state=touch
- name: write test content
shell: echo "Ansible Playbook Test" >> ~/playbook.test
- name: write test param1
shell: echo {{param1}} >> ~/playbook.test
- name: write test param2
shell: echo {{param1}} >> ~/playbook.test
在剧本文件中通过 "{{参数名}}" 定义参数变量。
验证剧本文件语法:
[centos@Master ~]$ ansible-playbook --syntax-check ~/playbook-test.yml
playbook: /home/centos/playbook-test.yml
3、Ansible 测试剧本
[centos@Master ~]$ ansible-playbook --check -e 'param1="Ansible_Playbook_Param_1" param2="Ansible_Playbook_Param_2"' ~/playbook-test.yml
4、Ansible 运行剧本
[centos@Master ~]$ ansible-playbook -e 'param1="Ansible_Playbook_Param_1" param2="Ansible_Playbook_Param_2"' ~/playbook-test.yml
调用剧本时,通过参数【-e 'key1="value1" key2="value2" key...' 】输入变量内容,变量内容不识别空格。当剧本未定义参数时,不需要本参数。
5、验证。
[centos@Master ~]$ ansible all -m shell -a 'ls ~/playbook.test'
192.168.0.23 | CHANGED | rc=0 >>
/home/centos/playbook.test
192.168.0.22 | CHANGED | rc=0 >>
/home/centos/playbook.test
192.168.0.21 | CHANGED | rc=0 >>
/home/centos/playbook.test
[centos@Master ~]$ ansible all -m shell -a 'cat ~/playbook.test'
192.168.0.21 | CHANGED | rc=0 >>
Ansible Playbook Test
Ansible_Playbook_Param_1
Ansible_Playbook_Param_2
192.168.0.22 | CHANGED | rc=0 >>
Ansible Playbook Test
Ansible_Playbook_Param_1
Ansible_Playbook_Param_2
192.168.0.23 | CHANGED | rc=0 >>
Ansible Playbook Test
Ansible_Playbook_Param_1
Ansible_Playbook_Param_2