管理机密、事实

1.管理机密

Ansible提供的Ansible Vault可以加密和解密任何由Ansible使用的结构化数据文件,可通过一个名为ansible-vault的命令行工具创建、编辑、加密、解密和查看文件。

1.1 ansible-vault的用法

命令用法
ansible-vault create [文件名]创建一个加密文件
ansible-vault view [文件名]查看加密文件的内容,但是要输入密码
ansible-vault edit [文件名]编辑现有的加密文件内容,编辑时需要输入密码
ansible-vault encrypt [文件名]给现有的文件进行加密
ansible-vault decrypt [文件名]解密现有的文件
ansible-vault rekey [文件名]更改加密文件的密码
  • 创建加密文件:create
[root@localhost ansible]# ansible-vault create vault.yml 
New Vault password: 
Confirm New Vault password: 

//此时查看文件内容都是乱码
[root@localhost ansible]# cat vault.yml 
$ANSIBLE_VAULT;1.1;AES256
66666234663461313764636534383432646263643331653339346535363835613739336532336135
6461616463353435376330333838323836313736643139640a366162326161383264666132383833
64366463633062623565663132623437663539386638633036663830336563313536323663333637
3739303238313534380a663837663435613034663334346435376363616530353436663339366430
30653334366361616536343435346466373166313961633933383763656630623438386664353630
3934333936373734343136366263363661333861356335653435

我们还可以用vault密码文件来存储vault密码,而不是通过标准输入途径输入vault密码。

//创建一个加密文件test,加密的密码放在.lamp
[root@localhost ansible]# vim .lamp
[root@localhost ansible]# ansible-vault create --vault-password-file=.lamp playbook/vars/service_vars.yml
  • 查看加密的文件: view
//第一种在输入界面输入加密密码
[root@localhost ansible]# ansible-vault view vault.yml 
Vault password: 	//输入加密密码
ansbile_user=root
ansible_passwd=123123

//第二种无需输入密码,--vault-password-file指向存储加密文件的vault密码的文件
[root@localhost playbook]# ansible-vault view --vault-password-file=/etc/ansible/.lamp vars/service_vars.yml 
install_service: 
  - httpd* 
  - mariadb* 
  - php* 
start_service: 
  - httpd.service 
  - mariadb.service 
  - php-fpm
  • 编辑现有的加密文件: edit
    edit子命令始终重写文件,因此只应在进行更改时使用它。
//第一种在输入界面输入加密密码
[root@localhost ansible]# ansible-vault edit vault.yml 
Vault password: 	//输入加密的密码

//第二种无需输入加密密码,--vault-password-file指向存储加密文件的vault密码的文件
[root@localhost ansible]# ansible-vault edit --vault-password-file=.lamp playbook/vars/service_vars.yml 
  • 给现有的文件进行加密:encrypt
    此命令可取多个欲加密文件的名称作为参数。
    使用-‌-output=OUTPUT_FILE选项,可将加密文件保存为新的名称。
[root@localhost ansible]# ansible-vault encrypt abc 
New Vault password: 	//设置密码
Confirm New Vault password: 
Encryption successful

//--output选项
[root@localhost ansible]# ansible-vault encrypt test1 --output=test2
New Vault password: 						//test1为需要加密文件,test2为加密后的新命名文件
Confirm New Vault password: 
  • 解密现有的文件:decrypt
    在解密单个文件时,可使用-‌-output选项以其他名称保存解密的文件。
[root@localhost ansible]# ansible-vault decrypt abc 
Vault password: 
Decryption successful

//--output选项
[root@localhost ansible]# ansible-vault decrypt test --output=test03	
Vault password: 								//test为需要解压的文件,test03为解压后新命名文件
Decryption successful
  • 更改加密文件的密码
    ansible-vault rekey filename,此命令可一次性更新多个数据文件的密钥。
[root@localhost ansible]# ansible-vault rekey test1
Vault password: 		//旧密码
New Vault password: 		//输入新密码
Confirm New Vault password: 
Rekey successful

1.2 ansible-vault在playbook中的使用

要运行可访问通过Ansible Vault加密的文件的playbook,需要向ansible-playbook命令提供加密密码。

  • 以交互方式提供vault密码,-‌-vault-id
ansible-playbook --vault-id @prompt site.yml
  • 使用–vault-password-file选项指定以纯文本存储加密密码的文件
[root@localhost vars]# cat user_yml 	//创建变量文件
user: 
  name: akl 
  uid: 7777
[root@localhost vars]# cat .user		//创建加密文件
123

[root@localhost ansible]# ansible-vault encrypt --vault-password-file=playbook/vars/.user playbook/vars/user_vars.yml
Encryption successful			//--vault-password-file指定加密文件给变量文件加密

[root@localhost playbook]# cat user.yml	//创建playbook文件
---
- name: create user
  hosts: all
  gather_facts: no		//关闭获取事实
  vars_files: 			//指定变量文件位置
    - /etc/ansible/playbook/vars/user_vars.yml 
  tasks: 
    - name: "{{ user_name }}"   //引用变量
      user: 
        name: "{{ user_name }}"  //引用变量
        uid: "{{ user_uid }}"	引用变量
        state: present
   
 //指定加密文件位置运行playbook     
[root@localhost ansible]# ansible-playbook --vault-password-file=playbook/vars/.user playbook/user.yml 

