简介

Ansible是一个开源软件,提供配置管理和应用程序部署等项目通用的管理功能。它主要运行在类Unix系

统上,通过特性语言来描述各种资源对象,进而管理类Unix系统和Microsoft Windows系统等系统资源

官网:https://www.ansible.com/

官方文档:https://docs.ansible.com/

功能网站:https://galaxy.ansible.com/

源码网站:https://github.com/ansible

工作流程

  1. 用户基于命令或者playbook方式,向ansible的控制端发起用户请求
  2. ansible根据用户请求目标,到控制端的主机列表中验证目标是否存在
  3. 若目标主机存在,然后基于连接插件与被控端处于连接状态
  4. 根据用户请求指令,结合相应的功能模块,指定目标主机执行相应的功能
  5. 目标主机执行完毕后,会将相应的状态结果返回给控制端。
  6. 控制端在处理过程中,还会通过插件工具实现日志、邮件等辅助功能

Ansible安装和配置文件解析

基础需求

ansible的服务端和客户端基于ssh协议进行通信,所以必须提前准备ssh环境

控制端专用需求

控制端支持类unix系统,不支持Windows系统

需要python支持,提前准备python2.7+或者python3.5+的环境

Ubuntu 安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#更新软件源
apt update
apt install -y software-properties-common

#安装ansible专用软件源
add-apt-repository --yes --update ppa:ansible/ansible

#查看ansible的软件版本信息
root@ubuntu24-13:~# apt-cache madison ansible
ansible | 13.5.0-1ppa~noble | https://ppa.launchpadcontent.net/ansible/ansible/ubuntu noble/main amd64 Packages
#刚才安装的软件源信息
ansible | 9.2.0+dfsg-0ubuntu5 | https://mirrors.aliyun.com/ubuntu noble/universe amd64 Packages


#查看ansible-core核心软件版本
root@ubuntu24-13:~# apt-cache madison ansible-core
ansible-core | 2.20.4-1ppa~noble | https://ppa.launchpadcontent.net/ansible/ansible/ubuntu noble/main amd64 Packages
ansible-core | 2.16.3-0ubuntu2 | https://mirrors.aliyun.com/ubuntu noble/universe amd64 Packages

#安装ansible
apt-get install ansible

#检查安装的ansible的版本
ansible --version

Centos 安装

1
2
3
4
5
6
7
8
9
10
11
12
# 安装依赖软件源
yum update
yum install epel-release

# 安装ansible
# 从 Ansible 4.0 开始,项目拆分出 ansible-core(约 80 个模块)和独立分发的 ansible(包含 2000+ 社区集合)。
# EPEL 9 决定只打包 ansible-core,因为维护完整 ansible 的所有集合依赖过于复杂,且官方推荐用 pip 安装完整版
yum install ansible-core

# 检测软件安装包效果
[root@rocky9-12 ~]# rpm -q ansible-core
ansible-7.7.0-1.el9.noarch

PIP方式安装

一般情况无法用pip直接安装,所以需要准备python虚拟环境,以下以ubuntu为例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#准备pip环境
apt install python3 python3-venv python3-pip -y

#准备工作目录并进入到工作目录
mkdir my_project && cd my_project

#创建python虚拟环境 venv
python3 -m venv venv

#加载虚拟环境
source venv/bin/activate

#在虚拟环境使用pip安装ansible
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple ansible

#检查安装的版本
ansible --version

#退出虚拟环境
deactivate

Git方式安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#准备工作目录并进入到工作目录
mkdir /data/codes && cd /data/codes

#从git获取ansible文件
git clone https://githubfast.com/ansible/ansible.git

#进入目标文件
cd ./ansible

#加载环境配置文件
source ./hacking/env-setup

#使用python检测ansible版本
python3 bin/ansible --version

命令文件

1
2
3
4
5
6
7
8
/usr/bin/ansible                   # ansible主命令
/usr/bin/ansible-config # ansible 配置管理命令
/usr/bin/ansible-console # ansible交互式命令
/usr/bin/ansible-doc # ansible模块帮助命令
/usr/bin/ansible-galaxy # ansible 扩展命令,用于获取别人的优秀的角色模板文件
/usr/bin/ansible-playbook # ansible 任务管理工具
/usr/bin/ansible-pull # ansible 反模式工作命令
/usr/bin/ansible-vault # ansible 文件专用加密工具

