导航
1、工具介绍1.1、Ansible 简介Ansible 是一款开源的自动化运维工具,主要用于服务器批量管理、应用部署和任务自动化。它主要的特点有:(1)无客户端的架构,免去了安装客户端的困扰。(2)基于 YAML 的语法配置,使得 Playbook 配置很容易阅读。(3)采用了 模块化的设计,使得其灵活度较高。(4)幂等性。
1.2、Ansible 概念
Playbook 用法汇总示例: [code]#本配置中的所有内容即代表一个剧本
#剧集一
- hosts: linux
tasks:
##任务1
- name: install nginx
yum: #yum 模块
name: nginx
state: present
##任务2
- name: update nginx config
template: #template 模块
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify: restart nginx #调用处理器
handlers: #定义处理器
- name: restart nginx
service:
name: nginx
state: restarted
#剧集二
- hosts: windows
collections: #声明集合,不声明调用集合模块需带集合名称,如 ansible.windows.win_file。
- ansible.windows
tasks:
- name: Remove a file, if present
win_file: #调用 windows 集合中的模块
path: C:\Temp\foo.conf
state: absent
#剧集三
- hosts: web
roles: #角色
- nginx
[/code]
1.3、工作原理Ansible 管理节点(1)首先与被管节点 Agent 建立远程连接,并检查当前系统的模块脚本执行环境。(2)接着管理端将任务模块对应的模块脚本传输至 Agent 端并执行,模块脚本执行时会先进行“状态检测判断”,然后将结果以 json 格式返回。(3)最后删除 Agent 处的临时模块脚本文件并关闭连接。
1.4、作用范围Ansible 拥有丰富的插件和功能模块。而借助其 连接插件,理论上可对大多数设备(Linxu、Windows、网络设备)进行远程管理。但实际上,它只是对 Linux 设备支持度较好(注:大多数功能模块都只对 Linux 有效),对 Windows 和网络设备的管理效果一般。
2、配套工具2.1、ansibleansible 是用于临时 执行单一命令任务 的工具,不用写 playbook 即可执行任务。 [code]#对所有主机执行 id 命令,并查看输出结果。
ansible all -i hosts -m command -a "id" -v
[/code]
2.2、ansible-playbookansible-playbook 是用于 执行复杂命令任务 的工具,必须依赖 playbook 文件才能运行。 [code]#执行 task.yml 任务集。
ansible-playbook -i hosts task.yml
cat task.yml
###文本内容###
- hosts: linux
tasks:
- name: install nginx
yum:
name: nginx
state: present
######
[/code]
2.3、ansible-docansible-doc 是用于 查看模块/插件使用说明 的工具,相当于是 Ansible 的“man 手册”。 [code]#查看 ping 模块的参数介绍。
ansible-doc -s ping
#查看 ping 模块的参数介绍。
ansible-doc -t module -s ping
[/code]
2.4、ansible-vaultansible-vault 是用于 加密 playbook 配置 的工具,防止剧本中的密码信息泄露。 [code]#加密 playbook 任务文件
ansible-vault encrypt task.yml
#执行被加密的 playbook 任务文件
ansible-playbook task.yml --ask-vault-pass
[/code]
2.5、ansible-galaxyansible-galaxy 是用于 下载管理角色/集合 的工具,相当于是 Ansible 的“任务/模块应用商店”或是类似 pip 的“包管理器”。 角色/集合的官网地址:https://galaxy.ansible.com/ui/standalone/roles/、https://galaxy.ansible.com/ui/collections/。 [code]#下载用于自动化部署 nginx 任务的角色
ansible-galaxy role install geerlingguy.nginx
#角色的使用类似 task 一样,具体操作见本文 Playbook 小节。
[/code]
2.6、ansible-consoleansible-console 是用于 与 Ansible 进行命令交互 的工具,相当于是面向 Ansible 的 Shell。 [code]ansible-console
> hosts web
> ping
> shell uptime
[/code]
3、Inventory - 主机清单在主机清单中支持定义:主机、主机组、主机变量、主机组变量,但一般不建议在主机清单中定义变量,变量都是定义在单独的 主机/组文件 中。主机清单支持多种格式去书写,但最常用的格式是 ini 格式。以下是一个主机清单的示例: [code]# hosts.ini
[windows] # windows 组定义了5个主机
www.test-[01:05].com
[linux] # linux 组定义了2个主机,其中一个主机自带登录变量。
192.168.1.1 ansible_user=kali ansible_password=kali
www.test-06.com ansible_host=192.168.1.2
[windows:vars] # windows 组变量
ansible_connection=winrm
ansible_user=administrator
ansible_password=password123
[hosts:children] # 基于组创建的 hosts 组
windows
linux
[/code]
4、Playbook - 任务清单Playbook 是 Ansible 中最重要的一个概念,它定义了批量的主机任务应该如何去执行。而一个 Playbook 则是由一个或多个 Play 构成的,因此,只要了解了 Play 的构成也就了解了 Playbook。 一个 Play 主要是由以下三部分构成:
4.1、Keywords - 关键词Play 中的关键词有点像是 C 语言中的全局变量,在一个 Play 中,hosts 和 tasks/roles 是必不可少的,其余参数则可有可无。Play 常用关键词如下:
4.2、Vars - 变量4.2.1、变量优先级Ansible 中支持自定义变量的地方有很多,以下我将按照优先级的顺序依次列出:
4.2.2、文件变量在上述变量中,关于文件变量 host_vars、group_vars 的构成不太好理解,故以一个 ansible 项目示例做说明: (1)首先,按照如下项目的目录结构制作相应的文件。 [code]nginx_install
├── inventory
│ ├── group_vars
│ │ └── lin.yml
│ ├── hosts
│ └── host_vars
│ └── 192.168.56.20.yml
└── main.yml
[/code]
其中,hosts 文本内容如下: [code][lin]
192.168.56.20
[/code]
(2)然后,以 YAML 的语法格式去编写文件中的变量。lin.yml 文本内容如下: [code]---
v1: a
v2: b
[/code]
(3)最后,在工作目录 nginx_install 下执行命令 4.2.3、特殊变量Facts 变量为了让 Ansible 更了解目标节点,可以让它去收集目标节点的信息,比如获取目标节点的:主机名、系统版本、IP 地址、分区挂载信息等。这些节点信息被称为 Facts,可通过命令 这些变量中以
变量 Facts 和 Hostvars 的值还可通过以下 Play 去查看。 [code]- name: playbooks
hosts: lin
tasks:
- name: info in ansible_facts
debug:
var: ansible_facts
- name: info in hostvars
debug:
var: hostvars
[/code]
register 变量有时候,可能需要将某一条任务执行的结果保存下来,以便在接下的任务中调用或者做些判断。这时就可以通过 register 关键字来将某一任务结果保存为一个变量。【注:这个变量的结构类似于 上面的 hostvars 变量,因此在调用的时候需要注意。】 [code]- name: register variables
hosts: lin
tasks:
- name: capture output of whoami command
command: whoami
register: login
- name: get var
debug:
msg: "login user is {{ login.stdout }}"
[/code]
4.2.4、调用变量构造的变量最终都是为了使用,而变量的类型又多种多样,如:整数、字串、数组、字典 等类型,那么面对这些类型的变量该如何使用呢?以下以一个示例的两种用法去调用它们。 以上面测试 register 变量的示例为例,假设输出的复杂变量 login 的值如下: [code]"login": {
"changed": true,
"cmd": [
"whoami"
],
"delta": "0:00:00.011976",
"end": "2025-12-31 05:27:48.401127",
"failed": false,
"msg": "",
"rc": 0,
"start": "2025-12-31 05:27:48.389151",
"stderr": "",
"stderr_lines": [],
"stdout": "kali",
"stdout_lines": [
"kali"
]
}
[/code]
那么在 Play 中调用其中值的方法如下: [code]- name: register variables
hosts: lin
tasks:
- name: capture output of whoami command
command: whoami
register: login
- name: get var
debug:
msg: "login user1 is {{ login.stdout_lines[0] }}"
- name: get var
debug:
msg: "login user2 is {{ login['stdout_lines'][0] }}"
[/code]
4.3、Tasks - 任务在 Play 中用来执行任务的方式有三种,分别是:tasks(常规任务)、roles(任务组织化)、handlers(可复用任务),三者虽各有各的用法,但本质上都是一样的:执行任务。 4.3.1、Tasks
- name: task test
hosts: linux
tasks:
- name: make sure apache is running
service:
name: httpd
state: started
- name: run this command and ignore the result
command: /usr/bin/somecommand
ignore_errors: True #若命令会返回错误信息,但这个错误对后续任务的执行影响不大时,可使用此关键词忽略错误,让任务继续顺利执行。
[/code]
4.3.2、Roles
(1)Role 角色的管理: [code]#列出已安装的 Role
ansible-galaxy role list
#安装找到的 Role
ansible-galaxy role install geerlingguy.nginx
#删除指定的 Role
ansible-galaxy role remove geerlingguy.nginx
[/code]
(2)Role 角色的应用: [code]- name: install nginx
hosts: linux
roles:
- role: geerlingguy.nginx
vars:
v1: a
v2: b
[/code]
(3)Role 角色的结构: [code]#ansible-galaxy init role_name
#tree role_name/
role_name/ \\ 角色名称
├── defaults \\ 为当前角色设定默认变量时使用此目录,应当包含一个main.yml文件;
│ └── main.yml
├── files \\ 存放有copy或script等模块调用的文件
├── handlers \\ 此目录应当包含一个main.yml文件,用于定义各角色用到的各handler
│ └── main.yml
├── meta \\ 应当包含一个main.yml,用于定义角色的特殊设定及其依赖关系;1.3及以后版本支持
│ └── main.yml
├── README.md
├── tasks \\ 至少包含一个名为main.yml的文件,定义了此角色的任务列表
│ └── main.yml
├── templates \\ template模块会自动在此目录中寻找Jinja2模板文件
├── tests
│ ├── inventory
│ └── test.yml
└── vars \\ 应当包含一个main.yml,用于定义此角色用到的变量
└── main.yml
[/code]
4.3.3、Handlers
- name: handler task test
hosts: all
force_handlers: yes
tasks:
- name: a task which always notifies its handler
command: /bin/true
notify: restart the database
- name: a task which fails because the package doesn't exist
yum:
name: notapkg
state: latest
handlers:
- name: restart the database
service:
name: mariadb
state: restarted
[/code]
4.4、其它技巧4.4.1、When - 判断任务关键词 when 可根据某些条件的是否达成来决定 task 是否应该被执行。 [code]- name: Install vim
hosts: all
tasks:
- name:Install VIM via yum
yum:
name: vim-enhanced
state: installed
when: ansible_os_family == "RedHat"
# when: some_var | float > 90
# when: result is changed
[/code]
4.4.2、Loop - 循环任务关键词 loop 可执行一些重复性的操作。 (1)普通循环 [code]tasks:
- name: postfix and httpd are running
service:
name: "{{ item }}"
state: started
loop:
- postfix
- httpd
- name: retrieve the list of home directories
command: ls /home
register: home_dirs
- name: add home dirs to the backup spooler
file:
path: /mnt/{{ item }}
src: /home/{{ item }}
state: link
loop: "{{ home_dirs.stdout_lines }}"
[/code]
(2)高级循环 [code]- name: test loop
hosts: test
tasks:
- name: add several users
user:
name: "{{ item.name }}"
state: present
groups: "{{ item.groups }}"
loop:
- { name: 'user1', groups: 'wheel' }
- { name: 'user2', groups: 'sudo' }
[/code]
5、常用模块以下模块均来自默认集合 ansible.builtin(面向 linux 系统)。此外,还有两个集合也值得关注,分别是:ansible.windows(面向 windows 系统)、ansible.netcommon(面向网络设备)。
6、常用插件过滤器插件 主要配合 when 对一些变量做一些类型转换,之后再进行判断。 查找插件 主要配合插件 lookup 从各种类型的文件中读取文本内容。 测试插件 主要配合 when 对变量做一些条件的判断。 7、杂七杂八(1)学习参考集合。
(2)命令技巧。 [code]#对主机清单和 playbook 进行语法检查。
ansible-playbook -i hosts --syntax-check playbook
#在开始批量执行任务之前,最好先对所有的目标主机进行通性测试。
ansible all -i hosts -m ping
#查看 web 组有哪些主机
ansible web --list
#以 kali 用户的身份去远程目标,同时再进行 sudo 提权,并打开 5 个并发连接。
ansible lin -i hosts -u kali -k -b -K -f 5 -m command -a "whoami"
[/code]
(3)Playbook 示例。 [code]#本配置中的所有内容即代表一个剧本
#剧集一
- hosts: linux
tasks:
##任务1
- name: install nginx
yum: #yum 模块
name: nginx
state: present
##任务2
- name: update nginx config
template: #template 模块
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify: restart nginx #调用处理器
handlers: #定义处理器
- name: restart nginx
service:
name: nginx
state: restarted
#剧集二
- hosts: windows
collections: #声明集合,不声明调用集合模块需带集合名称,如 ansible.windows.win_file。
- ansible.windows
tasks:
- name: Remove a file, if present
win_file: #调用 windows 集合中的模块
path: C:\Temp\foo.conf
state: absent
#剧集三
- hosts: web
roles: #角色
- nginx
[/code]来源:程序园用户自行投稿发布,如果侵权,请联系站长删除 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |

1. 回头看 日更坚持了1096天。 读《读智能新物种》开更并完成 读《捍卫隐私》开更并完成 读《人机沟通法则》开更并完成 读《共生:4.0时代的人机关系》开更并持续更新 2023年至2025年12月底累计码字3054280字,
三、VS Code安装 3.1安装 VS Code官网下载 https://code.visualstudio.com/ 下载好一键安装即可 四、phpstudy安装搭建网站 下载phpstudy解压安装 官网下载:https://www.xp.cn/download.html 安装完成后一键启