36. Ansible变量+管理机密
Ansible变量+管理机密
ansible的变量分为:普通变量(在 Playbook 中定义),主机变量(在 Inventory 中定义), 注册变量register(从任务输出中捕获值,不管任务成功失败都会捕获),事实变量(系统自动收集的信息),内置变量(内置变量是由 Ansible 自身提供的,用于提供关于执行环境、清单结构和 playbook 执行过程的信息。)
定义变量规则:由字母/数字/下划线组成,变量需要以字母开头,ansible内置的关键字不能作为变量名。
ansible中,可以将变量简化为三个范围Global范围(高):从命令行和ansible配置设置的变量play范围(中):在play和相关结构中设置的变量Host范围(低):inventory、facts或register的变量,在主机组和个别主机上设置的变量三个范围的变量优先级由高到低,如果变量重复定义,则以优先级高的为准
一.普通变量
1.普通变量一般在playbook中直接定义
[student@master ansible]$ vim t.yml
---
- name: thosts: node1vars:aa: 123bb: 456cc: 789dd:d1: 224tasks:- name: tedebug:msg: "{{ aa,bb,cc,dd.d1}}"
2.通过文件定义变量
[student@master ansible]$ vim a.yml
aa: 23232323
bb: 44444444
[student@master ansible]$ vim t.yml
---
- name: thosts: node1vars_files: a.ymltasks:- name: tedebug:msg: "{{ aa,bb}}"
3.注册变量(register)
注册变量(Registered Variables)是 Ansible 中一种特殊类型的变量,用于捕获任务的执行结果。它们允许将一个任务的输出保存到变量中,然后在后续的任务中使用这些结果。
[student@master ansible]$ vim t.yml
---
- name: thosts: node1tasks:- name:shell:cmd: cat /webdev/index.htmlregister: aa- name: dedebug:var: aa
---
- name: thosts: node1tasks:- name:shell:cmd: cat /webdev/index.htmlregister: aa- name: dedebug:var: aa.stdout
4.set_fact定义变量
Ansible 事实变量(Facts)是自动收集的关于远程系统的信息,包括硬件配置、网络设置、操作系统详情等。这些信息在任务执行前自动收集,可以在Playbook中直接使用
通过ansible node1 -m setup 可以查询node1主机所有的事实变量
由于内容过多可以将其导入到文件内查看
- name: thosts: node1tasks:- name: t3debug:msg: the ip is {{ ansible_default_ipv4.address }} fqdn is {{ ansible_fqdn}}
5.通过命令传入变量
不在playbook里面指定变量,而是通过ansible-playbook t.yml -e 指定变量
---
- name: thosts: node1tasks:- name: t1debug:msg: I am {{ a1 }}
6.主机变量
主机变量是 Ansible 中用于为特定主机定义自定义配置和属性的机制。它们允许为库存中的单个主机设置特定的值,这些值可以在 Playbook 中使用
[student@master ansible]$ vim inventory
主机
[test01]
node1 name1=node1[test02]
node2[web]
node3
node4[test05]
node5[webtest:children]
web
---
- name: thosts: node1tasks:- name: t1debug:msg: I am {{ name1 }}
主机组
[test01]
node1[test01:vars]
name1=hhh
name2=hahaha[test02]
node2[web]
node3
node4[test05]
node5[webtest:children]
web
---
- name: thosts: node1tasks:- name: t1debug:msg: I am {{ name1 }}- name: t2debug:msg: I am {{ name2 }}
还可以在/etc/ansible目录下创建group_vars和host_vars目录下定义变量
[student@master ansible]$ mkdir host_vars
[student@master ansible]$ vim node1
aa:node1
---
- name: thosts: node1tasks:- name: t1debug:msg: I am {{ aa }}
再创建一个node1.yml文件
aa: node111111
查看
发现是node1的值,删除node1文件再次查看
由此可得node1文件名以主机命名,还可以命名为node1.yml,如果node1与node1.yml同时存在,则node1的优先级更高
7.内置变量
Ansible提供了许多内置变量,这些变量可以在playbook中直接使用,而无需预先定义。它们通常用于获取关于当前执行的主机、库存、组等信息
常用变量
变量名 | 类别 | 描述 |
---|---|---|
inventory_hostname | 内置魔法变量 | 当前任务所运行的主机在库存中定义的主机名 |
inventory_hostname_short | 内置魔法变量 | 主机名的简短形式(不带域名部分) |
groups | 内置魔法变量 | 包含库存中所有组和组内主机的列表的字典 |
group_names | 内置魔法变量 | 当前主机所属的所有组的列表 |
hostvars | 内置魔法变量 | 包含所有主机变量的字典,可用于获取其他主机的变量 |
ansible_play_hosts | 内置魔法变量 | 当前play中所有活动的主机列表 |
ansible_play_batch | 内置魔法变量 | 当前批处理中的主机列表(如果使用了串行策略) |
ansible_version | 内置魔法变量 | Ansible的版本信息 |
inventory_dir | 内置魔法变量 | 返回的是库存文件所在目录的路径 |
8.with_items叠加变量
在 Ansible 中,with_items
是一个常用的循环结构,用于对列表中的每个项执行任务。当需要将变量与循环项结合使用时(即"叠加变量"),有几种不同的方法可以实现
---
- name: thosts: node1tasks:- name: aaashell:cmd: echo {{ item }}with_items:- k1- k2- k3register: h1- name: de1debug:var: h1.results[0].stdout- name: de2debug:var: h1.results[1].stdout- name: de3debug:var: h1.results[2].stdout
---
- name: thosts: node1tasks:- name: aaashell:cmd: echo {{ item }}with_items:- k1- k2- k3register: h1- name: de1debug:msg: "{{h1}}"- name: de2debug:msg: "{{h1}}"- name: de3debug:msg: "{{h1}}"
管理机密
Ansible Vault 可以将任何结构化数据文件(变量文件、Playbook 本身等)进行加密,使其内容变为密文。只有在执行时提供正确的密码,Ansible 才会将其解密并使用。加密后的文件可以安全地存入版本控制系统(如 Git),与团队共享,而无需担心机密泄露
1.使用ansible-vault create命令创建加密文件
[student@master ansible]$ ansible-vault create xyh.yml
---
- name: xyhhosts: node1tasks:- name: create user1user:name: user1state: present
剧本运行xyh.yml,发现执行失败
可以使用选项–vault-id @prompt或者–ask-vault-pass
[student@master ansible]$ ansible-playbook xyh.yml --ask-vault-pass
查看加密的文件
[student@master ansible]$ ansible-vault view xyh.yml
编辑加密文件
[student@master ansible]$ ansible-vault edit xyh.yml
加密文件
[student@master ansible]$ ansible-vault encrypt t1t2.yml
解密文件
[student@master ansible]$ ansible-vault decrypt t1t2.yml
[student@master ansible]$ ansible-vault rekey xyh.yml
更改密码
[student@master ansible]$ ansible-vault rekey xyh.yml