• Ansible_管理机密


    一、Ansible Vault

    1、什么是Ansible Vault

    • Ansible提供的Ansible Vault可以加密和解密任何由Ansible使用的结构化数据文件
    • 若要使用Ansible Vault,可通过一个名为ansible-vault的命令行工具创建、编辑、加密、解密和查看文件
    • Ansible Vault可以加密任何由Ansible使用的结构化数据文件。
      • 包括清单变量、playbook中含有的变量文件、以及在执行playbook时作为参数传递的变量文件,或者Ansible角色中定义的变量

    2、使用ansible-vault创建加密文件

    1️⃣:用ansible-vault filename命令创建加密的文件,该命令在执行时会提示输入新的vault密码,然后利用默认编辑器vi打开文件

    • 演示实例:
      [root@localhost project]# ansible-vault create playbook.yaml
      New Vault password:        //输入密码
      Confirm New Vault password:     //再次输入密码
      [root@localhost project]# cat playbook.yaml 
      $ANSIBLE_VAULT;1.1;AES256
      30613061633963633139383032353436386231646364366436613736346432313435613439353833
      3761386338616239613065323934653637393833633862330a366532343533343838396561336366
      36636630313930623463656431663736303336653833653235663931376234366431386534363966
      3236326565623739620a326264613365376163333663613136343931323466373333303366323434
      32356530633865623935613434663337646661356465343866333862373431646339
        //已经加密

    2️⃣:使用vault密码文件来存储vault密码,而不是通过标准输入途径输入vault密码,这样做需要使用文件权限和其他方式来严密保护该文件

    • 演示实例:
       //首先创建密码文件
      [root@localhost project]# cat password 
      123456
      [root@localhost project]# chmod 600 password 
      [root@localhost project]# ll
      total 4
      -rw------- 1 root root 7 Sep  2 02:05 password
      
       //创建加密的YAML文件
      [root@localhost project]# ansible-vault create --vault-password-file=./password example.yaml
      [root@localhost project]# cat example.yaml 
      $ANSIBLE_VAULT;1.1;AES256
      65623133336639346338396639623239336435633037303265353231383035356163656262646431
      3536633038363832363336306236313839343330363661390a656530376439373434393435353263
      63623536623564366630373438656537386431386362323534363332653035653663646662653537
      6139313566363732640a353232323633303064373430396365353865653231323962373864653038
      3836
        //已经加密

    3、查看已经加密的文件

    1️⃣:使用ansible-vault view filename命令查看Ansible Vault加密的文件,而不必打开它进行编辑

    • 演示实例:
       //查看已经加密的YAML文件
      [root@localhost project]# cat playbook.yaml 
      $ANSIBLE_VAULT;1.1;AES256
      33393839353335326235666163306639353236616564366137326632666464643733336661313261
      3333636239393734323233326165616238353338386665330a353439363266346532396138343866
      63393038623139363663373635626662383533656531383139373039316562313835383138386632
      3637303261316631320a383034656461366630316430643733376637653134383131386238666139
      64316361303763613762636437666263353965346561343635303236613366666264323736623663
      39646432633364383437386237336638386463313337313431626338653261653631646538316630
      63623935333436643232376562666562343761313061626162396131633635326635386662353065
      64393232363731383136643839636137346239396164353038666564666466643038333539313861
      38643934646565393635323862366462333465373034313331393665343832383934326330306438
      3338376365613361313766316233333435353366393639653033
      
       //查看文件内容
      [root@localhost project]# ansible-vault view playbook.yaml 
      Vault password:      //输入加密的密码
      ---
      - name: test files
        hosts: all
        tasks:
          - name: install httpd
            yum:
             name: httpd
             state: present  

    4、编辑已经加密的文件

    1️⃣:Ansible Vault提供ansible-vault edit filename命令继续编辑已经加密文件;工作时将文件解密为一个临时文件,并允许编辑;保存时,它将复制其内容并删除临时文件

    • 演示实例:
       //查看已经加密文件内容
      [root@localhost project]# ansible-vault view playbook.yaml 
      Vault password: 
      ---
      - name: test files
        hosts: all
        tasks:
          - name: install httpd
            yum:
             name: httpd
             state: present
      
       //继续添加内容
      [root@localhost project]# ansible-vault edit playbook.yaml 
      Vault password:         //输入加密时的密码
      [root@localhost project]# ansible-vault view playbook.yaml 
      Vault password:          //输入密码
      ---
      - name: test files
        hosts: all
        tasks:
          - name: install httpd
            yum:
             name: httpd
             state: present
          
          - name: start httpd
            service:
              name: httpd
              state: started

     5、加密和解密现有的未加密的文件

    1️⃣:使用ansible-vault encrypt filename加密现有的未加密的文件;此命令可以一次加密多个现有的未加密文件

    • 其次还可以使用--output选项将需要加密的文件加密后另存为具有新名称的文件,一次只能有一个输入文件
      • ansible-vault encrypt playbook.yaml --output=test.yaml

    2️⃣:使用anisble-vault decrypt filename解密现有的已经加密的文件,并且是永久解密

    • 解密也可以是使用--output选项,在解密单个文件时加改选项将解密文件以另一个新名称来保存文件
      • ansible-vault decrypt playbook.yaml --output=test.yaml

    3️⃣:演示实例:

     //查看两个现有的未加密的文件
    [root@localhost project]# cat playbook.yaml     
    ---
    - name: test files
      hosts: all
      tasks:
        - name: install httpd
          yum:
           name: httpd
           state: present
    
     //加密该文件
    [root@localhost project]# ansible-vault encrypt playbook.yaml 
    New Vault password:        //输入密码
    Confirm New Vault password:        //再次输入密码
    Encryption successful
    [root@localhost project]# cat playbook.yaml 
    $ANSIBLE_VAULT;1.1;AES256
    34613930356665386565313263616638666464303837633561633866353166653865636238333833
    6430346665376264343434346233663666373064383764300a646265613630643335353930396534
    35613339326263313465343637393331323461336562313335353766343161623738393965376234
    3462373363323934620a616330373036346564323763333030356332353864616464303236353336
    33636231386531363538346134636336613238316565373235663366656538376234656132303735
    61353766633562353933313731323662616530363462656433373565663532666233386236383739
    31663136336630663532613736666462643033383034313463343632316638356136363833353138
    31363134396532623937373232306435303362386639663865333064353162373634623238353837
    31373733356334366562373863663736383132646432363037326161396666366437376463363564
    6133336438666333373037623464383962306366316432336463
    
     //解密
    [root@localhost project]# ansible-vault decrypt playbook.yaml 
    Vault password:      //输入刚刚加密设置的密码
    Decryption successful
    [root@localhost project]# cat playbook.yaml 
    ---
    - name: test files
      hosts: all
      tasks:
        - name: install httpd
          yum:
           name: httpd
           state: present
    

    6、更改已经加密文件的密码

    1️⃣:使用ansible-vault rekey filename 命令更改已经加密文件的密码;此命令一次可以更改多个已经加密文件密码;并且需要提供原始密码

    • 演示实例:
       //查看已经加密的文件
      [root@localhost project]# ansible-vault view playbook.yaml 
      Vault password:       //此处我设置的密码是123456
      ---
      - name: test files
        hosts: all
        tasks:
          - name: install httpd
            yum:
             name: httpd
             state: present
      
       //更改密码为654321
      [root@localhost project]# ansible-vault rekey playbook.yaml 
      Vault password:       //输入原始密码123456
      New Vault password:        //输入更改的密码654321
      Confirm New Vault password:     //再次输入更改的密码654321
      Rekey successful

    2️⃣:除此之外还可以使用vault文件作为面密码:使用--new-vault-password-file选项指定更改的密码

    • 演示实例:
       //创建vault维纳
      [root@localhost project]# cat new_password 
      123456
      
       //更改密码
      [root@localhost project]# ansible-vault rekey --new-vault-password-file=./new_password playbook.yaml 
      Vault password:   //输入原始密码
      Rekey successful  

     二、Playbook和Ansible vault

    1、执行ansible-playbook与交互密码

    1️⃣:通过Ansible Vault加密的文件的playbook,需要向ansible-playbook命令提供加密密码

    2️⃣:为playbook提供vault密码,可使用--vault-id选项,以交互方式提供vault密码

    • 演示实例:
      [root@localhost project]# ansible-playbook --vault-id @prompt playbook.yaml -C     //prompt:提示的意思,提示输入default密码
      Vault password (default): 
      
      PLAY [test files] *********************************************************************************************************************************************************
      
      TASK [Gathering Facts] ****************************************************************************************************************************************************
      ok: [client.example.com]
      
      TASK [create user] ********************************************************************************************************************************************************
      changed: [client.example.com]
      
      PLAY RECAP ****************************************************************************************************************************************************************
      client.example.com         : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

     3️⃣:此外,也可以使用--vault-password-file选项指定密码文件;密码应当在该文件中存储为一行字符串

    • 演示实例:
      [root@localhost project]# ansible-playbook --vault-password-file=./password playbook.yaml -C
      
      PLAY [test files] *********************************************************************************************************************************************************
      
      TASK [Gathering Facts] ****************************************************************************************************************************************************
      ok: [client.example.com]
      
      TASK [create user] ********************************************************************************************************************************************************
      changed: [client.example.com]
      
      PLAY RECAP ****************************************************************************************************************************************************************
      client.example.com         : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

    4️⃣:也可以使用ANSIBLE_VAULT_PASSWORD_FILE环境变量,指定密码文件的默认位置

    5️⃣:从Ansible2.4开始,可以通过ansible-playbook使用多个Ansible Vault密码。要使用多个密码,需要将多个--vault-id--vault-password-file选项传递给ansible-playbook命令

    • 演示实例:
      [root@localhost project]# ansible-playbook --vault-id 1@prompt playbook.yaml -C
      Vault password (1): 
      
      PLAY [test files] *********************************************************************************************************************************************************
      
      TASK [Gathering Facts] ****************************************************************************************************************************************************
      ok: [client.example.com]
      
      TASK [create user] ********************************************************************************************************************************************************
      changed: [client.example.com]
      
      PLAY RECAP ****************************************************************************************************************************************************************
      client.example.com         : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0     
    •  
      注意:
          1、@prompt前面的vaultID,数字1可以是任何字符,甚至可以完全省略它们
          2、如果在使用ansible-vault命令加密文件时,使用--vault-id 选项,则在运行ansible-playbook时,将最先尝试匹配vaultID的密码;如果不匹配,将会尝试用户提供的其他密码
          3、没有ID的vaultID@prompt实际上是default@prompt的简写,这意味着提示输入vaultIDdefault的密码
      说明信息

    2、变量文件最值得推荐的做法

    1️⃣:简化管理,务必要设置Ansible项目,使敏感变量和其他变量保存在相互独立的文件中;包含敏感变量的文件可通过ansible-vault命令进行保护

    2️⃣:管理组变量和主机变量的首选方式是在playbook级别上创建目录;

    • group_vars目录通常包含名称与它们所应用的主机组匹配的变量文件
    • host_vars目录通常包含名称与它们所应用的受管主机名称匹配的变量文件

    3️⃣:Playbook变量(与清单变量相对)也可通过Ansible Vault加密保护;敏感的playbook变量可以放在单独的文件中,此文件通过Ansible Vault加密,并且vars_files指令包含在该playbook

    4️⃣:如果需要在playbook中使用多个vault密码,请确保每个加密文件分配一个vaultID,并在运行playbook时输入具有该vaultID的匹配密码

  • 相关阅读:
    年终总结
    javascript高级编程笔记05(面向对象)
    angularApi网站用vue重构
    js闭包的理解
    2014/12/23 四川 晴
    (转)sql的join图解
    JavaScript面向对象程序设计:数组
    JS中的原型继承机制
    技术感慨篇 四川 阴
    2014/11/14 绵阳 阴
  • 原文地址:https://www.cnblogs.com/itwangqiang/p/13597704.html
Copyright © 2020-2023  润新知