Linux Ansible管理变量、管理事实、管理机密

目录

Ansible变量

变量定义范围

变量类型

定义变量并引用

事实变量与魔法变量

事实变量

魔法变量

Ansible加密

ansible-vault参数

ansible-vault举例


Ansible变量

Ansible支持利用变量来存储值,并且可以在Ansible项目的所有文件中重复使用这些值

变量可能包含下面这些值

       要创建的用户

       要安装的软件包

       要重新启动的服务

       要删除的文件

       要从互联网检索的存档

变量命名规则

变量的命名必须以字母开头,并且只能包含字母、数字和下划线组成(不能包含空格)

变量定义范围

可以在ansible项目中的多个位置定义变量,根据不同的位置可以将变量大致简化为三个范围

全局范围(高优先级):在命令行或Ansible配置变量的变量

Play范围(中优先级):在Playbook和相关结构中设置的变量

主机范围(低优先级):由清单inventory、事实收集facts或注册register的变量,在主机和个别主机上设置的变量

如果存在多个级别定义了相同名称的变量,则以高优先级的变量为准

变量类型

字符串类型

service_port: 80 或 service_port=80

数组类型

user:

       name:

              admin1

              admin2

       uid:

              1230

              1000

提取数组类型变量的两种方式

user.name    提取的变量为admin1和amdin2

user[‘name’]  提取的变量为admin1和admin2

定义变量并引用

全局范围:在playbook执行时定义变量并引用(此处定义字符串变量)

通过{ { }}引用变量(将变量名称放在花括号{ { }}中),通过-e定义变量

vim httpd.yml
---
- hosts: web
  tasks:
    - name: install {
    
    { package_name }} packages
      yum:
        name: "{
    
    { package_name }}"
        state: present       
    - name: modify firewalld rules
      firewalld:
        port: "{
    
    { service_port }}/tcp"
        immediate: yes
        permanent: yes
        state: enabled

ansible-playbook -e package_name=httpd -e service_port=80 httpd.yml

Play范围:在playbook内定义变量并引用(此处定义字符串变量)

通过vars定义变量,通过{ { }}引用变量(将变量名称放在花括号{ { }}中)

编写剧本并定义、引用变量
vim httpd.yml
---
- hosts: web
  vars:
    package_name: httpd
    service_port: 80
  tasks:
    - name: install {
    
    { package_name }} packages
      yum:
        name: "{
    
    { package_name }}"
        state: present     
    - name: modify firewalld rules
      firewalld:
        port: "{
    
    { service_port }}/tcp"
        immediate: yes
        permanent: yes
        state: enabled

执行剧本
ansible-playbook httpd.yml

Play范围:在playbook中指定外部文件作为变量文件并引用(通过 “{ { 变量名 }}” 引用变量)--(此处定义数组变量)

在playbook中使用var_files引用外部文件作为变量文件,通过{ { }}引用变量(将变量名称放在花括号{ { }}中)

在外部文件中定义变量
vim ~/ansible/users.yml
users:
  admin1:
    name: admin1
    uid: 1200

创建剧本,并引用外部变量文件
vim user_list.yml
---
- name: create users
  hosts: web
  vars_files:
    - users.yml
  tasks:
    - name: create user admin1
      user:
        name: "{
    
    { users.admin1.name }}"
        uid: "{
    
    { users['admin1']['uid'] }}"
        state: present

执行剧本
ansible-playbook user_list.yml

主机范围:在资产清单inventory文件内定义变量,然后在playbook中引用

给特定主机、主机组定义变量

在资产清单文件中定义变量
vim ~/ansible/inventory
[web]
node1

[ftp]
node2

[web:vars]   #为web主机组定义变量
package_name=httpd
service_port:=80

创建剧本文件并引用变量
vim httpd.yml
---
- hosts: web
  tasks:
    - name: install {
    
    { package_name }} packages
      yum:
        name: "{
    
    { package_name }}"
        state: present      
    - name: modify firewalld rules
      firewalld:
        port: "{
    
    { service_port }}/tcp"
        immediate: yes
        permanent: yes
        state: enabled

