目录
2、基于VmVare搭建测试环境(Linux_CentOS7.5)
1.主机列表(虚拟机创建及配置自行解决,不在赘述;镜像源为阿里云)
2. Host Facts变量(可以直接调用ansible收集的系统信息)
3. Play变量(使用vars关键词可以在Playbook内定义变量)
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: huafeirenmo@example.com #变量名为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