36. Ansible变量+管理机密

发布于:2025-09-02 ⋅ 阅读:(22) ⋅ 点赞:(0)

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

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到