Encryption Ansible:如何在单独的vault文件中加密库存文件中的某些变量? 设置

Encryption Ansible:如何在单独的vault文件中加密库存文件中的某些变量? 设置,encryption,ansible,ansible-playbook,ansible-vault,Encryption,Ansible,Ansible Playbook,Ansible Vault,考虑一个类似于以下示例的示例: [san_diego] host1 host2 [san_francisco] host3 host4 [west_coast] san_diego san_francisco [west_coast:vars] db_server=foo.example.com db_host=5432 db_password=top secret password 问题 我想将一些变量(如db\u password)存储在一个文件中,但不是整个文件 如何将vault加

考虑一个类似于以下示例的示例:

[san_diego]
host1
host2

[san_francisco]
host3
host4

[west_coast]
san_diego
san_francisco

[west_coast:vars]
db_server=foo.example.com
db_host=5432
db_password=top secret password
问题 我想将一些变量(如
db\u password
)存储在一个文件中,但不是整个文件

如何将vault加密的可转换文件导入到未加密的库存文件中

我试过的 我创建了一个加密的vars文件,并尝试使用以下工具导入该文件:

include: secrets
对此,
ansible playbook
响应为:

ERROR: variables assigned to group must be in key=value form
可能是因为它试图将
include
语句作为变量进行解析。

您可以使用组变量(请参阅)

在剧本中创建一个子目录,名为
group\u vars

在这里,您创建了一个名为
west_coast
的文件,并将以下条目放入其中:

---
db_server: foo.example.com
db_host: 5432
db_password: top secret password

然后可以将此文件转换为ansible vault。

这取决于您的工作流程。根据Sebastian Stigler的建议,您可以使用
group\u vars
文件,或者如果您想使用清单文件,您可以在清单目录中添加另一个“类似ini”的文件并对其进行加密

$ mkdir my_inventory/
$ cat >> hosts << EOF
[san_diego]
host1
host2

[san_francisco]
host3
host4

[west_coast]
san_diego
san_francisco
EOF

$ cat >> inventory_crypted_vars << EOF
[west_coast:vars]
db_server=foo.example.com
db_host=5432
db_password=top secret password
EOF
你应该被安排好。Ansible将在运行时合并这两个文件

在提交之前,使用
ansible vault加密我的库存/库存加密的库存变量
,即可设置


您可能需要一个预提交钩子来确保您没有提交文件的未加密版本。例如,您可以执行以下操作(相应地调整
文件\u模式)。

