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: t
hosts: node1
vars:
aa: 123
bb: 456
cc: 789
dd:
d1: 224
tasks:
- name: te
debug:
msg: "{{ aa,bb,cc,dd.d1}}"
2.通过文件定义变量
[student@master ansible]$ vim a.yml
aa: 23232323
bb: 44444444
[student@master ansible]$ vim t.yml
---
- name: t
hosts: node1
vars_files: a.yml
tasks:
- name: te
debug:
msg: "{{ aa,bb}}"
3.注册变量(register)
注册变量(Registered Variables)是 Ansible 中一种特殊类型的变量,用于捕获任务的执行结果。它们允许将一个任务的输出保存到变量中,然后在后续的任务中使用这些结果。
[student@master ansible]$ vim t.yml
---
- name: t
hosts: node1
tasks:
- name:
shell:
cmd: cat /webdev/index.html
register: aa
- name: de
debug:
var: aa
---
- name: t
hosts: node1
tasks:
- name:
shell:
cmd: cat /webdev/index.html
register: aa
- name: de
debug:
var: aa.stdout
4.set_fact定义变量
Ansible 事实变量(Facts)是自动收集的关于远程系统的信息,包括硬件配置、网络设置、操作系统详情等。这些信息在任务执行前自动收集,可以在Playbook中直接使用
通过ansible node1 -m setup 可以查询node1主机所有的事实变量
由于内容过多可以将其导入到文件内查看
- name: t
hosts: node1
tasks:
- name: t3
debug:
msg: the ip is {{ ansible_default_ipv4.address }} fqdn is {{ ansible_fqdn}}
5.通过命令传入变量
不在playbook里面指定变量,而是通过ansible-playbook t.yml -e 指定变量
---
- name: t
hosts: node1
tasks:
- name: t1
debug:
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: t
hosts: node1
tasks:
- name: t1
debug:
msg: I am {{ name1 }}
主机组
[test01]
node1
[test01:vars]
name1=hhh
name2=hahaha
[test02]
node2
[web]
node3
node4
[test05]
node5
[webtest:children]
web
---
- name: t
hosts: node1
tasks:
- name: t1
debug:
msg: I am {{ name1 }}
- name: t2
debug:
msg: I am {{ name2 }}
还可以在/etc/ansible目录下创建group_vars和host_vars目录下定义变量
[student@master ansible]$ mkdir host_vars
[student@master ansible]$ vim node1
aa:node1
---
- name: t
hosts: node1
tasks:
- name: t1
debug:
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: t
hosts: node1
tasks:
- name: aaa
shell:
cmd: echo {{ item }}
with_items:
- k1
- k2
- k3
register: h1
- name: de1
debug:
var: h1.results[0].stdout
- name: de2
debug:
var: h1.results[1].stdout
- name: de3
debug:
var: h1.results[2].stdout
---
- name: t
hosts: node1
tasks:
- name: aaa
shell:
cmd: echo {{ item }}
with_items:
- k1
- k2
- k3
register: h1
- name: de1
debug:
msg: "{{h1}}"
- name: de2
debug:
msg: "{{h1}}"
- name: de3
debug:
msg: "{{h1}}"
管理机密
Ansible Vault 可以将任何结构化数据文件(变量文件、Playbook 本身等)进行加密,使其内容变为密文。只有在执行时提供正确的密码,Ansible 才会将其解密并使用。加密后的文件可以安全地存入版本控制系统(如 Git),与团队共享,而无需担心机密泄露
1.使用ansible-vault create命令创建加密文件
[student@master ansible]$ ansible-vault create xyh.yml
---
- name: xyh
hosts: node1
tasks:
- name: create user1
user:
name: user1
state: 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