• 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!!!
    }
    
    
  • 相关阅读:
    MIne FirstBlog
    P6563 [SBCOI2020]一直在你身旁
    P6563 [SBCOI2020]一直在你身旁
    T122085 [SBCOI2020]时光的流逝
    LC 918. Maximum Sum Circular Subarray
    1026 Table Tennis
    LC 1442. Count Triplets That Can Form Two Arrays of Equal XOR
    LC 1316. Distinct Echo Substrings
    LC 493. Reverse Pairs
    1029 Median (二分)
  • 原文地址:https://www.cnblogs.com/sawyer95/p/13597884.html
Copyright © 2020-2023  润新知