利用ansible实现管理的主要方式:

Ad-Hoc 即利用ansible命令,主要用于临时命令使用场景

Ansible-playbook 主要用于长期规划好的,大型项目的场景,需要有前期的规划过程

结果显示:

通用格式:ansible <目标主机> 参数

专用格式:ansible <目标主机> -m 模块 -a 模块参数

命令方式:在命令行执行ansible的方式叫"Ad-Hoc",肯定还有其他执行方式。

主要功能:ansible的主要功能都是通过各种各样的插件模块来实现特有功能的。

拓展内容:ansible的默认模块叫command

Ansible 中的 Ad-Hoc 命令允许用户快速地在远程主机上执行单个任务或命令,而无需创建复杂的剧本
(Playbook)

配置文件

/etc/ansible/ansible.cfg

主配置文件,配置ansible工作特性,也可以在项目的目录中创建此文件,当前目录下如果也有ansible.cfg,则此文

件优先生效,建议每个项目目录下,创建独有的ansible.cfg文件

/etc/ansible/hosts 主机清单文件

   信息来源方面:Ansible 的hosts清单文件中的主机信息有时可能会参考/etc/hosts文件中的内容来

获取主机名与 IP 的映射关系,尤其是在没有使用动态主机发现等其他方式获取主机信息的情况下。

   网络配置方面:在通过 Ansible 进行网络相关的配置管理时,如果涉及到修改系统的网络配置,可能会

间接影响到/etc/hosts文件。比如,使用 Ansible playbook 配置主机的网络参数,可能会根据配置需求

修改/etc/hosts文件中的相关内容。

  • 绿色:执行成功并且不需要做改变的操作

  • 黄色:执行成功并且对目标主机做变更

  • 红色:执行失败

/etc/ansible/roles/ 存放角色的目录

Ansible 的配置文件可以放在多个不同地方,表示作用范围的不同,优先级从高到低顺序如下

ANSIBLE_CONFIG 环境变量

./ansible.cfg   当前目录下的ansible.cfg

~/.ansible.cfg 当前用户家目录下的.ansible.cfg

/etc/ansible/ansible.cfg 系统默认配置文件

对于ansible来说,他们的优先级是按照从上到下排列的,软件的根目录下的配置文件是最后的承载效果
了。

ping模块

ping是Ansible专门用来测试主机存活的模块

1
2
3
4
5
6
root@ubuntu24-13:~# ansible localhost -m ping
localhost | SUCCESS => {
"changed": false,
"ping": "pong"
}

显示更多信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
root@ubuntu:~# ansible -m ping localhost -vv
ansible [core 2.19.3]
config file = /etc/ansible/ansible.cfg
configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3/dist-packages/ansible
ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections
executable location = /usr/bin/ansible
python version = 3.12.3 (main, Aug 14 2025, 17:47:21) [GCC 13.3.0] (/usr/bin/python3)
jinja version = 3.1.2
pyyaml version = 6.0.1 (with libyaml v0.2.5)
Using /etc/ansible/ansible.cfg as config file
Skipping callback 'default', as we already have a stdout callback.
Skipping callback 'oneline', as we already have a stdout callback.
localhost | SUCCESS => {
"changed": false,
"ping": "pong"
}

Ansible-doc

ansible-doc是专门用来查看ansible的模块帮助信息的,我们可以通过-h参数来查看他的帮助信息

常见参数

-a 显示所有帮助信息,该参数已经被 –metadata-dump 参数替代

-l 显示所有模块

-s 显示简单的帮助信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
root@ubuntu:~# ansible-doc -h
usage: ansible-doc [-h] [--version] [-v] [-M MODULE_PATH] [--playbook-dir BASEDIR]
[-t {become,cache,callback,cliconf,connection,httpapi,inventory,lookup,netconf,shell,vars,module,strategy,test,filter,role,keyword}]
[-j] [-r ROLES_PATH] [-e ENTRY_POINT | -s | -F | -l | --metadata-dump] [--no-fail-on-errors]
[plugin ...]