您可以执行类似的操作

  • 创建一个密码文件(一个纯文本文件,密码在一行上)
  • 在ansible项目文件夹中创建一个
    ansible.cfg

    [defaults]
    vault_password_file = <path/to/your/password/file>
    
  • 创建变量文件(例如
    vars.yml

  • 加密变量文件(使用
    ansible.cfg
    从ansible项目位置)

  • 运行您的剧本(从ansible项目位置,使用
    ansible.cfg

  • 您应该获得类似以下内容的输出:

    $ ansible-playbook playbook.yml -i 'localhost,'
    
    PLAY [my ansible playbook] ****************************************************
    
    GATHERING FACTS ***************************************************************
    
    ok: [127.0.0.1]
    
    TASK: [print secure variable] *************************************************
    
    ok: [127.0.0.1] => {
        "msg": "my secure variable 'X_my_secret_X' "
    }
    
    PLAY RECAP ********************************************************************
    
    127.0.0.1                  : ok=2    changed=0    unreachable=0    failed=0
    

    如果您的问题是每个组_主机都有未加密和加密的vars文件

    您可以使用此ansible功能:

    Ansible将自动将vault.yml读取为加密的yaml文件


    更新:该解决方案也是一个很好的解决方案(因为Ansible 2.3)

    现在使用Ansible 2.3,可以在普通yaml中同时使用加密和未加密变量。加密变量的格式如下所示:

    dbServer: PlainDatabaseServer
    dbName: PlainDatabaseName
    dbUser: PlainUser
    dbPasswd: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          63633363616165656538656537323835343634633063386137353637646663333939623464666437
          6263383933656635316436313934366564316337623435350a386362613838373363393534383232
          39663162363066313431623466363763356466376538613532333731613538373431623239626330
          6463373238366630360a623566616535376339326431363465663431623462356238636333306663
          6439
    
    您可以使用密码或带有以下语句的密码文件加密变量:

    ansible-vault encrypt_string "dummy" --vault-password-file pass-ansible.txt
    
    此语句返回上述yaml中dbPasswd变量中显示的文本

    要运行使用加密变量的playbook,只需添加以下变量:

     ansible-playbook playbooks/myplaybook --vault-password-file pass-ansible.txt
    
    或者您也可以使用--ask vault pass执行剧本时询问密码:

    ansible-playbook playbooks/myplaybook --ask-vault-pass
    

    由于Ansible 2.3,您可以加密一个。 在我看来,需要一个演练,因为doco看起来相当简洁

    举一个例子:
    mysql\u密码:password123
    (在main.yml中)

    运行如下命令:

        !vault |
    $ANSIBLE_VAULT;1.1;AES256
    66386439653236336462626566653063336164663966303231363934653561363964363833
    3136626431626536303530376336343832656537303632313433360a626438346336353331
    Encryption successful
    
    mysql_password: !vault |
        $ANSIBLE_VAULT;1.1;AES256
        66386439653236336462626566653063336164663966303231363934653561363964363833
        3136626431626536303530376336343832656537303632313433360a626438346336353331
    
    - debug:
        msg: "mysql Pwd: {{ mysql_password }}"
    
    ansible保险库加密\u字符串密码123——询问保险库密码

    这将产生:

        !vault |
    $ANSIBLE_VAULT;1.1;AES256
    66386439653236336462626566653063336164663966303231363934653561363964363833
    3136626431626536303530376336343832656537303632313433360a626438346336353331
    Encryption successful
    
    mysql_password: !vault |
        $ANSIBLE_VAULT;1.1;AES256
        66386439653236336462626566653063336164663966303231363934653561363964363833
        3136626431626536303530376336343832656537303632313433360a626438346336353331
    
    - debug:
        msg: "mysql Pwd: {{ mysql_password }}"
    
    将此内容粘贴到主目录中。yml:

        !vault |
    $ANSIBLE_VAULT;1.1;AES256
    66386439653236336462626566653063336164663966303231363934653561363964363833
    3136626431626536303530376336343832656537303632313433360a626438346336353331
    Encryption successful
    
    mysql_password: !vault |
        $ANSIBLE_VAULT;1.1;AES256
        66386439653236336462626566653063336164663966303231363934653561363964363833
        3136626431626536303530376336343832656537303632313433360a626438346336353331
    
    - debug:
        msg: "mysql Pwd: {{ mysql_password }}"
    
    运行手册:

        !vault |
    $ANSIBLE_VAULT;1.1;AES256
    66386439653236336462626566653063336164663966303231363934653561363964363833
    3136626431626536303530376336343832656537303632313433360a626438346336353331
    Encryption successful
    
    mysql_password: !vault |
        $ANSIBLE_VAULT;1.1;AES256
        66386439653236336462626566653063336164663966303231363934653561363964363833
        3136626431626536303530376336343832656537303632313433360a626438346336353331
    
    - debug:
        msg: "mysql Pwd: {{ mysql_password }}"
    
    例如,
    ansible playbook-i hosts main.yml——询问保险库通行证

    通过调试验证:

        !vault |
    $ANSIBLE_VAULT;1.1;AES256
    66386439653236336462626566653063336164663966303231363934653561363964363833
    3136626431626536303530376336343832656537303632313433360a626438346336353331
    Encryption successful
    
    mysql_password: !vault |
        $ANSIBLE_VAULT;1.1;AES256
        66386439653236336462626566653063336164663966303231363934653561363964363833
        3136626431626536303530376336343832656537303632313433360a626438346336353331
    
    - debug:
        msg: "mysql Pwd: {{ mysql_password }}"
    

    这种方法的问题是,变量既不能从其他playbook访问,也不能在使用
    -i
    参数指定另一个清单文件时更改。您还可以将此文件放在全局配置目录
    /etc/ansible/group\u vars
    中,而不是playbook中的目录
    /group\u vars
    (见我答案中的链接)。不回答文件中某些变量被加密而另一些变量未被加密的问题。如果您阅读了所有其他答案,您可以看到,不可能在单个文件中进行加密。看看这个答案,非加密变量存储在哪里?Ansible在变量位置和优先顺序方面非常灵活。请参阅。如果我们扩展上一个示例,我们可以(但不限于)这样做:
    -name:my ansible playbook hosts:127.0.0.1 vars_文件:-'vars.yml'-'unsecure.yml'-.
    其中unsecure.yml是另一个yaml文件,其中的vars没有被保险存储。您还可以使用
    vars:
    关键字直接将vars嵌入playbook中。换句话说,这是没有回答“如何加密某些变量”的问题。@RobinDaugherty您是否有一些见解可以帮助澄清您的声明?否则,为了响应您的声明,您将在希望“保管”的明文文件中放置一个密钥/值对。当您运行Ansible vault时,它会将该文件转换为加密密钥存储。有关详细信息,请参阅此处的RTFM:。一旦vault化,您可以像访问其他变量一样访问该变量,无论它在静止状态下是如何加密的。这意味着圣地亚哥是一个目录,而不是一个文件?确切地说,您可以使用san_diego.yml或san_diego/vars.yml,这就是same、 您正在寻找这个答案!@AdamMatan请将其标记为正确。网站上的最佳实践建议将文件命名为
    vars
    vault
    ,而不使用
    .yml
    后缀。在任何情况下
    vault.yml
    看起来都很奇怪,它是一个加密文件,而不是YAML文件。我认为这是一个比下面的解决方案更好的解决方案使用文件级加密更容易。在任何情况下,都要知道文件级加密和可变级别加密的优缺点,并明智地选择。我认为你还应该提到——询问保险库通行证,而不仅仅是——保险库密码文件是的,你说得对,谢谢!我们只使用——保险库密码文件,因为我们以自动化的方式与Jenkins一起运行剧本使用带有密码的文件比通过管道或提示传递密码更简单