PLAY [create user] **************************************************************************************

TASK [akl] **********************************************************************************************
changed: [localhost]

PLAY RECAP **********************************************************************************************
localhost                  : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

2.管理事实

2.1 事实介绍

Ansible事实是Ansible在受管主机上自动检测到的变量。
事实包括:主机名称、内核版本、网络接口、IP地址、操作系统版本等 。

ansible_facts是系统定义过的变量,直接可以使用。可以显示对面主机的ip、CPU、内核、Python版本等。

---
- name: facts
  hosts: all
  tasks:
    - name:
      debug:
       var: ansible_facts

借助事实,可以方便地检索受管主机的状态,并根据该状态确定要执行的操作。例如:

  • 可以根据含有受管主机当前内核版本的事实运行条件任务,以此来重启服务器
  • 可以根据通过事实报告的可用内存来自定义MySQL配置文件
  • 可以根据事实的值设置配置文件中使用的IPv4地址

Ansible事实的示例

事实变量
短主机名ansible_facts[‘hostname’]
完全限定域名ansible_facts[‘fqdn’]
IPv4地址ansible_facts[‘default_ipv4’][‘address’]
所有网络接口的名称列表ansible_facts[‘interfaces’]
/dev/vda1磁盘分区的大小ansible_facts[‘devices’][‘vda’][‘partitions’][‘vda1’][‘size’]
DNS服务器列表ansible_facts[‘dns’][‘nameservers’]
当前运行的内核版本ansible_facts[‘kernel’]
[root@localhost ansible]# cat facts.yml 
---
- hosts: all
  tasks:
  - name: Prints various Ansible facts
    debug:
      msg: >
        The default IPv4 address of {{ ansible_facts.fqdn }}
        is {{ ansible_facts.default_ipv4.address }}
        
[root@localhost ansible]# ansible-playbook facts.yml 

PLAY [all] **********************************************************************************************

TASK [Gathering Facts] **********************************************************************************
ok: [localhost]

TASK [Prints various Ansible facts] *********************************************************************
ok: [localhost] => {
    "msg": "The default IPv4 address of localhost.localdomain is 192.168.237.167\n"
}

PLAY RECAP **********************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

2.2 Ansible事实作为变量注入

在Ansible2.5之前,事实是作为前缀为字符串ansible_的单个变量注入,而不是作为ansible_facts变量的一部分注入。例如,ansible_facts[‘distribution’]事实会被称为ansible_distribution。

使用临时命令来运行setup模块,以此形式显示所有事实的值

ansible 172.16.103.129 -m setup

选定的Ansible事实名称比较

ansible_facts形式旧事实变量形式
ansible_facts[‘hostname’]ansible_hostname
ansible_facts[‘fqdn’]ansible_fqdn
ansible_facts[‘default_ipv4’][‘address’]ansible_default_ipv4[‘address’]
ansible_facts[‘interfaces’]ansible_interfaces
ansible_facts[‘devices’][‘vda’][‘partitions’][‘vda1’][‘size’]ansible_devices[‘vda’][‘partitions’][‘vda1’][‘size’]
ansible_facts[‘dns’][‘nameservers’]ansible_dns[‘nameservers’]
ansible_facts[‘kernel’]ansible_kernel

2.3 创建自定义事实

除了使用系统捕获的事实外,我们还可以自定义事实,并将其本地存储在每个受管主机上。这些事实整合到setup模块在受管主机上运行时收集的标准事实列表中。它们让受管主机能够向Ansible提供任意变量,以用于调整play的行为。

自定义事实可以在静态文件中定义,格式可为INI文件或采用JSON。它们也可以是生成JSON输出的可执行脚本,如同动态清单脚本一样。

有了自定义事实,我们可以为受管主机定义特定的值,供play用于填充配置文件或有条件地运行任务。动态自定义事实允许在play运行时以编程方式确定这些事实的值,甚至还可以确定提供哪些事实。

默认情况下,setup模块从各受管主机的/etc/ansible/facts.d目录下的文件和脚本中加载自定义事实。各个文件或脚本的名称必须以.fact结尾才能被使用。动态自定义事实脚本必须输出JSON格式的事实,而且必须是可执行文件。

以下是采用INI格式编写的静态自定义事实文件。INI格式的自定义事实文件包含由一个部分定义的顶层值,后跟用于待定义的事实的键值对:

[packages]
web_package = httpd
db_package = mariadb-server

[users]
user1 = joe
user2 = jane

同样的事实可能以JSON格式提供。以下JSON事实等同于以上示例中INI格式指定的事实。JSON数据可以存储在静态文本文件中,或者通过可执行脚本输出到标准输出:

{
  "packages": {
    "web_package": "httpd",
    "db_package": "mariadb-server"
  },
  "users": {
    "user1": "joe",
    "user2": "jane"
  }
}

自定义事实文件不能采用playbook那样的YAML格式。JSON格式是最为接近的等效格式。

自定义事实由setup模块存储在ansible_facts.ansible_local变量中。
事实按照定义它们的文件的名称来整理。例如,假设前面的自定义事实由受管主机上保存为/etc/ansible/facts.d/custom.fact的文件生成。在这种情况下,ansible_facts.ansible_local[‘custom’][‘users’][‘user1’]的值为joe。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值