plugin documentation tool

positional arguments:
plugin Plugin

options:
--metadata-dump **For internal use only** Dump json metadata for all entries, ignores other options.
--no-fail-on-errors **For internal use only** Only used for --metadata-dump. Do not fail on errors. Report the error message in
the JSON instead.
--playbook-dir BASEDIR
Since this tool does not use playbooks, use this as a substitute playbook directory. This sets the relative
path for many features including roles/ group_vars/ etc.
--version show program's version number, config file location, configured module search path, module location,
executable location and exit
-F, --list_files Show plugin names and their source files without summaries (implies --list). A supplied argument will be used
for filtering, can be a namespace or full collection name.
-M MODULE_PATH, --module-path MODULE_PATH
prepend colon-separated path(s) to module library (default={{ ANSIBLE_HOME ~
"/plugins/modules:/usr/share/ansible/plugins/modules" }}). This argument may be specified multiple times.
-e ENTRY_POINT, --entry-point ENTRY_POINT
Select the entry point for role(s).
-h, --help show this help message and exit
-j, --json Change output into json format.
-l, --list List available plugins. A supplied argument will be used for filtering, can be a namespace or full collection
name.
-r ROLES_PATH, --roles-path ROLES_PATH
The path to the directory containing your roles. This argument may be specified multiple times.
-s, --snippet Show playbook snippet for these plugin types: inventory, lookup, module
-t {become,cache,callback,cliconf,connection,httpapi,inventory,lookup,netconf,shell,vars,module,strategy,test,filter,role,keyword}, --type {become,cache,callback,cliconf,connection,httpapi,inventory,lookup,netconf,shell,vars,module,strategy,test,filter,role,keyword}
Choose which plugin type (defaults to "module"). Available plugin types are : ('become', 'cache', 'callback',
'cliconf', 'connection', 'httpapi', 'inventory', 'lookup', 'netconf', 'shell', 'vars', 'module', 'strategy',
'test', 'filter', 'role', 'keyword')
-v, --verbose Causes Ansible to print more debug messages. Adding multiple -v will increase the verbosity, the builtin
plugins currently evaluate up to -vvvvvv. A reasonable level to start is -vvv, connection debugging might
require -vvvv. This argument may be specified multiple times.

See man pages for Ansible CLI options or website for tutorials https://docs.ansible.com

主机清单

https://docs.ansible.com/projects/ansible/latest/inventory_guide/intro_inventory.html

ansible的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory file中将其分组命名

默认的inventory file为 /etc/ansible/hosts

生产建议在每个项目目录下创建项目独立的hosts文件

1
2
3
4
主机清单的描述方式有两种:主机ip地址和主机名

## blue.example.com
## 192.168.100.1
1
2
3
4
5
6
7
主机列表有两种形式:散列主机列表和主机组列表

散列主机列表 主机组列表 嵌套主机组列表
## blue.example.com ## [webservers] ## [server:children]
## 192.168.100.1:9999 ## beta.example.org ## webservers
## 192.168.1.100 ## [webservers]
## www[1:100].example.com

主机列表命名

编辑主机列表,主机清单的配置条目不允许出现 短横杠-,若出现则有问题提示信息

1
2
3
增加两种样式的主机列表
echo '10.0.0.15' >> /etc/ansible/hosts
echo -e "[ansible_server]\n10.0.0.15" >> /etc/ansible/hosts

跨主机免密认证

ansible使用-k参数或者主机列表采用ansible_ssh_pass都可以达到ssh连接的效果,但是前者太繁琐,后者容易造成安全隐患,所以还是使用跨主机免密认证

1
2
3
4
5
6
7
8
9
#生成密钥对
ssh-keygen -t rsa

#传递密钥文件
#root是目标主机用户,@之后是目标主机ip地址
ssh-copy-id root@10.0.0.15

#进行连接测试
ansible 10.0.0.15 -a "ls /root"

Python解释器警告问题

1
2
3
4
5
6
7
8
9
root@ubuntu:~# ansible 10.0.0.15 -a "ls /root"
[WARNING]: Host '10.0.0.15' is using the discovered Python interpreter
at '/usr/bin/python3.12', but future installation of another Python interpreter
could cause a different interpreter to be discovered.
See https://docs.ansible.com/ansible-core/2.19/reference_appendices/interpreter_discovery.html
for more information.
10.0.0.15 | CHANGED | rc=0 >>
packages.chroot
snap

