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的匹配密码

原文地址:https://www.cnblogs.com/itwangqiang/p/13597704.html