ansible自动化运维详解ansible中变量的设定使用JINJA2模板的使用以及ansible的加密控制

Posted 是大姚呀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ansible自动化运维详解ansible中变量的设定使用JINJA2模板的使用以及ansible的加密控制相关的知识,希望对你有一定的参考价值。

文章目录

ansible自动化运维详解(五)ansible中变量的设定使用、JINJA2模板的使用以及ansible的加密控制

一、ansible中的变量

1.1、变量命名

ansible中定义变量时,变量名称只能包含数字下划线字母,且只能用下划线字母开头。此外要注意,playbook中引用变量是用引起来,不是$()

实验步骤:
1、这里仍然是利用我们之前一直使用的两台rhel8.2版本的虚拟机进行演示,westos_ansible(172.25.33.100)为控制主机,westos_node1(172.25.33.200)为受控主机。在控制主机切换到用户lee,进入其用户家目录下的ansible目录,在该用户级ansible操作环境下进行实验配置,编写playbook脚本文件test.yml:在westos组内的所有受控主机中,将变量 westos@1 的值作为调试信息输出

执行该playbook脚本文件,可以看到执行失败,报错信息显示westos@1不是一个合法变量名称,ansible的变量名称只能包含数字、下划线和字母

编辑test.yml文件,将变量westos@1名称中的 @ 的替换为下划线 _

再次执行该脚本文件,可以成功引用变量 westos_1 值,在受控主机中调试输出相应信息

2、编辑test.yml文件,将变量 westos_1 名称改为1westos

执行该playbook脚本文件,可以看到执行失败,报错信息显示1westos不是一个合法变量名称,ansible的变量名称只能用下划线或字母开头

编辑test.yml文件,将变量1westos名称中的 1 的替换为下划线 _

再次执行该脚本文件,可以成功引用变量 _westos 值,在受控主机中调试输出相应信息

1.2、变量级别

ansible中的变量分为以下三个级别,其中狭窄范围变量优先于广域范围变量

  • 全局:在命令行或配置文件中设定的
  • play:在play和相关结构中设定的
  • 主机:由清单、事实收集或注册的任务

二、变量设定和使用方式

2.1、在playbook中直接定义变量

在ansible自动化运维详解系列以及上面的实验演示中,我们一直使用在playbook中直接定义变量的方式来设定变量,这里再给出一个简单示例:

---
- name: test
  hosts: all
  vars:
    USER: yao				##在playbook中直接定义一个USER变量
  tasks:
    - name: user
      user:
        name: " USER "	##引用上面定义的变量
        					##!!! playbook中变量引用是用引起来,不是$()

2.2、在文件中定义变量

实验步骤:
1、编辑一个新的yml文件westos.yml,在该文件中定义变量westos,接着在test.yml脚本文件中使用var_files指定变量所在文件为当前目录下的westos.yml,这样一来就可以使用变量名称直接引用文件中所定义的变量

执行该playbook脚本文件,变量定义引用成功,在受控主机中调试输出了相应信息

2、编辑一个新的yml文件westos1.yml,在该文件中定义变量user,接着在test.yml脚本文件中指定变量所在文件为当前目录下的westos.yml、westos1.yml,如果有多个文件定义了多个变量,在playbook中要用列表方式指定变量所在的多个文件,这样一来就可以使用变量名称直接引用多个不同文件中所定义的变量

执行该playbook脚本文件,变量定义引用成功,在受控主机中调试输出了相应信息

3、编辑westos.yml,在该文件中使用列表方式为变量westos定义两个值,接着在test.yml脚本文件中指定变量所在文件为当前目录下的westos.yml,使用变量名称直接引用文件中所定义的变量westos,将其值作为用户名称在受控主机中创建用户

执行该playbook脚本文件,可以看到执行失败,报错信息显示user模块在引用变量westos时出错

