RHCE学习教程之Ansible高级用法

ansible是自动化运维利器,可以通过一台Linux服务器批量控制其他服务器。

本文主要介绍ansible的一些高级用法。

关键词:RHCE Ansible

自定义变量

主机清单变量

针对主机或者组

1
2
3
4
5
6
7
8
9
10
11
12
13
;针对主机
[paas]
1.2.4.8 hostname=1.2.4.8-master01

;针对组
;同一组可以使用相同的环境变量
[web]
1.1.1.1
2.2.2.2
3.3.3.3
[web:vars]
ansible_ssh_user=root
ansible_ssh_pass=root1234

定义剧本变量

使用关键字vars,针对所有执行剧本的主机生效

1
2
3
4
5
6
7
8
---
- hosts: node1, node2
vars:
test01: aaa
test02: bbb
tasks:
- debug:
msg: "{{ test01 }}--{{ test02 }}"

定义文档变量

可以在执行剧本时进行调用

1
2
3
4
5
6
7
8
9
10
11
12
# var.yml
---
abc: abcabc
xyz: xyzxyz

# test01.yml
---
- hosts: node1
var_files: var01.yml
tasks:
- debug:
msg: "{{abc}} {{xyz}}"

以交互方式定义变量

1
2
3
4
5
6
7
8
9
10
11
12
13
---
- hosts: node1
# 交互定义变量关键词
vars_prompt:
- name: var1
prompt: "输入要创建的用户名"
# 不隐藏变量的值
private: no
tasks:
- debug:
var: var1
- user:
name: "{{var1}}"

魔法变量

1
2
3
4
5
6
7
8
inventory_hostname=清单主机名
hostvars=包含被控主机的所有变量
hostvars.node1=只调用node1主机的所有变量
hostvars.node1.group_names=显示node1所在的组的名字
groups=所有主机以及组信息
groups.all=显示被控主机名
groups.test01=显示test01组里的所有主机名
group_names=当前运行任务的主机的所在组

使用copy模块拷贝常量和变量字符串到被控主机

1
2
3
4
5
6
7
8
- hosts: node1
tasks:
- copy:
content: |
abc
xyz
{{ansible_hostname}}
dest: /opt/abc.txt

模块相关

template模板

根据模板生成相应的文件

src:源文件

dest:目标文件

1
2
3
4
5
6
7
8
9
#cat test.j2
{{ ansible_hostname }} # 根据环境变量生成文件

# cat tepl.yml
- hosts: node1
tasks:
- template:
src: test.j2
dest: /opt/test.html

使用ansible容器运行剧本

安装navigator包

1
sudo yum install -y ansible-navigator

修改navigator配置文件

1
2
3
4
5
6
#vim ~/.ansible-navigator.yml
ansible-navigator:
execution-environment:
image: registry.lab.example.com:5000/ee-supported-rhel8:latest
pull:
policy: missing

修改container配置文件

1
2
3
4
5
6
# vim /etc/containers/registries.conf
[registries.search]
registries = ["registry.lab.example.com:5000"]

[registries.insecure]
registries = ["registry.lab.example.com:5000"]

下载镜像

1
ansible-navigator images

执行剧本任务

1
ansible-navigator run debug.yml -m stdout

使用ansible-vault加密敏感文件

参数 用法
encrypt 加密
decrypt 解密
view 查看
rekey 重置密码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 输入密码,加密test01配置文件
ansible-vault encrypt test01.yml
# 输入密码,解密test01配置文件
ansible-vault decrypt test01.yml
# 输入密码,查看test01配置文件
ansible-vault view test01.yml
# 输入密码,执行配置文件
ansible-playbook test01.yml --ask-vault-pass
# 通过保存到pass.txt的密码,执行配置文件
ansible-playbook test01.yml --vault-id pass.txt
# 通过保存到pass.txt的密码,查看配置文件
ansible-vault test01.yml --vault-id pass.txt
# 重置密码
ansible-vault rekey test01.yml

角色

角色是定义好的统一目录规范

修改配置,定义角色目录位置

1
2
3
# vim ~/ansible/ansible.cfg
[default]
roles_path = ./roles

手动创建角色

创建http角色相关目录,http是创建的角色,tasks是存放任务的目录

1
mkdir -p ansible/roles/http/tasks

roles/tasks/main.yml文件

1
2
3
4
- yum:
name: httpd
- debug:
msg: ok

编写剧本调用角色

1
2
3
4
- name: test roles
hosts: node1, node2
roles:
- http

使用命令创建角色

1
2
ansible-galaxy init roles/vsftpd
ls roles/vsftped
目录 用途
tasks 存放执行任务
vars 存放变量,优先级高
defaults 存放变量,优先级低
files 存放静态文件,如图片、视频、配置文件等
meta 存放作者、角色版本信息
templates 存放动态数据,比如j2模板
handlers 存放提前定义好的任务

测试1

准备静态文件

1
echo 123 > roles/vsftpd/files/123

根据角色创建任务

1
2
3
4
5
6
7
# vim roles/vsftpd/tasks/main.yml
- yum:
name: vsftpd
- copy:
# 自动寻找files下的123文件
src: "123"
dest: /var/ftp/pub

编写脚本调用角色

1
2
3
4
# vim test2.yml
- hosts: node1, node2
roles:
- vsftpd

执行剧本

1
ansible-playbook test2.yml

测试2

定义变量

1
2
# vim roles/vsftpd/vars/main.yml
myvar001: abc

测试变量

1
2
3
4
5
6
# vim roles/vsftpd/tasks/main.yml
- template:
src: "456.j2"
dest: /var/ftp/pub
- debug:
msg: "{{myvar001}}"

查看模板生成的文件

1
2
# less /var/ftp/pub
abc

使用网络下载安装角色

配置需要下载的角色文件

1
2
3
#vim roles.yml
- name: myphp
src: http://172.25.254.250/roles/myphp.tar

安装网上下载的角色

1
ansible-galxy install -r roles.yml