首页 > 解决方案 > 如何混淆剧本中的字符串

问题描述

我有一个调用脚本文件的剧本。它将向脚本文件传递一个秘密。

我想要的是秘密不在标准输出中显示。

根据 ansible 文档,可以使用,但是在设置env 变量no_log: true时这将不起作用。ANSIBLE_DEBUGtrue

我还发现,在“设置执行文件和参数”任务中,即使使用no_log: true.

---
- block:  

  - name: Set Execution File and parameters
    set_fact:
      scriptfile: "{{ansible_user_dir}}\\scripts\\host_check.ps1"
      params: " -servername '{{the_host_name}}' -secret {{my_secret}}"
  
  - name: Execute script
    win_command: powershell.exe "{{scriptfile}}" "{{params}}"
    no_log: True

  rescue:
    - debug:
        msg: "Play failed"

我想将my_secret变量替换为*******

标签: ansible

解决方案


其实no_log: true是你能做的。Ansible 需要知道你的秘密才能使用它,任何可以设置的人ANSIBLE_DEBUG也可以编辑你的剧本来显示秘密。因此,只要你隐藏它,它总是可以被揭示出来。

但是,您可以使用密码加密并将ansible-vault密码传递给 ansible,因此除了您(或拥有密码)之外,没有人可以使用(以及我的这个显示)该密码。

这是加密值的方式(<secret-value>在本例中):

ansible-vault encrypt_string --ask-vault-pass '<secret-value>' --name 'secret'

您将被要求输入密码(我test在这里使用过),然后会得到如下所示的内容:

secret: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          36323534396462626132653332653266393832306337336164373834626330373132363136633865
          6161623130363364643138633236306334313833663535380a666261383838313631396264626534
          66373637653937616231353361633635353238333630303563343630333161626137396332616263
          3966356531613234370a633331333862616164386130663262613430316630373230373833313330
          6265

你把它放在你的库存中(只是一个例子,它应该是什么样子,你需要放入你的主机和其他变量):

---
all:
  hosts:
    your-host:
  vars:
    secret: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          36323534396462626132653332653266393832306337336164373834626330373132363136633865
          6161623130363364643138633236306334313833663535380a666261383838313631396264626534
          66373637653937616231353361633635353238333630303563343630333161626137396332616263
          3966356531613234370a633331333862616164386130663262613430316630373230373833313330
          6265
    the_host_name: host.name
    ansible_user_dir: 'C:\\some\\dir'

然后你可以在你的剧本中这样做:

---
- block:
  - name: Execute script
    win_command: 'powershell.exe "{{ ansible_user_dir }}\\scripts\\host_check.ps1" -servername "{{ the_host_name }}" -secret "{{ my_secret }}"'
    no_log: true
  rescue:
    - debug:
        msg: "Play failed"

你需要--ask-vault-pass像这样运行它:

ansible-playbook -i your-inventory.yml your-playbook.yml --ask-vault-pass

每次运行时它都会要求您输入密码,因此请确保将其保存在某个地方。
如果您在一次运行中使用多个加密值,则需要使用相同的密码来加密所有这些值。


推荐阅读