修改test.yml脚本文件,如果变量是个列表,即变量中的值有多个,在引用变量时有些模块会出错,如user在建立用户、指定名称name时不能一次跟两个值,我们可以使用item(loop迭代循环)来解决这一问题

执行该playbook脚本文件,可以看到变量循环引用成功,依次在受控主机中建立了westos、linux用户

实例1:使用变量编写playbook安装vsftpd和httpd服务

1、在lee用户家目录下的ansible目录中编写service.yml,在该文件中使用列表方式为变量service定义两个值(值为vsftpd、httpd服务名称);接着编写安装脚本文件install.yml,指定变量所在文件为当前目录下的service.yml,调用dnf模块、使用变量名称直接引用文件中所定义的变量service,在所有受控主机中安装vsftpd和httpd服务,最后调用service模块启动所安装的vsftpd和httpd服务(这里要注意的是service模块和user模块一样,当变量值有多个,在引用变量时会出错,所有这里在调用service模块时使用了item(loop迭代循环)来引用变量)

2、执行该安装脚本文件install.yml,可以看到脚本执行成功,依次在受控主机172.25.33.200中安装了vsftpd和httpd服务

2.3、在清单中设定变量

实验步骤:
1、编辑主机清单文件inventory,直接在清单文件中针对已有的主机组westos设定变量,如下图所示:[westos : vars]表示为westos组配置变量,变量定义为USER,变量值为test

在lee用户家目录下的ansible目录中编写user.yml:调用user模块在westos组内的所有受控主机中创建用户,在清单中直接设定的主机变量可以使用变量名称直接引用,将变量值作为用户名称创建用户

在受控主机中查看用户身份信息文件/etc/passwd,此时无test用户

执行该脚本文件user.yml,可以看到成功在受控主机中执行

在受控主机查看test用户的用户id,可以成功查询即test用户创建成功

2.4、在目录中设定变量

我们还可以通过新建以下两个目录,在目录中设定变量,在目录中所设定的清单变量、主机变量都可以使用变量名称直接引用

目录含义
group_vars清单变量目录,目录中的文件名称要与主机清单名称一致
host_vars主机变量目录,目录中的文件名称与主机名称一致

实验步骤:
1、编辑主机清单文件inventory,删除之前在清单中的变量设定,在lee用户家目录下的ansible目录中新建group_vars清单变量目录,接着切换到group_vars目录中,新建文件westos并在该文件中设置变量为USER、变量值为test(!注意这里新建的文件名要与清单inventory中的主机清单名称westos一致,否则无法成功读取采集到变量)

执行之前的脚本文件user.yml,可以看到成功在受控主机中执行,没有对受控主机作出改变是因为此时受控主机中test用户已经建立

2、在lee用户家目录下的ansible目录中新建host_vars主机变量目录,接着在该目录中新建文件172.25.33.200,并在该文件中设置变量为USER、变量值为linux(!注意这里新建的文件名要与清单inventory中受控主机的名称172.25.33.200一致,否则无法成功读取采集到变量),删除之前的group_vars清单变量目录避免变量重复定义

执行之前的脚本文件user.yml,可以看到成功在受控主机中执行

在受控主机查看linux用户的用户id,可以成功查询即linux用户创建成功

2.5、用命令覆盖变量(优先级最高)

实验步骤:
1、修改脚本文件user.yml,调用debug模块将变量USER的值作为调试信息输出显示

使用ansible-playbook user.yml -e "USER=westoslinux"命令执行该脚本文件,在命令中引入-e参数指定变量USER的值为westoslinux,可以看到输出的调试信息即变量USER的值被westoslinux覆盖,命令覆盖变量这一方法优先级最高

2.6、使用数组定义变量

在ansible中还可以使用数组定义变量,即一个列表里有很多字典(很多组元素)

