Chapter Ⅰ 介绍Ansible
ansible
ansible是一款开源自动化平台
ansible围绕一种无代理架构构建,在控制节点上安装ansible,且客户端不需要任何特殊的代理软件;ansible使用SSH等标准协议连接受管主机,并在受管主机上运行代码或命令来确保他们处于ansible指定的状态
Ansible帮助:
1、官方网站:https://docs.ansible.com/ansible/2.8/modules/modules_by_category.html
2、ansible-doc 模块名称
Chapter Ⅱ 部署Ansible
类别 | 文件 | 说明 |
---|---|---|
配置文件 | ansible.cfg | 通过哪个账号、登录方式(用户名密码/密钥)、提权 |
管理清单 | inventory | 管理设备的清单列表(支持分组) |
运行脚本 | playbook | ansible的语法、具体执行任务脚本 |
1、配置文件
三种配置文件
配置文件 | 所在路径 | 优先级 |
---|---|---|
ansible.cfg | 当前目录 | 高 |
~/.ansible.cfg | 家目录 | 次高 |
/etc/ansible/ansible.cfg | 全局配置目录 | 低 |
# some basic default values...
[defaults]
# 指定清单文件
inventory = /home/student/ansible/inventory
# 登录是否需要输入密码,因为已经在sshd中设置密钥登录,所以此处可以设置为False
ask_pass = False
# 指定登录到被管主机的账号
remote_user = devops[privilege_escalation]
# 是否可以切换高权限账号
become=True
# 切换的方式采用sudo
become_method=sudo
# 切换到什么账号
become_user=root
# 切换时是否需要密码
become_ask_pass=False
注:提权sudo等相关配置在/etc/sudoers中配置
2、管理清单
清单定义Ansible将要管理的一批主机。这些主机也可以分配到组中,以进行集中管理。组可以包含子组,主机也可以是多个组的成员。清单还可以设置应用到它所定义的主机和组的变量。
验证inventory
ansible 主机名或组名 --list-hosts
,或者直接用all也可以
3、运行临时命令
Ansible有两种方式运行:临时运行(单词命令行)和脚本运行(playbook)
ansible host-pattern -m moudule [-a 'module arguments'] [-i inventory]
Ansible模块
模块类别 | 模块 |
---|---|
文件模块 | ▪ copy:将本地文件复制到受管主机 ▪ file:设置文件的权限和其他属性,如创建、删除等 ▪ lineinfile:确保特定行是否在文件中 ▪ synchronize:使用rsync同步内容 |
软件包模块 | ▪ package:使用操作系统本机的自动监测软件包管理器管理软件包 ▪ yum:使用YUM软件包管理器管理软件包 ▪ apt:使用APT软件包管理器管理软件包 ▪ dnf:使用DNF软件包管理器管理软件包▪ gem:管理Ruby gem ▪ pip:从PyPI管理Python软件包 |
系统模块 | ▪ firewalld:使用firewalld管理任意端口和服务 ▪ reboot:重启计算机 ▪ service:管理服务 ▪ user:添加、删除和管理用户账户 |
Net Tools模块 | ▪ get_url:通过HTTP、HTTPS或FTP下载文件 ▪ nmcli:管理网络 ▪ uri:与web服务交互 |
在受管主机上运行任意命令
command模块允许管理员在受管主机的命令行中运行任意命令,要运行的命令通过-a选项指定为该模块的参数
Chapter Ⅲ 实施PLAYBOOK
1、规范
Playbook是以YAML格式编写的文本文件,通常使用扩展名yml或yaml保存。Playbook使用空格字符缩进来表示其数据结构。
- 处于层次结构中同一级别的数据元素必须具有相同的缩进量
- 如果项目属于其他项目的子项,其缩进量必须大于父项
YAML语法规则:
- 大小写敏感
- 使用缩进量表示层级关系
- 缩进时不允许使用tab键,只可以使用空格
- 缩进时空格数量不重要,只要相同元素左侧对齐,表示这些元素属于同一个层级
- #表示当行注释
- 字符串可以不用引号标注(但建议加上引号,便于理解和阅读)
Playbook开头的一行由三个破折号(—)组成,标记文档开始;末尾可能使用三个圆点(…),实际中通常会省略;首末标记位之间,会以play列表的形式定义playbook,YAML列表中的项目以一个破折号加空格开头。
---
- name: "install and start http"hosts: intranetwebvars:tasks:- name: "install http"yum:name: httpdstate: present- name: "start http"service:name: httpdstate: startedenabled: true
2、语法检查
ansible-playbook --syntax-check test.yaml
3、显示详细信息verbose
ansible-playbook -vvv test.yaml
选项 | 描述 |
---|---|
-v | 显示任务结果 |
-vv | 任务结果和任务配置都会显示 |
-vvv | 包含关于与受管主机连接的信息 |
-vvvv | 增加了连接插件相关的额外详细程度选项,包括受管主机上用于执行脚本的用户,以及所执行的脚本 |
4、模拟仿真(空运行)
ansible-playbook -C test.yaml
返回结果,但不会真的到受管主机上执行
Ansible模块维护
用ansible-doc查询模块时,需要注意维护属性,有些非商用的模块有可能后期会下线,尽量使用stableinterface和core的模块
1、status(开发状态)
- stableinterface:模块的关键字稳定,将尽力确保不删除关键字或更改其含义
- preview:模块处于技术预览阶段,可能不稳定,其关键字可能会更改,或者可能需要本身受到不兼容更改的库或web服务
- deprecated:模块已被弃用,未来某一发行版中将不再提供
- removed:模块已从发行版中移除,但因文档需要存根,以帮助之前的用户迁移到新的模块
2、supported_by(维护人)
- core:由上游“核心”Ansible开发人员维护,始终随Ansible提供
- curated:模块由社区中的合作伙伴或公司提交并维护
community:模块不受到核心上游开发人员、合作伙伴或公司的支持,完全由一般开源社区维护
Chapter Ⅳ 管理变量和事实
https://docs.ansible.com/ansible/2.8/user_guide/playbooks_variables.html
命名变量:变量的名称必须以字母开头,并且只能含有字母、数字和下划线
1、全局范围变量:从命令行或Ansible配置设置的变量
2、Play范围变量:在play和相关结构中设置的变量
3、主机范围变量:由清单、事实收集或注册的任务,在主机组和个别主机上设置的变量
优先级:1<2<3,不同级别定义相同变量,采用优先级最高的变量,即低优先级会被高优先级覆盖
注:清单中的变量优先级小于playbook中的变量,一般在其中定义与playbook相同的变量,作用是防止playbook未定义变量导致执行错误
变量的使用
- 双花括号
- 以变量开始的时候,必须加"“,即”{{ var }}"(建议都加)
- 在when语句中调用变量不能加{{}}
变量数组
如下代码可以转换为名为users的数组
user1_first_name: Bob
user1_last_name: Jones
user1_home_dir: /users/bjones
user2_first_name: Anne
user2_last_name: Cook
user2_home_dir: /users/acook
users:bjones:first_name: Boblast_name: Joneshome_dir: /users/bjonesacook:first_name: Annelast_name: Cookhome_dir: /users/acook
可以用如下两种形式访问数据:
# Returns 'Bob'
users.bjones.first_name# Returns '/users/acook'
users.acook.home_dir# Returns 'Bob'
users['bjones']['first_name']# Returns '/users/acook'
users['accok']['home_dir']
模块debug
在调试的时候使用,相当于打印
var:取变量值打印
使用目录填充主机和组变量
根据被管主机或组进行分别定义的变量
目录group_hosts、hosts_group的名字必须这么写,不能改
文件名必须和Inventory中定义的主机相同
实验:servera归属groupA,serverB归属groupB,其中groupA安装ntpd、groupB安装httpd、servera添加用户devops、serverb添加用户student
---
- name:hosts: groupA, groupBvars:ignore_errors: yestasks:- name: "group: install software"yum:name: "{{ package }}"state: present- name: "hosts: add user"user:name: "{{ user_name }}"
注册变量register
register变量,可以临时保存本模块执行后的结果,一般用在判断关系中,决定后续语句如何执行
示例:在servera上安装httpd,通过结果判断是否已经预先安装,第一个显示全部结果信息,第二个只显示msg字段信息
---
- name: "test httpd is installed"hosts: servera.lab.example.comvars:tasks:- name: "install httpd"yum:name: httpdstate: presentregister: result_install- name: "display result"debug:var: result_install- name: "display simple result"debug:var: result_install['msg']
facts变量
Ansible执行YAML前,会去被管主机上采集信息,并通过json格式存储在内存中。(Gathering Facts)
目的:做环境状态的判断
可以收集IP地址、硬件信息(CPU、内存