Ansible——变量,机密和事实

ansible变量

变量名的定义

  1. 变量名应该由字母、数字、下划线组成
  2. 变量名需要以字母开头
  3. ansible内置的关键字不能作为变量名

定义变量的三个范围级别

  • 全局范围:从命令行或 ansible 配置设置的变量
  • play 范围:在 play 和相关结构中设置的变量
  • 主机范围:由清单、事实收集或注册的任务,在主机组和个别主机上设置的变量
    注意:如果多个级别上定义了相同名称的变量,优先采用级别最高的变量,窄范围优先于广范围

变量的实现方式

playbook定义变量

name: test
  hosts: 192.168.190.133
  vars:
    test_user: zhangsan     对test_user变量赋值
  tasks:
    - name: add user
      user:
        name: '{{ test_user }}'   定义变量,变量名为:test_user
        state: present

命令行中赋值变量

[root@localhost project]# ansible-playbook -i inventory -e 'test_user=zhangsan' playbook/ceshi1.yml       -e 选项后把zhangsan赋值给变量test_user。

在外部文件定义playbook变量

注意:编写外部变量文件时,注意此文件和playbook最好在同一目录

[root@localhost project]# [root@localhost project]# vim files/vars 
port_name: 81
service1_name: web_1
service2_name: web_2


[root@localhost project]# vim apache_server.yml
---
- name: 配置yum与apache
  hosts: 192.168.190.133
  vars_files:
    - files/vars     指定外部变量文件

register 变量注册

对playbook中的某一任务的结果存入到变量中,其后用debug模块调用此变量。

[root@localhost project]# vim playbook/ceshi1.yml 
---
- hosts: 192.168.190.134
  tasks: 
          
    - name: yum install and register
      yum:
        name: vsftpd
        state: present
      register: install_log         新建install_log变量,并把yum安装输出内容赋值其中。
    - debug: var=install_log     输出变量中内容
    
    
TASK [debug] *******************************************************************
ok: [192.168.190.134] => {
    "install_log": {
        "changed": true,
        "failed": false,
        "msg": "Check mode: No changes made, but would have if not in check mode",
        "rc": 0,
        "results": []
    }
}
......

使用变量

将变量名称放在双花括号内即可
注意:当变量用作开始一个值的第一元素时,必须使用引号

- name: 创建配置主页文件
      shell: cd /var/www/html && mkdir {{ service1_name }} {{ service2_name }}
    - copy:
        src: files/index1.html
        dest: /var/www/html/{{ service1_name }}/index.html
.....

变量分类

  • 主机变量(host_vars)
    应用于特定主机
  • 组变量 (group_vars)
    应用于一个主机组或一组主机组中的所有主机
    主机变量优先于组变量,但是 playbook 中定义的变量比这两者更高。

常见配置方法

步骤:
(1)创建 group_vars和 host_vars 两个目录,这两个目录分别包含用于定义组变量和主机变量的文件
(2)在 host_vars/group_vars 目录中创建名称与主机/组名匹配的文件来存放变量

创建 group_vars和 host_vars 两个目录时,要与inventory(清单)文件相同目录下创建。

所以一个项目目录中最起码包含:group_vars、host_vars、inventory、playbook.yml

.
├── apache_server.yml
├── files
│   ├── CentOS-Base.repo
│   ├── index1.html
│   ├── index2.html
│   └── vars
├── group_vars
├── host_vars
│   └── 192.168.190.133           创建时必须与被控机IP一致。
│       ├── vars
│       └── vault
├── inventory
└── template
    └── vhosts.j2

ansible机密

当我们写的 playbook 中涉及敏感信息,如:数据库账号密码;主机账号密码。这时为了防止这些敏感信息泄露,就可以使用 vault 进行加密。

ansible-vault 命令行操作

创建加密文件

  • ansible-vault create

此种方式生成的加密密码需要自己记住,优点在于在系统中没有痕迹。

缺点在于需要手动输入密码,操作较繁琐。

[root@localhost project]# ansible-vault create host_vars/192.168.190.133/vault2
New Vault password: 
Confirm New Vault password:

root@localhost project]# vim host_vars/192.168.190.133/vault2   vault2已加密
$ANSIBLE_VAULT;1.1;AES256
643533396434366633326135643830636632313765613662656536386536326165366434
35393938
3436343939303131303062343336313665666237303465640a3
......

对加密的密码进行保护并创建加密文件

此种加密的方式优点在于不用每次都手动输入密码,系统会直接读取配置好的密码文件中的密码。

缺点在于系统中存在密码文件。安全系数下降。

[root@localhost project]# vim .va_key 先准备好自己的加密密码。
123456

[root@localhost project]# ansible-vault create --vault-password-file=.va_key host_vars/192.168.190.133/vault2   创建加密文件vault2,并指向此文件的加密密码为.va_key中的内容。

[root@localhost project]# vim    加密成功 host_vars/192.168.190.133/vault2
$ANSIBLE_VAULT;1.1;AES256
353163393762613439326665626164376233623863653766356163336533626533363437
32373665
......

