目录
一、ansible介绍与搭建环境
1、Ansible简介
1.什么是Ansible
2.Ansible产品特色
2、基于VmVare搭建测试环境(Linux_CentOS7.5)
1.主机列表(虚拟机创建及配置自行解决,不在赘述;镜像源为阿里云)
2.配置控制节点(Control)
3.被控制节点(节点需要修改主机名,IP地址)
二、Ansible ad-hoc
1、基本命令
1. 命令行语法格式
2. 基础使用介绍
2、Ansible常用模块
1. shell模块
2. script模块
3. file模块
4. copy模块
5. fetch 模块
6.lineinfile模块
7.replace模块
8. user模块
9. yum_repository模块
10. yum模块
11. service模块
13. lvol模块
三、Ansible Playbook(剧本)
1、基本概念
1. Playbook概述
3. YAML格式
2、Playbook
1. Playbook语法格式
2. playbook应用案例
四、Ansible变量
1、特殊的模块
1. setup模块
2. debug模块
2、变量
1、Inventory变量(在主机清单配置文件中定义变量)
2. Host Facts变量(可以直接调用ansible收集的系统信息)
3. Play变量(使用vars关键词可以在Playbook内定义变量)
4. 单独定义变量文件,在playbook中调用该文件
五、Ansible 进阶篇
1、模块应用
1. firewalld模块
2. template模块
2、Ansible高级语法
1. error处理机制
2. handlers
3. when条件判断
4. block任务块
5. loop循环
六、Ansible Roles(角色)
1、基本概念
1.Roles定义
2. Roles规范的目录结构
2、Roles应用
1. 创建Role
2. 修改Role
3. 在Playbook中调用Role
4. ansible-galaxy
七、Ansible Vault
1、加密敏感数据
1. 加密文件
2. 解密文件
3. 修改密码
4. 密码文件
Ansible首次发布于2012年,作者Michael DeHaan
- Michael DeHaan也是Cobbler的作者 - 于2015年被RedHat收购 Ansible是一款自动化运维工具,基于Python开发 - 批量系统配置 - 批量程序部署 - 批量运行命令等功能 批量修改服务器密码 批量安装软件包 批量修改配置 ansible通过ssh远程被管理主机,将控制端的模块(脚本)或命令传输到被管理主机;
在被管理端主机执行模块(脚本)或命令,执行不同的模块或命令可以实现不同的功能;
最后ansible退出ssh远程
主机名 | IP地址 | 角色 |
---|---|---|
Control | 192.168.5.253 | 控制节点(managger) |
Node1 | 192.168.5.11 | 被控制节点(test) |
Node2 | 192.168.5.12 | 被控制节点(proxy) |
Node3 | 192.168.5.13 | 被控制节点(web1) |
Node4 | 192.168.5.14 | 被控制节点(web2) |
Node5 | 192.168.5.15 | 被控制节点(database) |
[root@control ~]# vim /etc/hosts #修改域名解析文件,追加如下内容
192.168.5.253 control
192.168.5.11 node1
192.168.5.12 node2
192.168.5.13 node3
192.168.5.14 node4
192.168.5.15 node5
[root@control ~]# for i in node{1..5} #验证连通测试
> do
> ping -c3 -i0.1 -W1 $i
> done
[root@control ~]# ssh-keygen -f /root/.ssh/id_rsa -N '' #生成秘钥
[root@control ~]# for i in node{1..5} #将公钥传递给node1-node5
> do
> ssh-copy-id $i
> done
[root@control ~]# yum -y install epel-release #加载源
[root@control ~]# yum -y install ansible #安装ansible
Ansible文件查找顺序: ① 首先检测ANSIBLE_CONFIG变量定义的配置文件 ② 其次检查当前目录下的 ./ansible.cfg文件 ③ 再次检查当前用户家目录下~/ansible.cfg文件 ④ 最后检查 /etc/ansible/ansible.cfg 文件
修改主配置文件(参考 /etc/ansible/ansible.cfg文件)
[root@control ~]# mkdir ~/ansible [root@control ~]# cd ansible/ [root@control ansible]# vim ansible.cfg #修改配置文件 [defaults] inventory = ~/ansible/hosts #主机清单配置文件(文件名任意) forks = 5 #ssh并发数量 host_key_checking = False #是否校验密码
修改主机清单文件(参考 /etc/ansible/hosts )
[root@control ansible]# vim hosts [test] #定义主机组(组名称任意) node1 #定义组中的具体主机 [proxy] node2 [webserver] node[3:4] #等同于node3和node4 [database] ndoe5 [cluster:children] #嵌套组(children为关键字),嵌套组可以在组中包含其他组 webserver database
① Ansible 默认通过SSH协议管理机器 |
---|
② 被管理主机要开启SSH服务,并允许控制主机登录 |
③ 被管理主机需要安装Python |
Ansible ad-hoc是通过命令行批量管理的方式
- 格式: ansible 主机集合 -m 模块名 -a "参数"
- 其它参数: -k 使用密码远程
[root@control ansible]# ansible all --list-hosts #查看所有主机列表 hosts (5): node2 node1 node3 node4 node5 [root@control ansible]# ansible node1 -m ping #调用ping模块 node1 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } #该模块虽然叫ping,但是它不会发送任何ICMP协议的ping数据包,控制端主机仅仅 #是ssh远程被管理端主机,检查其是否有python环境,能顺利远程并且有Python环 #境就会返回正确的提示信息,否则报错。
模块就是脚本(多数为Python脚本)
- 多数脚本都支持参数
- 默认模块为command
[root@control ansible]# ansible test -m command -a "uname -r" #查看内核版本 node1 | CHANGED | rc=0 >> 3.10.0-862.el7.x86_64 [root@control ansible]# ansible test -a "date" #查看时间;默认为command模块 node1 | CHANGED | rc=0 >> Sun Jun 19 02:01:05 CST 2022
获取帮助
[root@control ~]# ansible-doc -l #列出所有模块,q键退出 [root@control ~]# ansible-doc -l | grep "^file" #过滤开头为file的模块 [root@control ansible]# ansible-doc file #查看模块帮助文档,可以快速定位EXAMPLE查看帮助
command和shell模块的区别:
- command不支持bash的特性,如管道和重定向功能
- 所有需要调用shell的功能都无法使用
[root@control ansible]# ansible test -m command -a "ps | wc -l" #执行会报错
shell模块会启动shell执行命令:
- 不可以使用shell模块执行交互命令(如vim、top等)
[root@control ansible]# ansible test -m shell -a "ps | wc -l" #查询进程数量 node1 | CHANGED | rc=0 >> 6
script针对复杂的命令:
- script允许在本地写脚本,拷贝到被管理端并执行脚本
- 可以不是shell脚本(如python、perl脚本等),可以没有x权限
[root@control ansible]# vim test.sh #编写测试脚本 #!/bin/bash yum -y install httpd systemctl start httpd [root@control ansible]# ansible test -m script -a "./test.sh"
file模块可以创建文件、目录、链接;修改权限与属性等
- 幂等性:任意次执行所产生的影响均与一次执行的影响相同
[root@control ansible]# ansible test -m file -a "path=/tmp/file.txt state=touch" #创建文件 [root@control ansible]# ansible test -m file -a "path=/tmp/mydir state=directory" #创建目录 [root@control ansible]# ansible test -m file -a "path=/tmp/file.txt owner=sshd group=sshd mode=0777" #修改文件或目录权限 [root@control ansible]# ansible test -m file -a "path=/tmp/file.txt state=absent" #删除文件 [root@control ansible]# ansible test -m file -a "path=/tmp/mydir state=absent" #删除目录 [root@control ansible]# ansible test -m file -a "src=/etc/hosts path=/tmp/hosts.txt state=link" #创建软链接文件
将文件拷贝到远程主机(针对静态,不可引入变量)
[root@control ~]# echo AAA > /tmp/test.txt #新建测试文件 [root@control ansible]# ansible test -m copy -a "src=/tmp/test.txt dest=/root/" #拷贝至test主机
与copy模块类似,但是方向相反
- 可以将其它主机的文件拷贝到本地
[root@control ansible]# ansible test -m fetch -a "src=/etc/hostname dest=~/" #将远程主机的hostname文件下载到本地家目录
修改单个文件的单行内容
[root@control ansible]# ansible test -m lineinfile -a "path=/etc/issue line='Hello World'" #在被控端文件中添加一行内容,默认添加到最后;基于幂等性原则,再执行也不会创建多行内容
lineinfile会替换一整行,replace可以替换关键词
[root@control ansible]# ansible test -m replace -a "path=/etc/issue regexp='Hello World' replace='hello world'" #将Hello World替换为hello world
user模块可实现Linux系统账户管理
[root@control ansible]# ansible test -m user -a "name=test1" #远程test组中的所有主机并创建系统账户test1 [root@control ansible]# ansible test -m user -a "name=test2 uid=1008 group=adm groups=daemon,root home=/home/test2" #创建用户并设置对应的账户属性 [root@control ansible]# ansible test -m user -a "name=test1 password={{'abc123'|password_hash('sha512')}}" #修改用户密码 [root@control ansible]# ansible test -m user -a "name=test1 groups=root,daemon" #修改test1账户的附加组 [root@control ansible]# ansible test -m user -a "name=test1 state=absent" #删除账户 [root@control ansible]# ansible test -m user -a "name=test2 state=absent remove=true" #删除账户并同时删除家目录、邮箱
创建或修改yum源配置文件
[root@control ansible]# ansible test -m yum_repository -a "name=myyum description=hello baseurl=ftp://192.168.5.254/centos gpgcheck=no" #创建一个名为:myyum的文件 [root@node1 ~]# cat /etc/yum.repos.d/myyum.repo #node1设备查看配置文件 [myyum] baseurl = ftp://192.168.5.254/centos gpgcheck = 0 name = hello [root@control ansible]# ansible test -m yum_repository -a "name=myyum description=test baseurl=ftp://192.168.5.254/centos gpgcheck=no" #修改yum源文件内容 描述改为test [root@control ansible]# ansible test -m yum_repository -a "name=myyum state=absent" #删除yum源文件
实现安装、卸载、升级软件包功能(present安装|absent卸载|latest升级)
[root@control ansible]# ansible test -m yum -a "name=unzip state=present" #安装unzip [root@control ansible]# ansible test -m yum -a "name=unzip state=latest" #升级 [root@control ansible]# ansible test -m yum -a "name=unzip state=absent" #卸载软件包
服务管理模块(启动started、关闭stopped、重启服务restatrted、开机自启enabled等)
[root@control ansible]# ansible test -m yum -a "name=httpd" [root@control ansible]# ansible test -m service -a "name=httpd state=started" #启动 [root@control ansible]# ansible test -m service -a "name=httpd state=stopped" #关闭 [root@control ansible]# ansible test -m service -a "name=httpd state=restarted" #重启 [root@control ansible]# ansible test -m service -a "name=httpd enabled=yes" #开机自启
12. lvg模块
逻辑卷相关模块:创建、删除卷组(VG),修改卷组大小
- state: present(创建) | absent(删除)
node1节点添加一块硬盘并分区 [root@node1 ~]# parted /dev/sdb #分区 (parted) mktable gpt #建立分区表 (parted) mkpart Partition name? []? 1 File system type? [ext2]? ext4 Start? 0 End? 1000M (parted) mkpart Partition name? []? 2 File system type? [ext2]? ext4 Start? 1000M End? 2000M [root@node1 ~]# partprobe /dev/sdb #刷新分区表 [root@control ansible]# ansible test -m yum -a "name=lvm2" #安装lvg模块 [root@control ansible]# ansible test -m lvg -a "vg=myvg pvs=/dev/sdb1" #创建名称为myvg的卷组,卷组由sdb1组成 [root@control ansible]# ansible test -m lvg -a "vg=myvg pvs=/dev/sdb1,/dev/sdb2" #修改卷组大小,卷组由sdb1和sdb2组成 [root@control ansible]# ansible test -m lvg -a "vg=myvg state=absent" #删除卷组
逻辑卷相关模块:创建、删除逻辑卷(LV),修改逻辑卷大小
- state: present(创建) | absent(删除)
[root@control ansible]# ansible test -m lvol -a "lv=mylv vg=myvg size=800M" #使用myvg卷组创建一个名为mylv的逻辑卷 [root@control ansible]# ansible test -m lvol -a "lv=mylv vg=myvg size=1000M" #修改LV逻辑大小到1000M [root@control ansible]# ansible test -m lvol -a "lv=mylv vg=myvg state=absent force=yes" #删除逻辑卷
Ansible playbook 中文名称脚剧本 |
---|
- 将经常需要执行的任务写入一个文件(剧本) |
- 剧本中可以包含多个任务 |
- 剧本写后,可随时根据剧本,执行相关的任务命令 |
- playbook 剧本需要按照YAML格式编写 |
- 适合执行周期性经常执行的复杂任务 |
2. YAML简介
是一个可读性高、用来表达数据序列的格式语言 |
---|
YAML:YAML Ain ' t a Markup Language |
YAML以数据为中心,重点描述数据的关系和结构 |
“#” 代表注释,一般第一行为三个横杠(---) 键值(key / value)对使用“:”表示,数组使用“-” 表示, "-"后边有空格 一般缩进由两个或以上空格组成(常用2个) 相同层级的缩进必须对齐 全文不可以使用Tab键 区分大小写、扩展名为yml或yaml 跨行数据需要使用 > 或者 | (| 会保留换行符) YAML格式的键值对数据 - key和value之间使用 “:” 分隔 - “:” 后面必须有空格 - 缩进代表层级关系 YAML格式的数组数据 - 使用短横杠和空格表示,一行表示数据格式[ 值,值,值. . . ]
playbook采用YAML格式编写 |
---|
playbook文件中由一个或多个play组成 |
每个play中可以包含: |
- hosts(主机)、tasks(任务)、vars(变量)等元素组成 |
使用ansible-playbook命令运行playbook剧本 |
[root@control ansible]# vim test.yml #编写剧本 --- - hosts: all tasks: - name: "第一个剧本" ping: [root@control ansible]# ansible-playbook test.yml #运行剧本
hosts由一个或多个组或主机组成,逗号分隔
tasks由一个或多个任务组成,多个任务按顺序执行
可以使用-f选项自定义并发量
[root@control ansible]# ansible-playbook test.yml --- - hosts: test,webserver tasks: - name: "第一个剧本" ping: - name: "运行第一个shell命令" shell: touch ~/shell.txt
一个playbook中可以有多个play
[root@control ansible]# ansible-playbook test.yml --- - hosts: test tasks: - name: "第一部剧" ping: - hosts: webserver tasks: - name: "第二部剧" ping: [root@control ansible]# ansible-playbook test.yml
编写playbook创建系统账户、账户属性、设置密码
- 花括号外面必须有双引号
[root@control ansible]# vim test_user.yml --- - hosts: test tasks: - name: "新建alice账户" user: name: alice uid: 1013 group: daemon password: "{{'123' | password_hash('sha512')}}" #密码经过sha512算法加密
编写playbook删除系统账户alice及家目录
[root@control ansible]# ansible-playbook remove_user_alice.yml --- - hosts: test tasks: - name: "删除alice用户" user: name: alice state: absent remove: true #不加此项不会删除家目录
使用sdb分区、创建卷组和逻辑卷
- 确保被控节点主机安装了lvm2软件包
[root@control ansible]# vim lvm.yml --- - hosts: test tasks: - name: "创建一个新的分区大小1GiB" parted: device: /dev/sdb number: 1 state: present part_end: 1GiB - name: "创建第二个分区大小1GiB" parted: device: /dev/sdb number: 2 state: present part_start: 1GiB part_end: 2GiB - name: "创建myvg卷组" lvg: vg: myvg pvs: /dev/sdb1 - name: "创建一个逻辑卷大小500M" lvol: vg: myvg lv: mylv size: 512M #默认单位是m
① ansible_facts用于采集被管理设备的系统信息
② 所有收集的信息都被保存在变量中
③ 每次执行playbook默认第一个任务就是Gathering Facts
④ 使用setup模块可以查看收集到的facts信息
[root@control ansible]# ansible test -m setup | less #将node1采集到的信息管道给less可以快速搜索 (有父子关系时用.分隔),/可以快速搜索
debug模块可以显示变量的值,可以辅助排错,通过msg可以显示变量的值,变量需要使用{{}}扩起来
[root@control ansible]# vim debug.yml --- - hosts: test tasks: - name: "显示主机名" debug: msg: "主机名是:{{ ansible_hostname }}" - name: "显示总内存大小" debug: msg: "内存总大小是:{{ ansible_memtotal_mb }}" 注意引用变量时双括号内开头和结尾都要用空格
支持10几种定义变量的方式,只介绍其中一部分
变量文件 > Playbook变量 > Host Facts变量 > Inventory变量
[root@control ansible]# vim hosts #清单中添加变量
[test]
node1 iname="huafeirenmo" #添加变量iname
[proxy]
node2
[webserver]
node[3:4]
[database]
node5
[cluster:children]
webserver
database
[root@control ansible]# vim inventory_var.yml #编写剧本
---
- hosts: test
tasks:
- name: "通过变量创建用户"
user:
name: "{{ iname }}"
[root@control ansible]# ansible-playbook inventory_var.yml
#在ansible剧本中当调用变量时,开始位置就调用变量,就需要在{{}}外面加双引号
#如果是在后面或者中间位置调用变量{{}}外面可以不加双引号,也可以加双引号
#如:
# "{{ iname }}"
# hello {{ iname }}
[root@node1 ~]# vim facts_var.yml
---
- hosts: test
tasks:
- name: "创建一个用户"
user:
name: "{{ ansible_hostname }}"
[root@control ansible]# vim playbook_var.yml
---
- hosts: test
vars: #vars是关键词,用来定义变量用的
iname: bob
tasks:
- name: "使用清单变量创建用户"
user:
name: "{{ iname }}"
[root@control ansible]# vim variables.yml #定义变量文件
---
iname: alice
[root@control ansible]# vim file_var.yml #编写剧本
---
- hosts: test
vars_files: variables.yml #当变量比较多时,专门定义一个文件用来存变量
tasks:
- name: "变量文件创建用户"
user:
name: "{{ iname }}"
firewalld模块可以配置防火墙策略
[root@control ansible]# vim firewalld.yml --- - hosts: test tasks: - name: "安装防火墙" yum: name: firewalld state: present - name: "运行防火墙" service: name: firewalld state: started enabled: yes - name: "配置防火墙" firewalld: port: 80/tcp #在防火墙规则中添加一个放行tcp,80端口的规则 permanent: yes #permaenent 是设置永久规则 immediate: yes #immediate 是让规则立刻生效 state: enabled #最终:在默认zone中添加一条放行80端口的规则
copy模块是针对同样的文件拷贝给远程主机
Ansible可以利用Jinja2模板引擎读取变量
- 之前在playbook中调用变量,也是Jinja2的功能
- Jinja2模块的表达式包含在分隔符 " {{ }} " 内
给webserver主机拷贝首页,每个主机内容不同 [root@control ansible]# mkdir template [root@control ansible]# vim template/index.html Welcome to {{ansible_hostname}} on {{ansible_ens33.ipv4.address}}. #网卡名要根据实际填写 #模板文件中调用变量不需要使用双引号 [root@control ansible]# vim template.yml --- - hosts: webserver tasks: - name: "webserver安装httpd" yum: name: httpd - name: "使用模板复制index.html到webserver" template: src: /root/ansible/template/index.html dest: /var/www/html/index.html #template模块需要两个参数,src指定需要拷贝的源文件,dest指定需要拷贝的目标位置
默认ansible在遇到error会立刻停止playbook
[root@control ansible]# vim error.yml --- - hosts: test tasks: - name: "启动一个不存在的服务" service: name: huafeirenmo state: started - name: "创建一个新文件" file: path: /tmp/service.txt state: touch
使用ignore_errors可以忽略错误,继续执行后续任务
针对单个任务忽略错误
[root@control ansible]# vim error_ignore.yml --- - hosts: test tasks: - name: "启动一个不存在的服务" service: name: huafeirenmo state: started ignore_errors: true #针对某一个任务忽略错误,要与任务对齐; - name: "创建一个新文件" #ignore_errors是关键词 file: path: /tmp/service.txt state: touch
针对全局任务忽略错误
[root@control ansible]# vim error_ignore_all.yml --- - hosts: test ignore_errors: true #针对全局任务忽略错误 tasks: - name: "启动一个不存在的服务" service: name: huafeirenmo state: started - name: "创建一个新文件" file: path: /tmp/service.txt state: touch
解决当前任务需要依赖其它任务时:
- 通过handlers定义一组任务
- 仅当某个任务触发(notify)handlers时才执行相应的任务
- 若有多个notify触发执行handlers任务,也仅执行一次
- 仅当任务的执行状态位changed时handlers任务才执行
- handlers任务在所有其他任务都执行后才执行
[root@control ansible]# vim handlers.yml --- - hosts: test tasks: - name: "创建一个目录" #多次执行playbook该任务状态不再是changed file: path: /tmp/parents/subdir/ state: directory notify: touch file #notify后面名称必须和handlers中的任务名称一致 handlers: - name: touch file file: path: /tmp/parents/subdir/new.txt state: touch
when可以定义判断条件,条件为真时才执行某个任务
常见条件操作符:==、!=、>、>=、<、<=
多个条件可以使用and(与)或者or(或)分隔
when表达式中调用变量不要使用{{ }}
案例:当主机内存不足600M则关闭NetworkManager服务 [root@control ansible]# vim when_1.yml --- - hosts: test tasks: - name: "检查内存" service: name: NetworkManager state: stopped when: ansible_memfree_mb < 600
判断操作系统是CentOS7则创建测试文件 [root@control ansible]# vim when_2.yml --- - hosts: test tasks: - name: "当版本为CentOS为7时创建文件" file: path: /tmp/when.txt state: touch when: > #支持多行输入,不保留换行符 ansible_distribution == "CentOS" #使用setup模块查看这些变量 and ansible_distribution_major_version == "7"
block可以将多个任务合并为一个组
- 需要当条件满足时执行N个任务,我们可以给N个任务后面都加when判断(但是很麻烦),此时可以使用block定义一个任务块,当条件满足时执行整个任务块
[root@control ansible]# vim block_1.yml --- - hosts: test tasks: - name: "定义一个任务组" block: - name: "安装httpd" yum: name: httpd - name: "启动httpd" service: name: httpd state: started when: ansible_distribution == "CentOS" #仅当条件满足再执行任务组 #注意:when和block是对齐的,他们在一个级别,当条件满足时要执行的是任务组(不是某一个任务)
rescue定义block任务执行失败时要执行的其他任务
always定义无论block任务是否成功,都要执行的任务
[root@control ansible]# vim block_2.yml --- - hosts: test tasks: - block: - name: "创建test1.txt测试文件" file: name: /tmp/test1.txt #改一个不存在的路径就会执行rescue state: touch rescue: - name: "救援:创建test2.测试文件" #当block失败时启用 file: name: /tmp/test2.txt state: touch always: - name: "总是执行:创建test3.txt文件" file: name: /tmp/test3.txt state: touch
loop循环避免多任务使用相同的模块(item是关键字)
- 单变量使用
[root@control ansible]# vim simple_loop.yml --- - hosts: test tasks: - name: "创建多个目录" file: path: /tmp/{{item}} #item为关键字 state: directory loop: - a1 - a2 - a3
- 多变量使用
[root@control ansible]# ansible-playbook complex_loop.yml --- - hosts: test tasks: - name: "创建多个用户" user: name: "{{item.iname}}" #item为关键字不可变 password: "{{item.ipass | password_hash('sha512')}}" #多级用.分隔 loop: - { iname: 'abc',ipass: '123456' } #冒号后要用空格 - { iname: 'cba',ipass: '654321' } #loop第一、二个值里面有两个子值,iname和ipass
① 在实际生产环境中,为了实现不同的功能,我们会编写大量的playbook文件 |
---|
② 每个playbook还可能会调用其他文件(如变量文件) |
③ 不好管理海量的、无规律的文件 |
④ Ansible从1.2版本开始支持Roles |
⑤ Roles是管理ansible文件的一种规范(目录结构) |
- Roles会按照标准的规范,自动到特定的目录和文件中读取数据 |
若创建了一个名称为user.example的Role
- 其标准的目录结构如下图所示
defaults/main.yml: 定义变量的缺省值,优先级最低 files目录: 存储静态文件的目录 handlers/main.yml: 定义handlers meta/main.yml: 写作者、版本等描述信息 README.md: 整个角色(reole)的描述信息 tasks/main.yml: 定义任务的地方 templates目录: 存放动态数据文件的地方(模板文件) vars/main.yml: 定义变量,优先级高
ansible-galaxy命令可以创建、管理自己的roles
[root@control ansible]# ansible-galaxy init roles/issue #创建一个Role,目的是拷贝自己新建的一个模板文件到远程主机的/etc/issue [root@control ansible]# yum -y install tree [root@control ansible]# tree /root/ansible/roles/issue/ #查看目录结构 /root/ansible/roles/issue/ ├── defaults │ └── main.yml ├── files ├── handlers │ └── main.yml ├── meta │ └── main.yml ├── README.md ├── tasks │ └── main.yml ├── templates ├── tests │ ├── inventory │ └── test.yml └── vars └── main.yml 8 directories, 8 files
① 定义issue 文件的模板文件
[root@control ansible]# vim roles/issue/templates/issue.j2 This is the system {{ansible_hostname}} Today's date is:{{ansible_date_time.date}} Contact to {{ admin }}
② 定义变量文件(该文件包含变量,因此必须放置templates目录)
[root@control ansible]# vim roles/issue/vars/main.yml --- # vars file for roles/issue admin: [email protected] #变量名为admin,后面的为变量的值
③ 修改任务文件,任务文件中不需要tasks关键词
- Role的各个文件之间相互调用不需要写路径
[root@control ansible]# vim roles/issue/tasks/main.yml --- # tasks file for roles/issue - name: delever issue file template: src: issue.j2 dest: /etc/issue
Role创建好了,role不会自己运行,需要编写一个剧本调用上面的role;
编写playbook剧本文件,通过roles关键词调用role
① 在ansible.cfg设置roles_path=路径
[root@control ansible]# vim ansible.cfg [defaults] inventory = ~/ansible/hosts forks = 5 host_key_checking = False roles_path = ./roles
② 编写playbook文件,通过roles关键词调用role
[root@control ansible]# vim /issue.yml --- - hosts: test roles: - issue # - role2 #支持加载多个role # - role3
① 公共Roles仓库地址:(https://galaxy.ansible.com)
[root@control ansible]# ansible-galaxy search 'httpd' #联网搜索roles [root@control ansible]# ansible-galaxy info 'acandid.httpd' #查看名称acandid.httpd的基本信息 [root@control ansible]# ansible-galaxy install acandid.httpd -p ~/ansible/roles/ #下载roles到指定目录,-p可以指定下载到哪个目录
下载Roles的方法:
- 使用ansible-galaxy install 或者编写 requirements.yml文件
Ansible有时需要访问敏感数据,例如密码、Key等等
使用Ansible-Vault可以加密和解密数据
- encrypt:加密
- decrypt:解密
- view :查看
- rekey :改密
[root@control ansible]# echo abc > test_vault.txt #创建测试文件 [root@control ansible]# ansible-vault encrypt test_vault.txt #加密文件 New Vault password: #输入密码 Confirm New Vault password: #确认以上密码 Encryption successful [root@control ansible]# ansible-vault view test_vault.txt #查看加密文件 Vault password: #输入密码回车查看 abc
[root@control ansible]# ansible-vault decrypt test_vault.txt #解密文件
Vault password: #输入密码
Decryption successful
[root@control ansible]# cat test_vault.txt #查看文件
abc
[root@control ansible]# ansible-vault encrypt test_vault.txt #加密
New Vault password:
Confirm New Vault password:
Encryption successful
[root@control ansible]# ansible-vault rekey test_vault.txt #改密
Vault password: #输入旧密码
New Vault password: #输入新密码
Confirm New Vault password: #确认密码
Rekey successful
解决加解、密每次输入密码的麻烦,将密码写入文件
[root@control ansible]# echo 123 > test_vault_1.txt #创建测试文件 [root@control ansible]# echo 111 > pass.txt #将密码写入文件 [root@control ansible]# ansible-vault encrypt --vault-id=pass.txt test_vault_1.txt #加密 Encryption successful [root@control ansible]# cat test_vault_1.txt #查看文件 $ANSIBLE_VAULT;1.1;AES256 66386131636637353862616435363836336436363838316534393535313737333738383330326537 3861613165363166303734343365656565316237633763610a646539366338343232343166323936 32326164393833303933356131333264613864383331666137333063336536666266386463376362 3266383430363530380a633935393934313034623063666139363039356533643331303064373132 6532 [root@control ansible]# ansible-vault decrypt --vault-id=pass.txt test_vault_1.txt #解密 Decryption successful [root@control ansible]# cat test_vault_1.txt #查看文件已解密 123