实验步骤:
1、编辑文件westos.yml,在该文件中使用数组方式定义LIST变量,每一组元素中都包含了name、path变量且设定了不同的值;接着编辑脚本文件test.yml,指定变量所在文件为当前目录下的westos.yml,调用debug模块将每一组name、path变量的值作为调试信息输出显示,这里由于变量有多组元素且同一变量值有多个,我们需要使用item(loop迭代循环)来引用变量,在引用组元素中的变量时使用item.变量名称的方式

执行该脚本文件test.yml,可以看到调试信息按照数组所设定的变量值成功输出,变量循环引用成功

2.7、注册变量

注册变量register指的是将模块输出信息注册到指定字符串里

实验步骤:
1、编辑脚本文件test.yml,调用shell模块输出"hello westos",并将命令执行的返回值作为变量值注册到字符串westos中,接着调用debug模块将westos变量的值作为调试信息输出显示
执行该脚本文件test.yml,可以看到shell模块的返回值(红框内所有内容,json格式,包含了多个键值对)成功注册为了westos变量的值,且作为调试信息输出显示,其中箭头标注部分stdout为shell模块的标准输出

2、编辑脚本文件test.yml,我们可以使用westos['特定参数项名称']指定返回值中某个键值对中的key,调用debug模块将注册变量westos值即返回值中的某一项特定值作为调试信息输出显示

再次执行该脚本文件test.yml,可以看到此时只输出显示了shell模块返回值中的stdout即标准输出

3、编辑脚本文件test.yml,调用shell模块检测受控主机中是否存在/mnt/hello文件,并将命令执行的返回值作为变量值注册到字符串westos中,接着调用debug模块将westos变量的值作为调试信息输出显示

执行该脚本文件test.yml,可以看到执行失败,这是因为受控主机中不存在目标文件,shell模块的错误输出使脚本文件无法继续执行

编辑脚本文件test.yml,引用ignore_errors参数并设置其值为yes,即忽略模块的错误输出继续执行脚本文件

再次执行该脚本文件test.yml,可以看到shell模块的错误输出被屏蔽、脚本成功执行,shell模块的返回值(红框内所有内容,json格式,包含了多个键值对)成功注册为了westos变量的值,且作为调试信息输出显示,其中箭头标注部分rc参数表示shell模块的执行结果(成功 rc=0;失败 rc=1),这里 rc=1 表示没有该文件

编辑脚本文件test.yml,这里我们可以通过在注册变量westos中捕捉rc参数的值,来决定是否执行输出对应语句的动作:当rc参数的值不为0时,意味着受控主机中不存在目标文件,此时我们可以调用debug模块直接输出显示调试信息"file is not found"

再次执行该脚本文件test.yml,可以看到脚本执行成功、变量值捕捉成功且输出了所设定的调试信息

2.8、事实变量

事实变量指的是ansible在受控主机中自动检测出的变量。事实变量中含有与受控主机相关的信息,当我们需要采集使用受控主机的相关信息时,直接调用事实变量即可。因为事实变量的信息为系统信息,不能随意设定赋值,只能采集,故被称为事实变量。

实验步骤:
1、采集受控主机信息:在ansible主机中调用setup模块可以看到westos组内受控主机的事实变量信息,变量名是去掉ansible_的部分

2、编辑脚本文件test.yml,我们可以使用ansible_facts['事实变量名称']指定受控主机事实变量信息中某个键值对的key,调用debug模块将事实变量信息中的某一特定变量的值作为调试信息输出显示

执行该脚本文件test.yml,可以看到脚本执行成功,成功捕捉输出了事实变量nodename的值即受控节点的主机域名

编辑脚本文件test.yml,引入gather_facts参数并设置其值为no,在playbook中关闭事实变量收集

再次执行该脚本文件test.yml,可以看到脚本执行失败,无法捕捉输出事实变量的值

编辑脚本文件test.yml,设置gather_facts参数值为yes,在playbook中开启事实变量收集

再次执行该脚本文件test.yml,此时脚本又能够成功执行、成功捕捉输出事实变量nodename的值即受控节点的主机域名

2.9、魔法变量

