一、基本信息

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

2.查看ansible版本信息

ansible --version

3.使用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

ansible管理Windows主句文档 ansible批量管理windows主机_vim

ansible管理Windows主句文档 ansible批量管理windows主机_html_02

示例4:显示使用的配置文件:

ansible www -i inventory --list-hosts -v

ansible管理Windows主句文档 ansible批量管理windows主机_html_03

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

ansible管理Windows主句文档 ansible批量管理windows主机_配置文件_04

2.3 使用临时命令通过模块执行任务
ansible-doc -l	#列出所有模块

ansible管理Windows主句文档 ansible批量管理windows主机_vim_05

2.4 查看模块的帮助文档
ansible-doc ping	#查看ping模块帮助文档

ansible管理Windows主句文档 ansible批量管理windows主机_vim_06

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环境变量,所以不能执行重定向、传送等操作

ansible管理Windows主句文档 ansible批量管理windows主机_html_07

第一条命令的执行结果

ansible管理Windows主句文档 ansible批量管理windows主机_vim_08

第二条命令的执行结果

ansible管理Windows主句文档 ansible批量管理windows主机_vim_09

示例2:copy模块

ansible web -m copy -a 'content="wang ansible\n" dest=/etc/motd'

ansible管理Windows主句文档 ansible批量管理windows主机_html_10

ansible管理Windows主句文档 ansible批量管理windows主机_vim_11

三、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