这个提示的问题是目标主机的Ansible 使用的是位于 /usr/bin/python3.12 的 Python 解释器。如果未来如果安

装了另一个 Python 解释器,这个路径的含义可能会改变,这可能会导致 Ansible 脚本执行时出现问题。

所以要解决这个问题,可以在inventory(一般在/etc/ansible/hosts)文件中指定明确的Python解释器

1
2
3
4
5
6
7
8
9
10
11
12
#修改主机清单,指定明确的Python解释器
sed -i 's#.15#.15 ansible_python_interpreter=/usr/bin/python3.12#g' /etc/ansible/hosts

vim /etc/ansible/hosts
在对应的目标主机后面加上ansible_python_interpreter=/usr/bin/python3.12

#如果目标主机比较多的话,可以直接在总配置文件里面设定一个解释器
vim /etc/ansible/ansible.cfg

[defaults]
deprecation_warnings = False # 遇到[DEPRECATION WARNING]: 可以忽略
interpreter_python = /usr/bin/python3 # 设定python解释器,版本不要过细,不然会冲突

这下再次执行就不会有warning的警告了

Ansible常用模块

Command模块

command作为默认模块,我们不需要-m来指定模块,可以对目标主机使用”-a”传入一个命令参数,来执行查看本机上的信息,命令格式如下:

ansible <目标主机> -a ‘可执行命令’

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
root@ubuntu:~# ansible localhost -a "ifconfig"
localhost | CHANGED | rc=0 >>
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.0.13 netmask 255.255.255.0 broadcast 10.0.0.255
ether 00:0c:29:4c:98:9a txqueuelen 1000 (Ethernet)
RX packets 377238 bytes 521672563 (521.6 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 70104 bytes 5317116 (5.3 MB)
TX errors 0 dropped 47 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 1132 bytes 111176 (111.1 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1132 bytes 111176 (111.1 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

Shell模块

因为ansible模块很多时候对于某些特殊字符的执行效果不好,所以shell模块可以弥补,或者直接就用shell模块

命令格式如下

ansible <目标主机> -m shell -a ‘可执行命令’

如果要将默认模块改为shell模块

1
2
3
4
5
vim /etc/ansible/ansible.cfg

#在defaultes下面设置模块为shell
[defaults]
module_name=shell

系统管理模块

Hostname模块

hostname模块主要就是用来设置目标远程主机的主机名属性

命令格式如下

ansible <目标主机> -m hostname -a ‘name=主机名’

这种方式修改的主机名是立刻并且永久生效的

1
2
3
4
5
6
7
8
9
10
11
12
root@ubuntu-13:~# ansible 10.0.0.15 -m hostname -a "name=ansible-node2"
10.0.0.15 | CHANGED => {
"ansible_facts": {
"ansible_domain": "",
"ansible_fqdn": "ip6-localhost",
"ansible_hostname": "ansible-node2",
"ansible_nodename": "ansible-node2"
},
"changed": true,
"name": "ansible-node2"
}

修改主机名的时候用hostname命令一般会将 /etc/hostname 和 /etc/hosts 这两个我呢见都变更,但是ansible只会修改 /etc/hostname这个文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
root@ubuntu-13:~# ansible 10.0.0.15 -a "hostname"
10.0.0.15 | CHANGED | rc=0 >>
ansible-node2

root@ubuntu-13:~# ansible 10.0.0.15 -a "cat /etc/hosts"
10.0.0.15 | CHANGED | rc=0 >>
127.0.0.1 localhost
127.0.1.1 ubuntu

# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

User模块

user模块主要是对远程主机的用户进行操作

命令格式如下

ansible <目标主机> -m user -a ‘属性1=值1 属性2=值2 … 属性n=值n’

用户名的设置一定要提前做好规划

uid的值一定要提前做好规划,而且必须唯一

常见属性

comment:            # 用户的描述信息.

   group:                # 设定用户的主组信息

   home:                 # 设置用户家目录.

   password:           # 设置登录密码

   shell:                 # 设定用户的专用shell类型

   state:                 # 设定用户的存活状态

   system:               # 设定用户是否为系统用户

   uid:                   # 设定用户uid

remove               # 设定删除用户及家目录等数据,默认remove=no,推荐用yes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#创建一个用户testuser,属组是root和bin,uid为10086,家目录在/tmp/testuser
root@ubuntu:~# ansible 10.0.0.15 -m user -a "name=testuser system=yes
groups=root,bin uid=10086 comment='testuser'
shell=/sbin/nologin home=/tmp/testuser state=present"
10.0.0.15 | CHANGED => {
"changed": true,
"comment": "testuser",
"create_home": true,
"group": 984,
"groups": "root,bin",
"home": "/tmp/testuser",
"name": "testuser",
"shell": "/sbin/nologin",
"state": "present",
"stderr": "useradd warning: testuser's uid 10086 is greater than SYS_UID_MAX 999\n",
"stderr_lines": [
"useradd warning: testuser's uid 10086 is greater than SYS_UID_MAX 999"
],
"system": true,
"uid": 10086
}

#查看是否创建成功
root@ubuntu-13:~# ansible 10.0.0.15 -a "id testuser"
10.0.0.15 | CHANGED | rc=0 >>
uid=10086(testuser) gid=984(testuser) groups=984(testuser),0(root),2(bin)


#创建一个携带ssh认证的用户
root@ubuntu-13:~# ansible 10.0.0.16 -m user -a "name=sshuser home=/tmp/sshuser
generate_ssh_key=yes ssh_key_bits=2048 ssh_key_file=.ssh/id_rsa"
10.0.0.15 | CHANGED => {
   "changed": true,
   "comment": "",
   "create_home": true,
   "group": 10087,
   "home": "/tmp/sshuser",
   "name": "sshuser",
   "shell": "/bin/sh",
   "ssh_fingerprint": "2048 SHA256:VxIIyFslSqA+O66GLlL05z9PYYkaUPBW86WFu4puLUA
ansible-generated on ansible-node2 (RSA)",
   "ssh_key_file": "/tmp/sshuser/.ssh/id_rsa",
   "ssh_public_key": "ssh-rsa
AAAAB3NzaC1yc2EAAAADAQABAAABAQCrCThep/JEn8zobk/KRTmiBUpzPduo8jlTGumAZzkoQu4fbJjhL
1LQbJzeKo6k7jxj/iz+BUpRvTvaAya8lMyNieLOexUgFK1tmvIA+VkzWO/82DiwYsq2czvE0fZ4HEozYj
rMRS0ZUQo2pTd9KuhoqPISh1Hg39Wwry80C93Ex1/WeEHPVj48LfG/aZSNKrQLRZjivsTklDd6glyTbNA
KVI8rsBXlFTRK7juVtaRZt1Wmn1O3kDWW8P6MwsAu6i2qctg2B6GX/3mO7usV7GjqeKBqoQ7hMi2KBiNb
1OBPf/rdjCMdawEvJ8DtvPHD9Tu+dbZMNSkjr+E4gxRTdNcP ansible-generated on ansiblenode2",
   "state": "present",
   "system": false,
   "uid": 10087
}

#验证效果
root@ubuntu:~# ansible 10.0.0.15 -a "getent passwd sshuser"
10.0.0.15 | CHANGED | rc=0 >>
sshuser:x:10087:10087::/tmp/sshuser:/bin/sh

root@ubuntu:~# ansible 10.0.0.15 -a "ls /tmp/sshuser/.ssh"
10.0.0.15 | CHANGED | rc=0 >>
id_rsa
id_rsa.pub


#删除用户
root@ubuntu-13:~# ansible 10.0.0.15 -m user -a "name=webapp state=absent remove=yes"
10.0.0.15 | SUCCESS => {
"changed": false,
"name": "webapp",
"state": "absent"
}


Group模块

group模块主要用于用户组管理

命令格式如下

ansible <目标主机> -m group -a ‘属性1=值1 属性2=值2 … 属性n=值n’

Setup模块

setup模块主要用于收集主机的属性信息

命令格式如下

ansible <目标主机> -m setup -a ‘属性1=值1 属性2=值2 … 属性n=值n’

常见属性

   fact_path:             # 设定facts的文件路径

     filter:               # 指定过滤格式,可以使用正则表达式

不加-a就是获取目标主机所有属性信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#获取目标主机所有属性
root@ubuntu:~# ansible 10.0.0.15 -m setup
10.0.0.15 | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"10.0.0.15"
],
"ansible_all_ipv6_addresses": [],
"ansible_apparmor": {
"status": "enabled"
},
...

#获取目标主机特定属性:内存总量
root@ubuntu-13:~# ansible 10.0.0.15 -m setup -a "filter=ansible_memtotal_mb"
10.0.0.15 | SUCCESS => {
"ansible_facts": {
"ansible_memtotal_mb": 3866
},
"changed": false
}


#获取目标主机特定属性:网卡信息
root@ubuntu-13:~# ansible 10.0.0.15 -m setup -a "filter=*ens*"
10.0.0.15 | SUCCESS => {
"ansible_facts": {
"ansible_ens33": {
"active": true,
"device": "ens33",
...

Mount模块

mount模块主要用于远程主机的挂载

命令格式如下

ansible <目标主机> -m mount -a ‘属性1=值1 属性2=值2 … 属性n=值n’

常见属性

src=/path/device #要挂载的设备路径,可以是网络地址

path=/path/point #挂载点

state=absent|mounted|present|unmounted|remounted

    # absent 取消挂载,并删除永久挂载中的配置

							     # mounted 永久挂载,立即生效,挂载点不存在会自动创建

				   			     # present 永久挂载,写配置文件,但不会立即生效

							     # unmounted 临时取消挂载,不改变配置文件

    # remounted 重新挂载,但不会改变配置文件

fstab=/path/file #指定挂载配置文件路径,默认 /etc/fstab

fstype=str #设备文件系统 xfs|ext4|swap|iso9660…

opts=str #挂载选项

Sysctl模块

sysctl模块主要用来修改远程主机上的内核参数

命令格式如下

ansible <目标主机> -m sysctl -a ‘属性1=值1 属性2=值2 … 属性n=值n’

常见属性

name=str #参数名称

val=str #参数值

reload=yes|no #默认yes,调用 /sbin/sysctl -p 生效

state=present|absent #是否保存到文件,默认present

sysctl_file=/path/file #指定保存文件路径,默认 /etc/sysctl.conf

sysctl_set=yes|no #是否使用systctl -w 校验,默认no

文件模块

Copy模块

Fetch模块

File模块

压缩包模块

Get_url模块

archive模块

unarchive模块

Service模块

service模块主要用于操作应用服务

命令格式如下

ansible <目标主机> -m service -a ‘属性1=值1 属性2=值2 … 属性n=值n’

常见属性

enabled:             # 设置开机自启动

   name:                 # 服务名称(强制选项).

   state:                 # 设置服务的状态started|stopped|restarted|reloaded

Playbook

组成部分 功能描述 常见属性 备注
Target section 执行playbook的目标主机 hosts、remote_user、order 必备内容
Variable section 执行playbook所需要的变量 vars 可选内容
Task section playbook中的功能任务 task(name、模块名称) 必备内容
Handler section 各任务之间的关联关系 handler(name、模块名称) 可选内容

ansible在执行playbook的时候,执行效果具有幂等性(即一个命令执行多次与执行一次效果一样)

生产实践技巧

不同规模ansible的策略

前期规划和准备

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
主机分组和分类	
根据主机的功能、地理位置、业务角色等因素对 大规模数量 主机进行合理分组。例如,将 Web 服务
器、数据库服务器、缓存服务器分别划分为不同的组。这样可以针对不同组的特点制定不同的 Playbook 策
略,便于管理和维护

在 Ansible 的 inventory 文件中清晰地定义这些分组,示例如下:
[web_servers]
web1.example.com
web2.example.com
...
[db_servers]
db1.example.com
db2.example.com
...

备份和恢复策略
对所有主机的关键数据和配置进行定期备份。可以使用脚本结合工具(如 rsync、tar 等)实现自动化
备份,并将备份数据存储在安全的远程位置。
 制定详细的恢复计划,确保在出现问题时能够快速恢复到正常状态。可以编写专门的恢复 Playbook 进
行测试和验证。

性能和资源管理
合理调整 Ansible 的并发参数,避免对网络和系统造成过大压力。可以使用 forks 和 serial 参数
进行精细控制。例如,设置 forks 为 100 - 200,根据主机组的情况调整 serial 参数进行分批处理.
对于大规模任务,可以使用 Ansible Tower 或 AWX 等工具进行更高级的任务调度和管理,实现任务
的排队、优先级设置等功能。
实时监控控制节点和目标主机的资源使用情况,包括 CPU、内存、磁盘 I/O 和网络带宽等。可以使用
Zabbix、Prometheus 等监控工具进行全面监控。
 根据监控结果及时调整任务配置和资源分配,避免资源瓶颈导致任务失败。例如,如果发现某个主机组的
网络带宽不足,可以适当降低该组的并发数。

稳定性维护措施

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
错误捕获与处理
在 Playbook 中使用 ignore_errors、failed_when 等关键字来捕获和处理可能出现的错误。结合
when 条件语句,根据任务执行结果进行不同的处理,提高 Playbook 的健壮性。
- name: xxx
 command: xxx
 ignore_errors: yes
 register: command_result
- name: 结果捕获
 debug:
   msg: "Command result: {{ command_result }}"
   
重试机制
对于可能由于临时网络问题或资源竞争导致的任务失败,设置重试机制。可以使用 Ansible 的
retries 和 delay 参数实现:
- name: 重试任务
 command: some_command
 retries: 3
 delay: 5

故障转移
当某台主机出现故障时,能够自动将任务转移到其他可用主机上。可以通过在 Playbook 中添加逻辑判
断和任务重定向来实现。例如,在部署 Web 应用时,如果某台 Web 服务器出现故障,可以将流量自动切换到
其他正常的服务器上。

日志管理
配置 Ansible 记录详细的执行日志,包括任务开始时间、结束时间、执行结果、错误信息等。可以在
ansible.cfg 中设置日志文件路径,定期对日志进行分析,及时发现潜在的问题和趋势。
[defaults]
   log_path = /var/log/ansible.log
   display_skipped_hosts = True
   display_ok_hosts = True
在 Playbook 中,可以使用 register 关键字记录每个任务的执行结果,包括执行时间。通过比较不
同任务的执行时间,找出性能瓶颈。
- name: 执行任务
 command: sleep 5
 register: task_result
 ignore_errors: true
- name: 打印任务执行信息
 debug:
   msg: "Task execution time: {{ task_result.start | to_datetime -
task_result.end | to_datetime }}"

日志量规模提升后,可以借助于:
利用命令行工具[grep|awk|sed|sort|uniq]进行筛选和统计
编写 Python 脚本进行深度分析
借助 ELK Stack 进行集中管理和可视化分析
使用 Splunk 进行日志分析

监控管理
使用 Ansible 的回调插件或第三方监控工具实时监控 Playbook 的执行状态。当出现任务失败、资源异常等情况时,及时发出告警通知,以便管理员及时处理。

测试验证
在对大规模数量 主机执行 Playbook 之前,先在小规模的测试环境中进行充分测试。可以选择部分主机进行测试,确保 Playbook 的正确性和稳定性。
 对测试结果进行详细分析,修复发现的问题后再进行大规模部署。
 
采用灰度发布的方式,先对一小部分主机(如 10% - 20%)进行部署,观察一段时间,确保没有问题后
再逐步扩大范围,直到覆盖所有 5000 台主机。这样可以有效降低风险,及时发现和解决潜在的问题。

任务执行措施

1
2
3
4
5
6
7
8
9
10
11
12
13
模块化和复用
使用角色(Roles):
将常用的任务封装成角色,提高代码的复用性和可维护性。例如,将安装和配置 Nginx 的任务封装成一
个 Nginx 角色,在不同的 Playbook 中可以重复使用。

使用包含(Include)和导入(Import):
将大型 Playbook 拆分成多个小的文件,使用 include_tasks 或 import_tasks 进行组合,使代
码结构更清晰。

并行与串行任务安排
分析任务依赖关系:
对于无依赖的任务,可以并行执行以提高效率;对于有依赖的任务,按照正确的顺序串行执行。例如,在
部署 Web 应用时,先安装依赖软件,再部署应用代码。
百台规模

性能优化

1
2
3
4
5
并发控制:
Ansible 默认并发数较低,可通过修改 ansible.cfg 中的 forks 参数来提高并发数。初始可设置为 50 - 100,然后根据控制节点性能和网络状况进行调整。

事实收集优化:
事实收集(Facts Gathering)会消耗大量时间和资源,对于不需要的主机信息,可以通过在Playbook 中设置 gather_facts: no 来禁用,仅在必要时启用。

资源管理

1
2
3
4
5
控制节点资源:
确保控制节点有足够的 CPU、内存和网络带宽。建议至少 4 核 CPU、16GB 内存以及高速稳定的网络连接。

内存使用:
避免在 Playbook 中处理大量数据导致内存溢出,合理分割任务和数据。

任务编排

1
2
3
4
5
任务分组:
将相关任务分组,避免单个 Playbook 过于复杂,提高可读性和可维护性。

顺序执行:
按照合理的顺序安排任务,先执行检查和准备任务,再进行核心配置和部署。

错误处理

1
2
错误捕获:
在 Playbook 中使用 ignore_errors、failed_when 等关键字来处理可能出现的错误,确保任务失败时不会影响整个 Playbook 的执行。
千台规模

性能优化

1
2
3
4
5
6
7
8
9
10
11
12
13
并发控制:
Ansible 进一步调整 forks 参数,可设置为 100 - 200,但要注意控制节点的承受能力。同时,可
以使用 serial 参数对主机进行分批处理,减轻网络和系统压力。
- name: 分批执行任务
 hosts: all
 serial: 50

事实收集优化:
启用事实缓存,减少重复的事实收集操作。可以在 ansible.cfg 中配置缓存插件和有效期。
[defaults]
  fact_caching = jsonfile
   fact_caching_connection = /tmp/ansible_facts_cache
   fact_caching_timeout = 3600

资源管理

1
2
3
4
5
分布式控制:
考虑使用多个控制节点来分担管理压力,将主机分组分配到不同的控制节点进行管理。

资源监控:
实时监控控制节点和目标主机的资源使用情况,及时调整配置和任务

任务编排

1
2
3
4
5
模块化设计:
将常用的任务封装成角色(Roles),提高 Playbook 的复用性和可维护性。

任务并行性:
分析任务之间的依赖关系,尽可能并行执行无依赖的任务,提高整体执行效率。

错误处理

1
2
详细日志:
配置详细的日志记录,便于快速定位和解决问题。可以在 ansible.cfg 中设置日志文件路径。
五千台规模

性能优化

1
2
3
4
5
6
7
8
9
10
高级并发策略:
除了调整 forks 和 serial 参数,还可以使用 Ansible Tower 或 AWX 等自动化平台来实现更精
细的并发控制和任务调度。

异步执行:
对于耗时较长的任务,使用异步执行模式,让 Ansible 无需等待任务完成即可继续处理其他主机的任务。
   - name: Asynchronous task
     command: long_running_command
     async: 3600
     poll: 0

资源管理

1
2
3
4
5
6
7
大规模分布式架构:
采用分布式控制节点和分布式存储系统,确保系统的扩展性和可靠性。
对于管理 5000 台主机的场景,建议至少 8 核 CPU、32GB 内存以及高速稳定的网络连接。

资源优化配置:
根据主机的角色和功能,合理分配资源,避免资源浪费。
使用系统监控工具(如 top、htop、nmon 等)实时监控控制节点的资源使用情况,及时发现并解决资源瓶颈问题。

任务编排

1
2
3
4
5
层次化管理:
将主机划分为不同的层次和区域,采用层次化的 Playbook 结构进行管理,提高管理效率。

自动化流水线:
结合 CI/CD 工具,实现自动化的部署和配置更新流程。

错误处理

1
2
3
4
容错机制:
建立完善的容错机制,如任务重试、故障转移等,确保系统在部分主机出现故障时仍能正常运行。
智能告警:
设置智能告警系统,及时发现和处理异常情况,减少故障影响范围。