自动化运维之【Ansible+SSH】中控机模式服务器管理方案

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.部署拓扑图

Ansible 中控机模式部署拓扑图

网络资源规划:

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 和 个性化选项。
[分组标识]
 [选项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 [email protected]
[centos@Master ~]$ ssh-copy-id [email protected]
[centos@Master ~]$ ssh-copy-id [email protected]

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

你可能感兴趣的:(自动化运维之【Ansible+SSH】中控机模式服务器管理方案)