自学内容网 自学内容网

RedHat9 | Ansible 管理变量

环境版本说明

  • RedHat9 [Red Hat Enterprise Linux release 9.0]
  • Ansible [core 2.13.3]
  • Python [3.9.10]
  • jinja [3.1.2]

1. Ansible变量介绍

Ansible支持利用变量来存储值,并在Ansible项目的所有文件中重复使用这些值。这可以简化项目的创建和维护,以减少错误的数量。

通过变量们可以轻松的在Ansible项目中管理特定环境中的动态值,例如下列值

  • 创建的用户
  • 安装的软件包
  • 重新启动的服务
  • 删除的文件
  • 从互联网检索的存档

2. YAML语法

2.1 YAML字符串

YAML中的字符串通常不需要放在引号里,即使字符串中存在空格,字符串可以用双引号或单引号扩起来。

单行文本

# 字符串的第一种表示形式
This is string

# 字符串的第二种表示形式
'This is string'

# 字符串的第三种表示形式
"This is string"

多行文本:保留换行符

multiline: |
This is first
This is second
This is third

多行文本:换行符转换为空格且空行被删除

multiline: >
This is first
This is second
This is third

2.2 YAML字典

字典就是以缩进块形式编写的键值对集合.

缩进块格形式

service: http
package: httpd
port: 80

内联块形式

{service: http,package: httpd,port: 80}

2.3 YAML列表

普通单破折号形式

packages:
  - httpd
  - vsftpd
  - mariadb

方括号扩起的内联格式

apache: [httpd,vsftpd,mariadb]

3. 命名变量

变量命名规则

变量名称必须以字母开头,并且不能只含有字母、下划线和数字。

定义变量

可以在Ansible项目中的多个位置定义变量。如果在两个位置设置了同名变量,并且变量值不同,则通过优先级来决定要使用哪个值。

定义位置的不同,决定变量的作用域。有些变量是Ansible可以根据系统配置来设置的事实,有些变量则可以在playbook中设置,然后影响该playbook中的一个play,或者仅影响play中的一项任务。可以通过--extra-vars-e选项来指定变量值

应用场景描述优先级
全局范围命令行执行临时命令时指定的变量【-e key=value
play范围playbook中的play部分或模块内部指定的变量信息【key:value
主机范围清单中主机或主机组指定变量【主机优先主机组

3.1 全局范围

清单变量可被playbook中设置的变量覆盖,这两种变量可以通过在命令行中传递参数到ansible-navigator run 命令来覆盖。在命令行上设置的变量成为额外变量。命令行中使用变量优先级最高

ansible servera  -m shell -a whoami -e ansible_user=student

在这里插入图片描述

3.2 play范围

  • 变量在Ansible playbook中发挥着重要作用,因为它们可以简化playbook中变量数据的管理
  • 编写paly时,可以定义自己的变量,然后在任务中调用这些值。例如:可以定义web_package=httpd,然后在任务中使用 ansible.builtin.dnf 模块来调用该变量安装httpd软件包。

playbook中可以在play位置使用 vars 直接定义变量,也可以通过 vars_files 加载包含变量的文件。

2.2.1 定义变量字段方式

[Step1]:编写一个demo.yml文件,文件内容如下

---
- name: play1
  hosts: serverb
  vars:# 变量字段
    package: httpd# 定义变量:package=httpd
  tasks:
  - name: Install {{ package }}# 非变量开头不需要添加双引号
    ansible.builtin.yum:
      name: "{{ package }}"# 变量开头需要添加双引号
      state: latest

[Step2]:测试运行

ansible-navigator run demo.yml -m stdout --check

在这里插入图片描述

2.2.2 引用变量文件方式

[Step1]:定义变量文件

vim varfile.yml

# 写入下列内容
package: vsftpd

[Step2]:编写一个demo2.yml文件,文件内容如下

---
- name: play1
  hosts: serverb
  vars_files:# 使用vars_file指令
    - varfile.yml# 变量文件的位置
  tasks:
  - name: Install {{ package }}# 非变量开头不需要添加双引号
    ansible.builtin.yum:
      name: "{{ package }}"# 变量开头需要添加双引号
      state: latest

[Step3]:测试运行

ansible-navigator run demo2.yml -m stdout --check