解密文件

  • ansible-vault view 查看加密的文件名

  • ansible-vault edit 编辑加密的文件名

[root@localhost 192.168.190.133]# ansible-vault view vault2
Vault password:   需要输入加密的密码
key=123456

[root@localhost 192.168.190.133]# ansible-vault edit vault2
Vault password:   用edit编辑之后,默认用vim打开,可以进行编辑。
key=123456

对已存在的文件进行加密

  • ansible-vault encrypt
[root@localhost 192.168.190.133]# vim vault2
key=123   新建文件

[root@localhost 192.168.190.133]# ansible-vault encrypt vault2
New Vault password:        需要设置加密的密码
Confirm New Vault password: 
Encryption successful    

对已加密的问及那进行解密

  • ansible-vault decrypt
[root@localhost 192.168.190.133]# ansible-vault decrypt vault2   
Vault password:   需要输入加密的密码进行解密 
Decryption successful

对加密的密码进行修改

  • ansible-vault rekey
[root@localhost 192.168.190.133]# ansible-vault rekey vault2    对vault2修改加密的密码。
Vault password: 
New Vault password: 
Confirm New Vault password: 
Rekey successful


playbook 与 ansible vault

  • ansible-playbook --vault-id @prompt

id 后面的内容可选写。默认为default

[root@localhost playbook]# ansible-playbook --vault-id @prompt ceshi1.yml -i /project/inventory    直接在playbook命令行中输入文件的加密的密码。
Vault password (default): 

PLAY [192.168.190.133] *********************************************************************************

PLAY RECAP *********************************************************************************************
192.168.190.133            : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

变量文件管理的推荐做法

把单独需要加密的内容单独生成一个文件。方便加密文件的管理。通常我们以一个项目为一个主体。

  • group_vars:管理主机组的变量
  • hosts_vars:管理主机的变量
    • 争对每个主机可以新建一个变量目录,下面可分贝存放加密与不加密的变量文件
  • inventory: 被控机的存放清单。执行playbook时-i指定清单。
  • playbook: 这个project中的playbook存放位置。
[root@localhost project]# tree .
.
├── files
├── group_vars
├── host_vars
│   └── 192.168.190.133
│       ├── vars
│       └── vault
├── inventory
└── playbook
    └── ceshi1.yml

ansible事实(facts)

主控机连接被控机后,被控机上对应生成的变量称之为事实。

常见事实包括:主机名称、内核版本、网络接口、IP 地址等

查看被控机事实

使用filter可以筛选指定的facts

  • 方法1: Ad-hoc调用对应模块查看
[root@localhost project]# ansible 192.168.190.133 -m setup

192.168.190.133 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "192.168.190.133"
        ],
        "ansible_all_ipv6_addresses": [
            "fe80::a1fe:e941:fbaf:43cc"
        ],
        "ansible_apparmor": {
......

[root@localhost project]# ansible 192.168.190.133 -m setup -a 'filter=hostname'     查看指定的facts
192.168.190.133 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false
}


  • 方法2:playbook利用debug模块查看事实
[root@localhost project]# vim ceshi1.yml 
---
- hosts: 192.168.190.133
  tasks:
    - name: view facts
      debug:
        var: ansible_facts   

动态调用被控机事实

debug模块的msg可以打印自定义信息。

例如:{{ ansible_facts.all_ipv4_addresses }}即可获取事实中ipv4的地址信息。

[root@localhost project]# !vim
vim ceshi1.yml 
---
- hosts: 192.168.190.133
  tasks:
    - name: view facts
      debug:
        msg:
          The IPV4 address of {{ ansible_facts.all_ipv4_addresses }}

效果见下:

TASK [view facts] **************************************************************************************
ok: [192.168.190.133] => {
    "msg": "The IPV4 address of ['192.168.190.133']"                   
}

关闭事实

vim ceshi1.yml 
---
- hosts: 192.168.190.133
  gather_facts: no                某些情况为了提升系统处理效率,可关闭事实。
  tasks:
    - name: view facts
      debug:
        msg:
          The IPV4 address of {{ ansible_facts.all_ipv4_addresses }}

自定义事实

注意:创建自定义事实时,最好在目录 /etc/ansible/facts.d下创建,并且事实必须以.fact结尾

如果没有此目录可手动新增,或者在主控机上编写playbook进行新建。

"ansible_local": {
            "ceshi": {
                "customize": {
                    "group": "sawyer",
                    "url": "baidu.com",
                    "user": "sawyer"
                }
            }
        },

效果见下:

- hosts: 192.168.190.133
  tasks:
    - name: view facts
      debug:
        msg:
          The host url of {{ ansible_facts['ansible_local']['ceshi']['cu
stomize']['url'] }}                           取对应自定义事实的值


ok: [192.168.190.133] => {
    "msg": "The host url of baidu.com"           OK!!!
}

posted @ 2020-09-01 18:50  阿不思布丁  阅读(300)  评论(0编辑  收藏  举报