执行剧本,使用指定的资产清单(定义了变量的资产清单)
ansible-playbook -i ~/ansible/inventory httpd.yml

主机范围:使用已经注册的变量捕获命令输出

使用register语句进行捕获命令的输出(用于调试或其他目的)

使用debug模块将注册变量的值(由register获取到的值)存储到终端显示出来

即:查看register所对应模块的执行结果(通过json格式显示)

vim httpd.yml

---
- hosts: web
  tasks:
    - name: install httpd packages
      yum:
        name: httpd
        state: present
      register: yesok   
    - name: debug
      debug:
        var: yesok  或者 msg: "{
    
    { yesok }}"


事实变量与魔法变量

事实变量

Ansible管理事实是在受管主机上检测到的变量,是主机范围类型的变量;包含主机名、内核版本、IP地址等信息;我们借助事实变量能够方便的检测被管理主机的状态;

默认在执行第一个Playbok之前会借助setup模块收集受管主机的状态,并存放在ansible_facts默认变量中,格式是json格式

查看某个主机的事实变量

通过ansible 主机名 -m setup 查看此主机/主机组的事实变量

也可以通过debug模块来查看ansible_facts变量的值

通过变量名提取事实变量的值

提取方式同提取数组类型变量,都是两种方式(可以根据ansible 主机名 -m setup的输出结果来编写如何提取变量)

主机名:            ansible_facts['hostname'] 或 ansible_facts.hostname
完全有效域名:      ansible_facts['fqdn']  或 ansible_facts.fqdn
主要IPv4地址:      ansible_facts['default_ipv4']['address'] 或 ansible_facts. default_ipv4.address
/dev/vda的大小:    ansible_facts['devices'] ['vda']['size'] 或ansible_facts.devices.vda.size

如果不想去收集事实变量的话,可以做以下设置(可以加快剧本的运行)

在配置playbook时,加上gather_facts对象(与hosts同一层级)

gather_facts: no    yes表示会收集,no表示不会收集

魔法变量

魔法变量并不是事实变量,也不是通过setup模块配置的;是由Ansible自动设置的,可以用于获取特定受管主机的相关信息(Ansible内置变量)

常用魔法变量包含:

hostvars:包含受管主机的变量,用于获取另一台受管主机的变量的值
group_names:列出当前受管主机所属的所有组
groups:列出清单中的所有组和主机
inventory-hostname:包含清单中的当前受管主机的主机名称

可以通过debug模块来获取主机上的魔法变量

ansible 主机名 -m debug -a "var=hostvars.localhost"


Ansible加密

Ansible vault是ansible的一项功能,可以将敏感数据(密码或者密钥)保留在加密文件中,然后在ansible.cfg配置文件中的vault_password_file 字段指定加密文件的路径,此时就可以通过ansible-vault命令来创建、编辑、加密、解密和查看yml文件

ansible-vault参数

ansible-valut --ask-vault-pass       要求需要输入密码(在执行加密的Yml文件、检验加密的Yml文件的语法时需要使用此参数)
ansible-vault --vault-password-file 指定加解密所使用的加密文件(默认使用ansible.cfg中vault_password_file字段对应的文件作为加密文件)
ansible-vault creat              创建一个加密的yml文件(一般不推荐直接使用ansile-vault创建空的加密yml文件,一般是通过vim创建yml文件,然后再通过ansible.vault加密)
ansible-vault encrypt          对现有的yml文件进行加密
ansible-vault view           查看加密yml文件
ansible-vault edit                编辑加密的yml文件
ansible-vault decrypt          对现有的加密yml文件进行解密
ansible-vault rekey             对现有的yml文件更新密码(注意更新密钥时需要把ansible.cfg配置文件中的vault_password_file 字段给去掉或注释掉)

ansible-vault举例

配置加密文件并在ansible.cfg中指定

vim /home/greg/ansible/vault.yml
admin@123

vim ansible.cfg
vault_password_file = /home/greg/ansible/vault.yml

对现有的yml文件进行加密

ansible-vault encrypt httpd.yml

查看加密的yml文件

ansible-vault view httpd.yml

猜你喜欢

转载自blog.csdn.net/m0_49864110/article/details/130392902