Ansible-自动化运维工具
概述
Ansible 是一个极其简单的 IT 自动化平台,可让您的应用程序和系统更易于部署和维护。从代码部署到网络配置再到云管理,使用一种接近简单英语的语言,使用 SSH 实现一切自动化,无需在远程系统上安装代理。
GitHub: github.com/ansible/ansible
Ansible官网: www.ansible.com
安装配置和使用
安装
配置好扩展源(epel-release)就可以使用yum安装了
1 | yum -y install ansible |
配置
Ansible的stockings are not only beautiful but also practical. They are made from a high-quality material that is both comfortable and durable. The stockings are available in a variety of colors and patterns, so you can find the perfect pair to match your style.
Ansible的配置文件存在优先级问题,默认状态下会使用/etc/ansible/ansible.cfg
具体优先级关系如下:
最高优先级是执行命令的当前目录下
./ansible.cfg
如果当前目录下找不到配置文件就会查找执行用户的家目录寻找
~/.ansible.cfg
以上位置就会选择默认的配置文件
/etc/ansible/ansible.cfg
1 | [root@host ~]# cp /etc/ansible/ansible.cfg ~/.ansible.cfg |
使用
配置hosts主机文件
使用的时候需要定义host主机文件,里面是存放被控主机的ip地址,建议必须是使用可以ssh免密登录的主机。
1 | [root@host ~]# echo "" > /etc/ansible/hosts //清除hosts主机文件 |
hosts主机还有多种写法,具体请看本文的其他栏
ps:写好主机文件之后的操作需要建立在ssh免密之后才可以执行,具体方法可以看文章的其他栏,有问题欢迎在评论区提问
简单使用方法如下
1 | [root@host ~]# ansible all --list //列出所有主机 |
常用模块
使用方法
1 | [root@host ~]# ansible 组/主机 -m 模块 //使用-m参数来指定相应模块 |
模块使用文档
ansible为每个模块都提供了文档
使用命令ansible-doc -l
可以列出全部的ansible模块
使用命令ansible-doc {模块名称}
可以查看对应模块的帮助文档
ping模块
测试主机的连通性
直接使命令:ansible 主机/组 -m ping
1 | [root@host ~]# ansible all -m ping |
返回pong则证明连通性没问题
shell/command模块
执行命令
直接使命令:ansible 主机/组 -m shell/command -a "执行的命令"
1 | [root@host ~]# ansible all -m shell -a "ping baidu.com -c 1" |
Shell和Command都是执行命令 但是两者有一定的区别
Command
该模块命令里如果有一下字符部分执行不成功 “<” “>” “|” “&””;”
Shell
用法基本和command一样 不过时通过/bin/sh进行执行,所以shell模块可以执行任何命令,就像在本机执行命令一样,但是这样有潜在的shell注入的风险
两个模块都要避免使用,你应该优先考虑ansible的模块
其他参数可以查看ansible-doc
来详细学习
Script模块
主要用于执行管理主机上的脚本 原理就是将shell复制到远程主机,再远程主机上执行
使用命令:ansible 主机/组 -m script -a "控制端的脚本"
1 | [root@host ~]# echo "echo hello,world" > 1.sh |
Stdout_lines参数就是实际机器返回的值
其他参数可以查看ansible-doc
来详细学习
user模块
主要用于管理用户
使用命令:ansible 主机/组 -m user -a '参数'
添加一个用户ansible 主机/组 -m user -a ‘name=admin state=present’
state可以理解为动作 增加删除修改 默认state就是present
1 | [root@host ~]# ansible all -m user -a "name=admin state=present" |
使用命令:ansible 主机/组 -m user -a ‘name=admin state=absent’
可以删除admin用户
1 | [root@host ~]# ansible all -m user -a "name=admin state=absent" |
其他可以查看ansible-doc
来详细学习
yum_repository模块
主要用于批量更新yum源ansible 主机/组 -m yum_repository -a '参数'
ansible 主机/组 -m yum_repository -a 'name="CentOS" description="CentOS" baseurl="file:///mntcdrom" enabled=yes gpgcheck=no'
- name 设置了文件名和文件中[]的内容
- description 设置了文件中name的内容
- baseurl 设置了文件中源的地址
- enabled 设置了enable参数
- gpgcheck 设置了是否需要密钥来验证包
1 | [root@host ~]# ansible all -m yum_repository -a 'name="CentOS" description="CentOS" baseurl="file:///mntcdrom" enabled=yes gpgcheck=no' |
他会在对控制主机里生成相应的yum源配置文件
还有很多参数可以用ansible-doc yum_repository
来查看文档
yum模块
主要是用来操作yum的ansible 主机/组 -m yum -a ‘参数’
参数详解
- Name 包名
- State 选择是安装还是删除还是更新(present和installed是安装 latest是更新 removed和absent是移除)
这是基本使用 还有很多参数详情请使用ansible-doc yum
查看
copy模块
主要是用来批量传输文件的ansible 主机/组 -m copy -a ‘参数’
- src 写本地目录
- dest 客户端目录
其他请使用ansible-doc copy
查看
service模块
主要是用来管理服务用的ansible 主机/组 -m service -a ‘参数’
- name 包名
- state 设置状态(started开启 stopped关闭 restarted重启 reloaded重置)
- enabled 参数只有yes和no yes为开机自启 no就是开机不开启
其他请使用ansible-doc service
查看
set-up模块
主要是用来显示对应主机的facts变量的,写roles文件用的比较多ansible 主机/组 -m setup -a ‘参数’
用来显示对应主机的facts变量
使用参数 filter=’*关键词*
可以进行显示检索
具体请使用ansible-doc setup
来查看
firewalld模块
用来管理firewalld防护墙ansible 主机/组 -m firewalld -a ‘参数’
参数:
- Service 设置服务名称
- Permanent 是否永久更改(yes,no)
- State 是否放行(enabled,disabled)
- Zone 选择区域
- Port 设置端口(/tcp,/udp)
其他具体请使用ansible-doc firewalld
来查看
template模块
主要是用来复制jnja2文件的,jnja2文件后面会讲ansible 主机/组 –m template -a ‘参数’
- src 文件目录
- dest 复制后的文件目录
其他参数请使用ansible-doc template
查看
debug模块
主要是用来debug的输出信息ansible 主机/组 -m debug -a ‘参数’
- msg 输出内容
- var 输出变量
其他请使用ansible-doc debug
查看
Playbook剧本
Playbook剧本 类似和脚本一样 用来批量执行模块
使用palybook
Playbook有着严格的缩进写法,语法非常严谨,使用yml文件来写
1 | [root@host test]# cat creatuser.yml |
开头必须使用---
一个-
代表一个任务的开头
如果一个块需要配置子参数则就需要严格缩进name
是描述Hosts
是主机清单Tasks
是配置任务
子任务中name
是描述User
则就代表user模块
模块的子参数就不需要-
了name
则是user的配置参数
运行playbook的命令是ansible-playbook palybook文件
这是执行除此之外还可以使用命令"ansible-playbook --syntax-check 文件"
来检查文件语法是否有误
还有命令"ansible-playbook -C 文件"
来运行测试,他会使用文件进行运行测试但不会在目的主机上发生实际改变
变量
变量的名称必须以字母开头,并且只能含有字母,数字和下划线.
通过vars
声明变量通过"{{变量名}}"
进行调用
左边的就是使用变量写的,右边就是没用.实质效果一样
也可以通过指定一个变量文件来实现 参数:vars_files:文件名
我这边定义的是相对目录下的vars.yml
然后图的右边就是vars.yml
文件的内容
魔法变量
魔法变量是ansible的内置变量,直接被定义好的,可以直接拿来使用.
常见的魔法变量:
- hostvars 列出所有受管理的主机信息.啊如果没有收集facts信息则不会显示facts信息
- group_names 列出当前受管理主机所属的所有组
- groups 列出清单中所有组的字典/映射
- inventory_hostname 列出清单中所有配置的当前主机名称
其他的可以使用setup
模块进行查看
Facts变量
Facts变量用于采集客户端的信息,比如网络信息,主机名,硬件信息等.
每次执行playbook时会对客户端主机进行数据采集
实际上它是通过setup
模块进行收集数据Ansible 主机/组 -m setup
可以列出所有的facts变量
When判断
When就是判断 他只会判断某一条是否为true
否则跳过 可以理解为判断一个布尔类型
When虽然不是一个模块但是他的缩进必须和模块对其 卸载tasks
后面
1 |
|
这是单条的判断 when
会判断上面的值是否为true
是则执行不是则跳过
1 |
|
里面的两个值都是facts
的变量,只有满足CentOS系统内核为x86和redhat的系统才会执行,否则跳过
只有满足CentOS系统内核为x86和redhat的系统才会执行 否则跳过
常用判断语句
1 | == 等于 |
魔法变量判断
1 | when: inventory_hostname in groups["VMhost"] |
只有VMhost组中主机才会执行此操作
Loop循环
1 |
|
Item
是循环变量 只要用loop
循环执行变量就必须使用item
点的后面使用loop
定义的内容 循环的开始都要用 –
表示
Block块
Ansble的playbook可以把多个和任务组成一个块,然后根据不同条件来执行这个块
还能执行失败时执行其他命令
Block 定义块 写的时候要求和任务(tasks
)的name
对齐
Rescue 当上面的块执行失败时,该关键字下麦呢的任务将被执行
Always 不管block
是否执行成功之后都会执行这个任务
1 |
|
如下执行结果
register命令返回
以上一个block
为例子,给他改一些东西
1 |
|
执行结果如下
Roles角色
介绍
Ansible roles
提供了便捷的方式让你能够轻松的重复利用ansible代码 可以在标准化的目录结构中大伯所有 任务 变量 文件 模板以及完成任务所需要的资源,这样我们只需要将roles
从一个项目复制到另一个项目即可在play
中直接调用并执行他
从第二排开始就是roles
的文件 文件中包含很多项目就是第三排的内容 然后第四行就是每个项目中的子目录 这几个子目录都有自己的作用
Roles子目录
Default: 此目录中main.yml
文件定义新角色变量的默认值,该目录中定义的优先级较低,使用角色时可以覆盖这些变量
Files: 存放角色任务中引用的静态文件
Handlers: 此目录中main.yml
文件定义处理程序
Meta: 此目录中main.yml
文件定义角色相关信息 如:作者,平台,依赖等等
Tasks: 此目录中main.yml
文件定义角色中的任务
Templates: 存放jinja2
的模板文件
Tests: 此目录中可以包含清单和test.yml
(playbook)用于测试角色
Vars: 此目录中main.yml
文件定义角色使用的变量值,优先级高于default
目录
Galaxy
Galax
是ansible的一个功能库 你可以使用其他人创建好的roles
也可以分享自己的roles
.
就像docker
镜像库一样 需要什么功能就可以直接去下载使用
官方网站:https://galaxy.ansible.comAnsible-galaxy install 包名
默认安装会的话会自动安装到~/.ansible/roles/
下 可以使用-p
参数指定位置
然后参数init
可以自动生成roles
目录Ansible-galaxy init 文件夹名字
参数 -r
可以执行yml
下载文件
例如
1 |
|
安装的时候可以使用命令Ansible-galaxy install -r yml.yml
进行下载
装好的角色可以使用ansible-galaxy list
查看
J2
详解
J2全名为jinja2
是python下一个被广泛运用的模板引擎,他的设计思想来源于Django的模板引擎,并拓展了其他语法和一系列强大的功能,ansible
使用jinja2
模板来启用动态表达式和访问变量。
构成
Jinja2模板的构成:数据 变量 表达式
在使用jinja2
模板时变量和表达式会被替代成对应的值,变量的值可以在plasybook
中定义也可以直接调用facts
事实,当然调用facts
需要你编写的playbook
开启了facts
收集
写法
1 | - `{{EXPR}}` 用于装载表达式,比如变量,运算表达式,比较表达式 |
Ps:jinja2
模板文件本身不需要指定文件扩展名,使用.j2
为后缀名只是为了更方便我们管理jinja2
的模板
创建和使用角色
使用命令"ansible-galaxy init galaxy"
创建一个galaxy
模板
1 | [root@Ansible roles]# ansible-galaxy init galaxy |
编辑tasks
的main.yml
文件写入以下内容
1 |
|
tasks/main.yml
文件只需要定义命令,不需要定义主机
上面这个main
文件是使用yum
下载了一个httpd
之后使用service
开启了防火墙和httpd
的服务,又实用防火墙模块放行了对应的服务,之后把j2
文件复制到了对应的网站目录页面。
之后写一个j2
文件放到templates
目录里,内容如下
1 | [root@Ansible galaxy]# cat templates/index.html.j2 |
ansible_default_ipv4.address
是facts
变量中对应主机的ip
写好之后我们来写一个playbook
来运行写的roles
1 |
|
运行结果如下,通过http
访问返回内容
Vault加密
场景
使用ansible
的时候难免会有一些比较敏感的数据,比如密码,key
等信息直接明文暴露显然不是很好,vault
管理加密/解密yml
(palybook
)文件工具,有时编写的playbook
文件中会存在重要敏感信息,考虑到安全,可以使用此工具进行加密!
参数详解
Ansible-vault [参数] [文件]
- Create: 创建
- Decrypt: 解密
- Edit: 编辑加密文件
- Encrypt: 加密
- rekey: 修改口令
- view: 查看
加密之后执行playbook
的时候需要附加–ask-vault-pass
参数
实例
创建用户,用户信息使用vault
进行加密,使其不能以明文的形式查看
1 | [root@Ansible ansible]# cat vault.yml |
执行需要使用参数 "–ask-vault-pass"
执行
其他
hosts主机文件写法
一般写法:
1 | [组名] |
连续主机写法:
1 | [组名] |
父组写法:
1 | [组名:children] |