Ansible中的变量和加密
- 1 变量的命名
- 2 变量的级别
- 3. 变量设定和使用方式
- 3.1 在playbook中直接定义变量和使用
- 3.2 在文件中定义的变量和使用
- 5 目录设定变量
- 5.1 清单变量
- 5.2 主机变量
- 6 用命令覆盖变量
- 7 使用数组设定变量
- 8 注册变量
- 9 事实变量
- 10 魔法变量
- 11 加密文件
- 10 魔法变量
1 变量的命名
- 变量名只能包含数字、下划线、字母,并且不能以数字开头
2 变量的级别
全局:从命令行或配置文件中设定
play:在play和相关结构中设定的
主机:有清单,实时收集或注册的任务
变量优先级的设定:狭窄范围有限与广域
3. 变量设定和使用方式
3.1 在playbook中直接定义变量和使用
- 编辑playbook文件,变量直接定义在文件中
---
- name: create user
hosts: list1
vars:
USER: west
tasks:
- name: creat user
user:
name: "{{USER}}" ##变量的使用
state: present
...
- 测试
3.2 在文件中定义的变量和使用
- 编辑存放变量的文件:文件名以.yml结尾
(1) 方式一
- 编辑playbook文件
---
- name: create user
hosts: list1
vars_files:
- /mnt/user.yml ##定义变量文件的路径
tasks:
- name: create user
user:
name: "{{USER}}" ##变量的使用
state: present
...
- 测试
(2)方式二
- 编辑playbook文件
---
- name: delete user
hosts: list1
vars_files: /mnt/user.yml ##定义变量的文件
tasks:
- name: delete user
user:
name: "{{USER}}" ##变量的使用
state: absent
...
- 测试
4 设置主机变量和清单变量
在定义主机变量和清单变量时使用
(1)在清单文件中定义变量
[list1 :vars] ##定义针对list1中主机名或ip的变量
USER=testuser
(2)playbook文件的编写
---
- name: create user
hosts: list1
tasks:
- name: create user
user:
name: "{{USER}}"
state: present
...
(3) 测试
5 目录设定变量
实验前的准备
(1)查看清单文件:cat /ansible/inventory
(2)playbook文件的编写
---
- name: create user
hosts: list1 ##不用设定
tasks:
- name: create user
user:
name: "{{USER}}"
state: present
...
5.1 清单变量
- group_vars :清单变量,目录中的文件名称必须与主机清单名称一致
mkdir /ansible/group_vars
touch /ansible/group_vars/list1
(1)在list1文件中定义针对list1的清单变量:
(2)测试
5.2 主机变量
- host_vars :主机变量,目录中文件的名称必须和ip和主机名称一致
mkdir /ansible/host_vars
1 当清单文件list中的主机是ip
(1)创建/ansible/host_vars/172.25.254.10文件,并编辑文件中变量
touch /ansible/host_vars/172.25.254.10
(2)查看清单文件
(3)playbook文件
---
- name: create user
hosts: list1 ##不用设定
tasks:
- name: create user
user:
name: "{{USER}}"
state: present
...
(2)测试
2 当清单文件list中的主机是主机名(1)查看清单文件
(2)编辑/etc/hosts文件,域名解析
(3)playbook文件
---
- name: delete user
hosts: list1
tasks:
- name: delete user
user:
name: "{{USER}}"
state: absent
...
(4)测试
6 用命令覆盖变量
(1)在playbook文件中定义变量
---
- name: appache
hosts: list1
vars:
test: westos
tasks:
- copy:
content: "{{test}}"
dest: /mnt/hosts
...
(2)测试
- 直接执行playbook
ansible-playbook test2.yml
- 命令覆盖变量,执行playbook
ansible-playbook test2.yml -e "test=linux"
(3)playbook文件中没有定义变量,可以用命令覆盖变量
---
- name: appache
hosts: list1
tasks:
- copy:
content: "{{test}}"
dest: /mnt/hosts
...
测试:
ansible-playbook test2.yml -e "test=westos"
7 使用数组设定变量
编辑变量文件:user_var.yml
user:
user1:
name: tom
age: 18
user2:
name: mary
age: 13
---
- name: show user
hosts: list1
vars_files: ./user_var.yml
tasks:
- shell:
echo "{{user['user1']['name']}} {{user['user1']['age']}}" ##推荐使用
##echo "{{user.user1.name}} {{user.user1.age}}"
echo "{{user['user2']['name']}} {{user['user2']['age']}}"
...
测试
8 注册变量
register:把模块输出到指定字符串中
---
- name: test register
hosts: list1
tasks:
- shell:
hostname
register: westos
- debug:
msg: "{{westos['stdout']}}"
...
9 事实变量
- 事实变量是ansible在受控主机中自动检测出的变量,事实变量中还有与主机相关的信息,当需要使用主机相关的信息时不需要采集赋值,直接调用即可,因为变量信息为系统信息所以不能随意设定,仅为采集信息,故称为事实变量。
ansible list1 -m setup ##setup模块用于收集远程主机的一些基本信息
---
- name: test register
hosts: list1
tasks:
- debug:
msg: "{{ansible_facts['enp1s0']['ipv4']['address']}}"
...
测试
- 将采集到的受控主机的ip和主机名信息在远程登陆时显示
---
- name: information
hosts: list1
tasks:
- name:
copy:
content: "hostname:{{ansible_facts['fqdn']}}\nipaddr:{{ansible_facts['enp1s0']['ipv4']['address']}}"
dest: /etc/motd ##登陆该主机时提示主机的ip和主机名
...
10 魔法变量
ansible all -m debug -a "var=hostvars"
ansible all -m debug -a "var=group_names"
ansible all -m debug -a "var=groups"
ansible all -m debug -a "var=inventory_hostname"
测试
- 将受控主机的ip及其主机名写入到/etc/hosts文件中
---
- name:
hosts: all
tasks:
- name:
template:
src: ./host.j2
dest: /etc/hosts
...
{% for host in groups['all'] %}
{{host}} {{hostvars[host]['ansible_facts']['fqdn']}}
{% endfor %}
11 加密文件
(1)创建加密文件
ansible-vault create files1.yml
ansible-vault create files2.yml --vault-password-file=password ##password中是加密文件的密码
(2)加密现有文件:
ansible-vault encrypt test1.yml
(3)查看加密文件:
ansible-vault view test1.yml
ansible-vault view test1.yml --vault-password-file=password
(4)编辑加密文件
ansible-vault edit test1.yml
ansible-vault edit test1.yml --vault-password-file=password ##将密码写入password中
(5)更改密码
ansible-vault rekey test1.yml
ansible-vault rekey test1.yml --new-vault-password-file=password##利用文件更改密码
(6)解密文件
- 文件永久解密
ansible-vault decrypt test1.yml
- 将文件解密并保存为west
ansible-vault decrypt test1.yml --output=west
10 魔法变量
ansible all -m debug -a "var=hostvars"
ansible all -m debug -a "var=group_names"
ansible all -m debug -a "var=groups"
ansible all -m debug -a "var=inventory_hostname"
测试
- 将受控主机的ip及其主机名写入到/etc/hosts文件中
---
- name:
hosts: all
tasks:
- name:
template:
src: ./host.j2
dest: /etc/hosts
...
{% for host in groups['all'] %}
{{host}} {{hostvars[host]['ansible_facts']['fqdn']}}
{% endfor %}