• 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!!!
    }
    
    
  • 相关阅读:
    迭代器接口
    实现Promise
    学学springboot吧!!!!
    了解一下连接池!!!!
    Tomcat version 6.0 only supports J2EE 1.2, 1.3, 1.4, and Java EE 5 Web modules ???报错!!!
    requset和response的区别????
    百度也太神奇了吧
    这个svn啊,真的是有点看不懂
    BootStrap???确实厉害
    突然看到原来除了jar包还有war包啊?????
  • 原文地址:https://www.cnblogs.com/sawyer95/p/13597884.html
Copyright © 2020-2023  润新知