在这里插入图片描述

3.3 主机范围

直接应用于主机的清单变量分内两大类:

  • 主机变量:应用于特定主机
  • 组变量:应用于一个主机组或一组主机中的所有主机

主机变量优先于组变量,但playbook中定义的变量优先级比主机变量和组变量高。

定义变量的三种方式

vim inventory

# 清单内容如下
192.168.10.1package=bind# 给指定主机定义变量

[demo]
192.168.10.200

[demo:vars]# 给指定组定义变量, `:vars`是固定语法
package=bind

[all:vars]# 给所有主机和主机组定义变量
package=bind

[Step1]:在清单文件中定义主机变量和组变量

vim inventory

# 写入下列内容
[all:vars]# 给所有主机和主机组定义变量
package=bind

[Step2]:编写一个demo3.yml文件,文件内容如下

---
- name: play1
  hosts: serverb
  tasks:
    - name: Install {{ package }}# 非变量开头不需要添加双引号
      ansible.builtin.yum:
        name: "{{ package }}"# 变量开头需要添加双引号
        state: latest

[Step3]:测试运行playbook

ansible-navigator run demo3.yml -m stdout --check

在这里插入图片描述

3.4 使用目录填充主机和组变量

  • 定义主机和主机组变量的首选做法是在清单文件或目录相同的工作目录中,创建 group_vars 和 host_vars 两个目录。这两个目录分别包含用于定义组变量和主机变量文件。
  • 建议在 host_vars 和 group_vars 目录定义清单变量,而不是直接在清单文件中定义。
  • Ansible会查找与清单文件和playbook文件相对的 host_vars 和 group_vars 子目录。

[Step1]:编辑当前清单文件

vim inventory

# 写入下列内容
serverb

[both]
server[c:d]

[Step2]:新建主机变量目录

mkdir host_vars

[Step3]:新建主机组变量目录

mkdir group_vars

[Step4]:serverb安装bind软件包,both组安装autofs软件包

echo package: bind > host_vars/serverb
echo package: autofs > group_vars/both

[Step5]:文件树结构如下

tree /home/student/ansible

在这里插入图片描述

[Step5]:编写一个var.yml文件,文件内容如下

---
- name: play1
  hosts: serverb
  tasks:
  - name: Install bind
    ansible.builtin.yum:
      name: "{{ package }}"
      state: latest

- name: play2
  hosts: both
  tasks:
  - name: Install bind
    ansible.builtin.yum:
      name: "{{ package }}"
      state: latest

[Step7]:测试运行playbook

ansible-navigator run var.yml -m stdout --check

在这里插入图片描述

3.5 字典形式表示变量

除了将同一元素相关的配置数据分配到多个变量外,也可以使用字典。字典是一个包含键值对的数据结构,其中的值也可以字典,字典之间可以互相嵌套,但是不利于阅读。

同一元素相关变量的键值关系

user1_name1: Mike
user1_name2: Tisa
user1_name3: John
    
user2_name1: Lisa
user2_name2: Jack
user2_name3: Tom

字典形式

users:
  user1:
    user1_name1: Mike
    user1_name2: Tisa
    user1_name3: John
  user2:
    user2_name1: Lisa
    user2_name2: Jack
    user2_name3: Tom

两种调用方式

  • 调用时可以使用.将变量上下级分割,类似命名空间形式 users.user1.user1_name1,取出值为Mike
  • 或者使用Python字典的调用方式:users[‘user1’][‘user1_name’]

[Step1]:新建变量文件

vim host_vars/serverb

#  写入下列内容
users:
  user1:
    user1_name1: Mike
    user1_name2: Tisa
    user1_name3: John
  user2:
    user2_name1: Lisa
    user2_name2: Jack
    user2_name3: Tom

[Step2]:编写一个playbook_dict.yml文件,文件内容如下

---
- name: play1
  hosts: serverb
  tasks:
  - name: echo {{ users.user1.user1_name1 }}
    ansible.builtin.shell
      cmd: echo "True"
  - name: echo {{ users['user2']['user2_name2'] }}
    ansible.builtin.shell:
      cmd: echo "True"

在这里插入图片描述

4.使用预定义变量捕获命令输出

