问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Ansible管理Windows主机文档:批量管理Windows主机的完整指南

创作时间:
作者:
@小白创作中心

Ansible管理Windows主机文档:批量管理Windows主机的完整指南

引用
51CTO
1.
https://blog.51cto.com/u_16099188/10393900

Ansible是一款开源自动化平台,主要用于配置管理和自动化运维。它支持跨平台操作,能够无代理地管理Linux、Windows、Unix和网络设备,适用于物理、虚拟、云和容器环境。本文将详细介绍Ansible的基本概念、安装配置、命令运行以及Playbook的编写等内容。

一、基本信息

1.1 什么是Ansible

Ansible是一款开源自动化平台,是一个配置管理工具,自动化运维工具。

1.2 Ansible的优点:

  1. 跨平台支持
  2. 人类可读自动化:Ansible提供Linux,Windows,Unix和网络设备的无代理支持,适用于物理、虚拟、云和容器环境
  3. 完美描述应用:Playbook
  4. 轻松管理版本控制:Playbook是纯文本,可视作源代码
  5. 支持动态清单
  6. 编排可与其他系统轻松集成:Puppet、Jenkins
  7. 基础架构即代码
  8. 减少人为错误
    任务、Play和Playbook设计为具有幂等性,所以在运行Playbook时,如果目标主机处于正确状态,则不会进行任何更改。

1.3 安装Ansible:

  1. 在Workstation上安装Ansible,充当控制节点
yum install -y ansible
  1. 查看Ansible版本信息
ansible --version
  1. 使用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 清单定义方式

  1. 静态清单
    每行一个,填写主机名或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
    注意:一台主机可以存在于多个主机组

  2. 定义嵌套组
    Ansible主机清单可以包含多个主机组构成的组,如:
    [webservers]
    server1.westos.org
    server2.westos.org
    172.25.0.1
    [dbservers]
    node1.westos.org
    node1.westos.org
    [servers:children]
    webservers
    dbservers

  3. 通过范围简化主机规格
    可以指定主机名称或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

  1. 格式:
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对于缩进量没有严格要求,但是有两个基本原则

  1. 处于同一层次结构中同一级别的数据元素必须具有相同的缩进量
  2. 如果项目属于其他项目的子项,其缩进量必须大于父项

示例:查看指定用户的临时命令

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

本文内容来源于网络,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号