简介 Ansible是一个开源软件,提供配置管理和应用程序部署等项目通用的管理功能。它主要运行在类Unix系
统上,通过特性语言来描述各种资源对象,进而管理类Unix系统和Microsoft Windows系统等系统资源
官网:https://www.ansible.com/
官方文档:https://docs.ansible.com/
功能网站:https://galaxy.ansible.com/
源码网站:https://github.com/ansible
工作流程
用户基于命令或者playbook方式,向ansible的控制端发起用户请求
ansible根据用户请求目标,到控制端的主机列表中验证目标是否存在
若目标主机存在,然后基于连接插件与被控端处于连接状态
根据用户请求指令,结合相应的功能模块,指定目标主机执行相应的功能
目标主机执行完毕后,会将相应的状态结果返回给控制端。
控制端在处理过程中,还会通过插件工具实现日志、邮件等辅助功能
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 容错机制: 建立完善的容错机制,如任务重试、故障转移等,确保系统在部分主机出现故障时仍能正常运行。 智能告警: 设置智能告警系统,及时发现和处理异常情况,减少故障影响范围。