ansible默认会提供一些内置的变量以实现一些特定的功能,我们称这些变量为魔法变量。具体的变量及其含义如下:

变量含义
hostvars列出ansible软件的内部信息
group_names列出指定受控主机所在组
groups列出清单中所有的组和主机
inventory_hostname列出清单中所配置的指定受控主机的名称

实验步骤:
1、在ansible主机中调用 debug 模块,将魔法变量 hostvars 的值打印输出,列出ansible软件的内部信息

2、在ansible主机中调用 debug 模块,将魔法变量 group_names 的值打印输出,列出当前本地主机所在组,由于当前ansible主机没有在清单中的主机组中,所以无结果输出;再次执行上述命令,列出172.25.33.200受控主机所在组,成功输出了其在清单中的主机组组名westos

3、在ansible主机中调用 debug 模块,将魔法变量 inventory_hostname 的值打印输出,列出清单中所配置的172.25.33.200受控主机的名称,成功输出了其在清单中的主机名称

4、在ansible主机中调用 debug 模块,将魔法变量 groups 的值打印输出,列出清单中所有的组和主机

实例2:使用playbook部署两台Apache虚拟主机

1、编辑变量配置文件vhost_list.yml:在该文件中使用数组方式定义WEBS变量,每一组元素中都包含了webname虚拟主机网站域名、doc虚拟主机默认发布目录、index虚拟主机默认发布内容这三个变量且设定了不同的值

2、接着编辑部署脚本文件vhost.yml:指定变量所在文件为当前目录下的vhost_list.yml;第一步调用 dnf 模块在受控主机中安装 httpd 即Apache服务;第二步利用item(loop迭代循环)、使用item.变量名称的方式、调用 file 模块在doc变量指定位置处递归创建两台虚拟主机的默认发布目录;第三步调用 copy 模块在两台虚拟主机的默认发布目录中,指定文本内容为index变量值、直接在受控主机中生成虚拟主机默认发布页面文件index.html;第四步调用 file 模块删除受控主机中原本的虚拟主机配置文件/etc/httpd/vhost.conf,清空配置;第五步调用 lineinfile 模块重新创建、编写虚拟主机配置文件/etc/httpd/vhost.conf,换行(在playbook中:|+表示自动换行)写入两台虚拟主机的相关信息;第六步再次调用 lineinfile 模块将Apache默认访问配置信息插入到/etc/httpd/vhost.conf文件的第一行;第七步调用 service 模块重启httpd服务并设置其为开机自启动;最后调用 firewalld 模块设置受控主机防火墙永久允许httpd服务,并令设置立即生效

[lee@westos_ansible ansible]$ cat vhost.yml
- name:
  vars_files: ./vhost_list.yml
  hosts: westos
  tasks:
  - name: install web
    dnf:
      name: httpd
      state: latest
  - name: create index doc
    file:
      path: " item.doc "
      state: directory
    loop:
      " WEBS "
  - name: create index file
    copy:
      dest: "item.doc/index.html"
      content: "item.index"
    loop:
      " WEBS "
  - name: clear config
    file:
      name: /etc/httpd/conf.d/vhosts.conf
      state: absent
  - name: configure vhost
    lineinfile:
      path: /etc/httpd/conf.d/vhosts.conf
      create: yes
      line: |+
        <VirtualHost *:80>
          DocumentRoot "item.doc"
          ServerName "item.webname"
        </VirtualHost>
    loop: 
      " WEBS "
  - lineinfile:
    path: /etc/httpd/conf.d/vhosts.conf
    line: |+
      <VirtualHost _default_:80>
        DocumentRoot  /var/www/html
      </VirtualHost>
    insertbefore: BOF
  - name: start service
    service:
      name: httpd
      state: restarted
      enabled: yes
  - name: configure firewalld
    firewalld:
      service: http
      state: enabled
      permanent: yes
      immediate: yes