register 用来捕获命令输出或有关模块的执行的其他信息,输出会保存在一个变量中,后续可以对该变量进行操作。

[Step1]:编写一个register.yml文件,文件内容如下

---
- name: Intall BIND
  hosts: serverb
  tasks:
  - name: Install BIND
    ansible.builtin.yum:
      name: bind
      state: latest
    register: install_result# 将执行信息保存在变量install_result中
  - name: debug message
    ansible.builtin.debug:# 调用debug模块
      var: install_result# 输出变量内容

[Step2]:测试运行playbook

ansible-navigator run register.yml -m stdout --check

在这里插入图片描述

5. Ansible-vault

  • Ansible可能需要访问密码或API密钥等敏感数据,以配置受管主机。通常此信息会以纯文本形式存储在清单变量或其它Ansible文件中。这种操作让任何有权访问Ansible文件的用户或存储这些Ansible文件的版本控制系统都能够访问此敏感数据。
  • 使用Ansible提供的Ansible Vault的命令行工具创建、编辑、加密和查看文件
  • Ansible Vault可以加密任何由Ansible使用的数据文件。这可能包括清单变量、playbook中含有的变量文件在执行playbook时作为参数传递的变量文件,或者Ansible角色中定义的变量。

ansible-vault的常用参数

命令解释
create创建新的Vault加密文件
decrypt解密Vault文件
edit编辑Vault文件
view查看Vault文件
encrypt加密YAML文件(对现有文件加密)
encrypt_string字符串加密
rekey给Vault加密文件更改密码

其它选项

选项解释
–vault-id指定其它密码存储文件
–ask-vault-password询问加密密码
–vault-password-file指定密码存储文件路径
-v, --verbose显示调试信息

[Step1]:创建加密文件

ansible-vault create passwd.yml
> redhat
> redhat

# 写入下列内容
password: redhat@123

在这里插入图片描述

[Step2]:查看加密文件

ansible-vault view passwd.yml
> redhat

在这里插入图片描述

[Step3]:编辑加密文件

ansible-vault edit passwd.yml
> redhat

# 写入下列内容
user: student

在这里插入图片描述

[Step4]:加密现有文件

echo password: redhat > pass.yml
ansible-vault encrypt pass.yml
> redhat
> redhat

在这里插入图片描述

[Step6]:解密现有文件

ansible-vault decrypt passwd.yml

在这里插入图片描述

[Step7]:解密现有文件,并解密文件名为pass_new.yml文件

ansible-vault decrypt pass.yml --output=pass_new.yml

在这里插入图片描述

[Step8]:解密现有文件,并解密文件名为pass_new.yml文件

ansible-vault rekey pass.yml
> redhat
> redhat@123

在这里插入图片描述

可以使用另外一个文件来存储密码,这样在读取加密文件时,不需要额外输入密码

  • 在读写加密文件时指定参数--vault-id
  • 在Ansible配置文件中指定vault_password_file=

[Step1]:编写密码存储文件

echo redhat@123 > pass.txt

[Step2]:通过参数传递密码存储文件

ansible-vault view pass.yml --vault-id pass.txt

在这里插入图片描述

[Step3]:通过在配置文件中指定密码存储文件

vim ansible.cfg

# 在[defaults]下增加一行
vault_password_file=/home/student/ansible/pass.txt

在这里插入图片描述

[Step4]:直接读取加密文件
在这里插入图片描述

[Step5]:当配置文件中指定了密码存储文件,对新文件进行加密时,会自动引用密码存储文件内容作为文件密码

ansible-vault encrypt dict.yml

在这里插入图片描述

[Step6]:当配置文件引用的密码存储文件与加密文件密码不一致时,可以指定交互式输入密码,输入新密码

# 先注释掉Ansible配置文件中vault_password_file
# 创建一个新文件,指定加密密码为 redhat123
echo password: redhat123 > redhat.yml
ansible-vault encrypt redhat.yml
> redhat123
> redhat123

# 取消注释Ansible配置文件中vault_password_file
ansible-vault view redhat.yml# 先测试密码存储文件内容是否可以解密文件
ansible-vault view redhat.yml --ask-vault-password# 交互式输入新密码

在这里插入图片描述


原文地址:https://blog.csdn.net/weixin_45564816/article/details/140506553

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!