Ansible管理Windows主机文档:批量管理Windows主机的完整指南
Ansible管理Windows主机文档:批量管理Windows主机的完整指南
Ansible是一款开源自动化平台,主要用于配置管理和自动化运维。它支持跨平台操作,能够无代理地管理Linux、Windows、Unix和网络设备,适用于物理、虚拟、云和容器环境。本文将详细介绍Ansible的基本概念、安装配置、命令运行以及Playbook的编写等内容。
一、基本信息
1.1 什么是Ansible
Ansible是一款开源自动化平台,是一个配置管理工具,自动化运维工具。
1.2 Ansible的优点:
- 跨平台支持
- 人类可读自动化:Ansible提供Linux,Windows,Unix和网络设备的无代理支持,适用于物理、虚拟、云和容器环境
- 完美描述应用:Playbook
- 轻松管理版本控制:Playbook是纯文本,可视作源代码
- 支持动态清单
- 编排可与其他系统轻松集成:Puppet、Jenkins
- 基础架构即代码
- 减少人为错误
任务、Play和Playbook设计为具有幂等性,所以在运行Playbook时,如果目标主机处于正确状态,则不会进行任何更改。
1.3 安装Ansible:
- 在Workstation上安装Ansible,充当控制节点
yum install -y ansible
- 查看Ansible版本信息
ansible --version
- 使用setup模块验证Python
ansible -m setup localhost | grep ansible_python_version
"ansible_python_version": "3.6.8",
1.4 配置文件:
① 默认配置文件:/etc/ansible/ansible.cfg
② 用户家目录中的配置文件:~/.ansible.cfg
③ 自定义配置文件:在工作目录中自行定义ansible.cfg
1.5 清单(定义了Ansible将要管理的一批主机):
① 默认清单:/etc/ansible/hosts
② 自定义清单:在工作目录中自行定义inventory
1.6 清单定义方式
静态清单
每行一个,填写主机名或IP,如:
r7node1.wang.com
192.168.0.30
还可以定义主机组:
[webservers]
server1.westos.org
server2.westos.org
172.25.0.1
[dbservers]
node1.westos.org
node1.westos.org
注意:一台主机可以存在于多个主机组定义嵌套组
Ansible主机清单可以包含多个主机组构成的组,如:
[webservers]
server1.westos.org
server2.westos.org
172.25.0.1
[dbservers]
node1.westos.org
node1.westos.org
[servers:children]
webservers
dbservers通过范围简化主机规格
可以指定主机名称或IP范围或者数字和字母范围
语法:[START:END]
172.25.[0:4].[0:254] #匹配172.25.0.0/24,172.25.1.0/24 ...
server[01:10].example.com #匹配server01.example.com到server20.example.com所有主机
[a:c].example.com #匹配a.example.com到c.example.com
示例1:列出清单中所有受管主机
ansible all --list-hosts
示例2:列出属于webservers组的主机
ansible webservers --list-hosts
示例3:列出不属于某个组的主机
ansible ungrouped --list-hosts
示例4:显示使用的配置文件:
ansible www -i inventory --list-hosts -v
1.7 管理配置文件中的设置
[defaults] 部分设置Ansible操作的默认值
[privilege_escalation] 配置Ansible如何在受管主机上执行特权升级
vim ansible.cfg
[defaults]
inventory = ./inventory
remote_user = student #指定登录受管主机的用户,如不指定则使用当前用户名称
ask_pass = false #是否提示输入ssh密码,做了免密就可以设置为false,否则需为true
[privilege_escalation]
become = true #连接到受管主机上是否进行身份切换
become_method = sudo #切换方式,默认为sudo
become_user = root #切换到的用户
become_ask_pass = false #是否需要为become_method提示输入密码,默认为false
当指定登录受管主机的用户为student时需要进行权力下放,否则有些操作会因为权限受限不能完成
使用sudo进行权限下放:
使用超级用户编辑文件:
vim /etc/sudoers.d/student
student ALL=(ALL) NOPASSWD: ALL
二、运行命令
2.1 运行临时命令
使用临时命令可以快速测试和更改,无需编写Playbook
- 格式:
ansible host-pattern -m module [-a 'module arguments'] [-i inventory]
2.2 检查能否在受管主机上运行Python模块:
ansible all -m ping
2.3 使用临时命令通过模块执行任务
ansible-doc -l #列出所有模块
2.4 查看模块的帮助文档
ansible-doc ping #查看ping模块帮助文档
2.5 Ansible模块
- 文件模块:
- copy:将本地文件复制到受管主机
- file:设置文件的权限和其他属性
- lineinfile:确保特定行是否在文件中
- synchronize:使用rsync同步内容
- 系统模块:
- firewalld:使用firewalld管理任意端口和服务
- reboot:重启
- service:管理服务
- user:添加、删除和管理用户账户
- Net Tools模块:
- get_url:通过http、https、或者ftp下载文件
- nmcli:管理网络
- uri:与web服务交互
示例:command模块
在受管主机上运行命令:
ansible web -m command -a 'hostname'
r7node1.wang.com | CHANGED | rc=0 >> #状态报告,显示主机名称和操作结果
r7node1.wang.com #命令输出
注意:command模块允许执行远程命令,但这些命令不是shell处理,所以无法访问shell环境变量,所以不能执行重定向、传送等操作
第一条命令的执行结果
第二条命令的执行结果
示例2:copy模块
ansible web -m copy -a 'content="wang ansible\n" dest=/etc/motd'
三、Playbook
编写基本的Ansible Playbook
YAML格式通常以yml为扩展名,YAML对于缩进量没有严格要求,但是有两个基本原则
- 处于同一层次结构中同一级别的数据元素必须具有相同的缩进量
- 如果项目属于其他项目的子项,其缩进量必须大于父项
示例:查看指定用户的临时命令
ansible -m user -a "name=student uid=1001 state=present" r8node3.wang.com
改写为Playbook
vim user.yml
--- #开头三个破折号,文档的开始标记
- name: Configure User #可选,但是建议使用
hosts: r8node3.wang.com
tasks:
- name: Student User
user:
name: student
uid: 1001
state: present
... #结尾三个省略号,结束标记(通常省略)
Play本身是一个键值对集合,同一Play中的键应当使用相同的缩进量
示例2:安装Apache
---
- name: Setup Webserver
hosts: r8node3.wang.com
tasks:
- name: Http Installed
yum:
name: httpd
state: latest
...
示例3:确保服务开机启动
---
- name: Setup Webserver
hosts: servera.lab.example.com
tasks:
- name: Apache is enabled
service:
name: httpd
enabled: true
- name: Postfix is enabled
service:
name: postfix
enabled: true
...
提高输出详细程度
Ansible-Playbook默认输出不提供详细任务执行信息。-v参数提供,共四个级别:
-v 显示任务结果
-vv 显示任务结果和任务配置
-vvv 包含关于与受管主机的连接信息
-vvvv 增加连接插件相关的额外详细程度选项(包括受管主机上用于执行脚本的用户及所执行的脚本)
执行Playbool前最好进行语法验证
ansible-playbook --syntax-check webserver.yml
示例4:安装、配置默认发布页并启动Apache
创建配置文件和清单
cat ansible.cfg
[defaults]
inventory = ./inventory
cat inventory
[web]
r8node3.wang.com
r7node1.wang.com
默认发布页面
cat files/index.html
hello world
---
- name: Install and Start Apache
host: web
tasks:
- name: Apache is present
yum:
name: httpd
state: present
- name: Change index.html
copy:
src: files/index.html
dest: /var/www/html/index.html
- name: Start Apache
service:
name: httpd
state: started
enabled: true
...
示例5:实施多个Play的模板
---
- name: first play
hosts: servera.example.com
tasks:
- name: first task
yum:
name: httpd
status: present
- name: second task
service:
name: httpd
enabled: true
- name: second play
hosts: serverb.example.com
tasks:
- name: first task
service:
name: mariadb
enabled: true
...
示例6:多个Play
配置文件设置:
cat ansible.cfg
[defaults]
inventory = ./inventory
清单设置:
cat inventory
[web]
r8node3.wang.com
vim intranet.yml
---
- name: Enable intranet services
hosts: web
become: yes
tasks:
- name: latest version of httpd and firewalld installd #检测httpd 是否安装和是
否最新版本
yum:
name:
- httpd
- firewalld
state: latest
- name: test html page is configured #检测是否配置默认发布页面
copy:
content: "Welcome to westos!\n"
dest: /var/www/html/index.html
- name: firewalld enabled and running #检测防火墙是否开启并处于enable 状态
service:
name: firewalld
enabled: true
state: started
- name: firewalld permits access to httpd service #检测防火墙是否允许httpd 服
务访问
firewalld:
service: http
permanent: true
state: enabled
immediate: yes
- name: httpd enabled and running #检测httpd 是否开启和设置开机启动
service:
name: httpd
enabled: true
state: started
- name: Test intranet web server #在本机测试
hosts: localhost
become: no
tasks:
- name: connect to intranet web server #测试访问servera
uri:
url: http://servera.lab.example.com
return_content: yes
status_code: 200
本文内容来源于网络,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。