3、执行该部署脚本文件vhost.yml,可以看到脚本成功执行并对受控主机作出改变,此时访问受控主机的web服务器,通过不同的域名可以进入不同的网站,一个apache为多个域名服务,相当于一个服务器上挂了多个网站

三、JINJA2模板

3.1、JINJA2模板简介

Jinja2是Python下一个被广泛应用的模版引擎,它的设计思想来源于Django的模板引擎,并在此基础上扩展了其语法和一系列强大的功能,其中最显著的是增加了沙箱执行功能(用于为不信任的代码求值,访问不安全的属性和方法是被禁止的)和可选的自动转义功能,这对大多应用的安全性来说是非常重要的。简单来说,Jinja2提供了替换功能(变量替换)和一些强大的特性(控制流、继承等),可以快速生成数据文件,使得业务与数据分离开来,满足一些灵活多变的配置需求

3.2、j2模板书写规则

(1)j2模板中一般建议在首行注释说明文件用途,此外jinja2模板还可以直接捕捉变量,具体示例如下:

# /etc/hosts line # 	##注释说明文件用途
127.0.0.1 localhost 	##文件内容
 ansible_facts['all_ipv4_addresses']  ansible_facts['fqdn'] 	##使用事实变量

(2)我们可以在jinja2模板中,使用for循环直接捕捉其他文件中使用列表方式所定义的、具有多个值的变量

#for循环#
vim users.yml
users:
 - westos
 - linux
 - ansible

vim test.j2
% for NAME in users %		##将user变量的多个值循环赋值给NAME变量
 NAME 
%endfor%

(3)此外在jinja2模板中,我们还可以在使用for循环时进行if 判定

#if 判定# 
% for NAME in users if not NAME == "ansible" %
User number loop.index -  NAME 
%endfor%

注意!!!
loop.index 	循环迭代记数从 1 开始
loop.index0 循环迭代计数从 0 开始

示例:
% for user in students %
name: user['name']
%if user['age'] is defined%
age: user['age']
%endif%
% if user['age'] is not defined %
age: null
% endif%
obj: user['obj']
%endfor%

实验步骤:
1、在lee用户家目录下的ansible目录中编写模板 test.j2,其中首行注释说明文件用途,文件内容为hello westos;接着在同级目录中编写测试脚本文件test.yml,调用template模块、使用src参数指定模板文件为当前目录下的 test.j2、使用dest参数指定根据模板文件渲染拷贝得到的最终文件在受控主机中的路径,在westos组内所有受控主机的/mnt目录中生成名为test的文件

执行该测试脚本文件test.yml,可以看到脚本成功执行并对受控主机作出改变

在受控节点的/mnt目录下查看,test文件成功生成,且文件内容与控制主机中的模板文件 test.j2一致

2、将本地解析文件/etc/hosts复制到lee用户家目录下的ansible目录中,得到模板hosts.j2,编辑该模板文件,将最后一行的当前主机信息替换为事实变量,这样一来利用该模板配置所有受控主机中的本地解析文件时,可以直接捕捉各个受控主机的ip地址、完全限定域名以及主机名;接着在同级目录中编写测试脚本文件test.yml,调用template模块在westos组内所有受控主机的/mnt目录中,利用hosts.j2模板生成名为hosts的文件

执行该测试脚本文件test.yml,可以看到脚本成功执行并对受控主机作出改变

在受控节点的/mnt目录下查看,hosts文件成功生成,文件内容与控制主机中的模板文件 hosts.j2一致,受控主机各事实变量的值(受控主机的ip地址、完全限定域名、主机名)成功采集捕捉

3、在当前目录中编辑user.yml,在该文件中使用列表方式为变量 users 定义三个值;接着编写模板 test.j2,使用 for 循环直接捕捉 users 变量的多个值并循环赋值给 NAME 变量;最后编写测试脚本文件test.yml,指定变量所在文件为当前目录下的user.yml,调用template模块在westos组内所有受控主机的/mnt目录中,利用test.j2模板生成用户列表文件user_list

执行该测试脚本文件test.yml,可以看到脚本成功执行并对受控主机作出改变

在受控节点的/mnt目录下查看,用户列表文件user_list成功生成,文件内容即用户名称与 users 变量的多个值一致,test.j2模板中变量循环赋值成功

4、编辑模板 test.j2,在 for 循环中 NAME 变量前插入 loop.index 变量,即在每一次NAME变量赋值时从 1 开始进行循环迭代记数;再次执行测试脚本文件test.yml,可以看到脚本成功执行并对受控主机作出改变

在受控节点的/mnt目录下查看用户列表文件user_list,文件中的每个用户名称前成功插入计数数字(从 1 开始)

编辑模板 test.j2,将 for 循环中的 loop.index 变量修改为 loop.index0 变量,即在每一次NAME变量赋值时从 0 开始进行循环迭代记数;再次执行测试脚本文件test.yml,可以看到脚本成功执行并对受控主机作出改变

在受控节点的/mnt目录下查看用户列表文件user_list,文件中的每个用户名称前成功插入计数数字(从 0 开始)

5、编辑模板 test.j2 在 for 循环中引入 if 判定,当 NAME 变量的值为linux时在最终生成文件中只写入计数数字,当 NAME 变量的值不为linux时在最终生成文件中写入计数数字及变量值;再次执行测试脚本文件test.yml,可以看到脚本成功执行并对受控主机作出改变

在受控节点的/mnt目录下查看用户列表文件user_list,可以看到文件中没有linux这一用户名称,linux文本原所在行只有计数数字

实例3:使用jinja2模板为受控主机生成本地解析文件

1、使用jinja2模板为所有受控主机生成本地解析文件时,需要考虑一个问题,怎样才能在哪台主机运行就只采集哪台受控主机的ip地址、完全限定域名以及主机名?可以看出这里受控主机的 ip 既为jinja2配置模板的变量,我们需要根据其不同的变量值采集受控主机对应的完全限定域名、主机名。首先查看清单文件可以看到westos组内包含的所有受控主机,其结果与在ansible主机中调用 debug 模块、将魔法变量 groups 中 all 参数的值打印输出(列出清单中所有主机)的结果一致,均为所有受控主机的 ip,因此我们不需要额外编写文件定义受控主机 ip 变量,直接使用魔法变量groups['all']来采集所有受控主机的 ip

2、在ansible主机中调用 debug 模块、将魔法变量 hostvars 的值打印输出,可以列出指定主机ansible软件的所有内部信息,其中就包含ansible_facts事实变量,这一事实变量中又包含了多个键值对,我们可以进一步通过ansible_facts['事实变量元素名称']指定事实变量信息中某个键值对的key,得到当前指定主机的ip地址、完全限定域名以及主机名

3、编辑模板文件hosts.j2,替换最后一行内容,使用 for 循环直接捕捉魔法变量groups['all']的多个值并循环赋值给 WESTOS 变量,在每次循环中,WESTOS 变量每得到一个受控主机的ip,就会在魔法变量hostvars['WESTOS']列出的、当前受控主机的所有信息中,使用ansible_facts['事实变量名称']采集捕捉当前受控主机的ip地址、完全限定域名以及主机名,进而在各受控主机中生成各自的本地解析文件

4、编写测试脚本文件test.yml,调用template模块在westos组内所有受控主机的/mnt目录中,利用hosts.j2模板生成各自的本地解析文件hosts;执行该测试脚本文件test.yml,可以看到脚本成功执行并对所有受控主机作出改变

5、在控制节点也是受控节点(172.25.33.100)的/mnt目录下查看,hosts文件成功生成,文件内容与控制主机中的模板文件 hosts.j2一致,所有受控主机的 ip地址、完全限定域名、主机名成功采集捕捉且一 一对应

6、在受控节点(172.25.33.200)的/mnt目录下查看,hosts文件成功生成,文件内容与控制主机中的模板文件 hosts.j2一致,所有受控主机的 ip地址、完全限定域名、主机名成功采集捕捉且一 一对应

四、ansible的加密控制

4.1、shell脚本的加密

实验步骤:
1、在讲解ansible中的加密控制前,先引申一下shell脚本的加密:新建并编辑shell脚本文件test.sh,在/bin/bash环境下输出显示hello westos;下载用于对shell脚本进行加密shc 软件压缩包

2、解压缩 shc 软件包后切入该软件目录中,可以看到有一个名为shc.c的可执行二进制C文件

3、我们需要使用root用户身份(lee用户没有权限)安装gcc编译软件

4、gcc安装完成后,切换回lee用户身份,使用gcc编译 shc.c 生成shell加密工具 shc,此时./shc即可运行使用该加密工具

5、使用命令./shc-3.8.7/shc -r -f test.sh对shell脚本文件test.sh进行加密,其中-r参数表示可在相同操作系统的不同主机上执行、-f参数指定源shell脚本文件,生成得到了一个可执行的二进制文件 test.sh.x(还生成了 test.sh.x.c,C语言文件,无用,可以删除),查看该文件可以看到文件内容成功加密

4.2、ansible中playbook脚本的加密

实验步骤:
1、在lee用户家目录下的ansible目录中使用ansible-vault create 文件名称命令,创建加密playbook脚本文件westos.yml,输入并验证密码,进入编辑文件;编辑完成后查看该脚本文件,可以看到文件内容被加密

进入脚本文件westos.yml所编辑的内容如下:调用debug模块在westos组内的所有受控主机中显示输出hello westos

2、新建并编辑文本密钥文件westoskey,输入密钥;接着使用ansible-vault create --vault-password-file=文本密钥文件名称 文件名称命令,以文本密钥形式创建加密文件,此时不需要手动输入并验证密码

进入编辑文件,编辑完成后查看该脚本文件,可以看到文件内容被加密,此时有以下两种方式查看加密文件:1)ansible-vault view 文件名称,手动输入验证密码;2)ansible-vault view --vault-password-file=文本密钥文件名称 文件名称,不需要手动输入验证密码

3、新建并编辑文件testfile,查看文件内容如下,此时我们可以使用ansible-vault encrypt 文件名称加密已有文件,再次查看文件其内容被加密,如果想要编辑该加密文件,可以使用ansible-vault edit 文件名称ansible-vault edit --vault-password-file=文本密钥文件名称 文件名称命令

4、使用ansible-vault decrypt 文件名称命令、输入密码验证后可以永久解密文件,我们也可以使用ansible-vault decrypt 文件名称1 --output=文件名称2命令将文件 1 解密保存为文件 2

5、使用以下两种方式可以更改加密文件密码:1)ansible-vault rekey 文件名称,手动输入原密码验证后输入新密码;2)ansible-vault rekey 文件名称 --new-vault-password-file=文本密钥文件名称,以文本密钥形式更改加密文件密码

6、在执行加密后的playbook脚本文件时,需要使用--ask-vault-pass参数进行密码验证,输入密码后该脚本文件才能够成功执行

还可以将密码写入文本密钥文件,在执行加密后的playbook脚本文件时,使用--vault-password-file参数指定文本密钥文件即可成功执行

以上是关于ansible自动化运维详解ansible中变量的设定使用JINJA2模板的使用以及ansible的加密控制的主要内容,如果未能解决你的问题,请参考以下文章

ansible自动化运维详解ansible中变量的设定使用JINJA2模板的使用以及ansible的加密控制

Ansible自动化运维之playbook详解(含yaml介绍)及ansible的加密控制

自动化运维工具——ansible详解案例分享

ansible自动化运维详解ansible中playbook的编写使用执行命令及实例演示

ansible自动化运维详解ansible中playbook的编写使用执行命令及实例演示

ansible自动化运维详解ansible中playbook的编写使用执行命令及实例演示