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
...
  • 测试

ansible的facts变量 ansible变量文件_主机名

ansible的facts变量 ansible变量文件_文件名_02

3.2 在文件中定义的变量和使用

  • 编辑存放变量的文件:文件名以.yml结尾

ansible的facts变量 ansible变量文件_清单文件_03


(1) 方式一

  • 编辑playbook文件
---
 - name: create user
  hosts: list1
  vars_files:
    - /mnt/user.yml ##定义变量文件的路径
  tasks:
    - name: create user
      user:
        name: "{{USER}}"  ##变量的使用
        state: present
...
  • 测试

ansible的facts变量 ansible变量文件_ansible的facts变量_04

ansible的facts变量 ansible变量文件_文件名_05


(2)方式二

  • 编辑playbook文件
---
 - name: delete user
  hosts: list1
  vars_files: /mnt/user.yml ##定义变量的文件
  tasks:
    - name: delete user
      user:
        name: "{{USER}}" ##变量的使用
        state: absent
...
  • 测试

ansible的facts变量 ansible变量文件_清单文件_06

ansible的facts变量 ansible变量文件_文件名_07


4 设置主机变量和清单变量

在定义主机变量和清单变量时使用

(1)在清单文件中定义变量

[list1 :vars]  ##定义针对list1中主机名或ip的变量
	USER=testuser

ansible的facts变量 ansible变量文件_清单文件_08

(2)playbook文件的编写

---
 - name: create user
  hosts: list1
  tasks:
    - name: create user
      user:
        name: "{{USER}}"
        state: present
...

(3) 测试

ansible的facts变量 ansible变量文件_主机名_09


ansible的facts变量 ansible变量文件_主机名_10

5 目录设定变量

实验前的准备

(1)查看清单文件:cat /ansible/inventory

ansible的facts变量 ansible变量文件_清单文件_11


(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的清单变量:

ansible的facts变量 ansible变量文件_文件名_12

ansible的facts变量 ansible变量文件_清单文件_13


(2)测试

ansible的facts变量 ansible变量文件_ansible的facts变量_14


ansible的facts变量 ansible变量文件_主机名_15

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

ansible的facts变量 ansible变量文件_主机名_16


(2)查看清单文件

ansible的facts变量 ansible变量文件_主机名_17

(3)playbook文件

---
 - name: create user
  hosts: list1 ##不用设定
  tasks:
    - name: create user
      user:
        name: "{{USER}}"
        state: present
...

(2)测试

ansible的facts变量 ansible变量文件_清单文件_18


ansible的facts变量 ansible变量文件_ansible的facts变量_19


2 当清单文件list中的主机是主机名(1)查看清单文件

ansible的facts变量 ansible变量文件_清单文件_20


(2)编辑/etc/hosts文件,域名解析

ansible的facts变量 ansible变量文件_ansible的facts变量_21


(3)playbook文件

---
- name: delete user
  hosts: list1
  tasks:
    - name: delete user
      user:
        name: "{{USER}}"
        state: absent
...

(4)测试

ansible的facts变量 ansible变量文件_清单文件_22

ansible的facts变量 ansible变量文件_文件名_23

6 用命令覆盖变量

(1)在playbook文件中定义变量

---
 - name: appache
  hosts: list1
  vars: 
    test: westos
  tasks:
    - copy:
        content: "{{test}}" 
        dest: /mnt/hosts
...

(2)测试

  • 直接执行playbook
ansible-playbook test2.yml

ansible的facts变量 ansible变量文件_主机名_24

ansible的facts变量 ansible变量文件_文件名_25

  • 命令覆盖变量,执行playbook
ansible-playbook test2.yml -e "test=linux"

ansible的facts变量 ansible变量文件_文件名_26

ansible的facts变量 ansible变量文件_文件名_27

(3)playbook文件中没有定义变量,可以用命令覆盖变量

---
- name: appache
  hosts: list1
  tasks:
    - copy:
        content: "{{test}}"
        dest: /mnt/hosts
...

测试:

ansible-playbook test2.yml -e "test=westos"

ansible的facts变量 ansible变量文件_主机名_28

ansible的facts变量 ansible变量文件_主机名_29

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']}}"
...

测试

ansible的facts变量 ansible变量文件_ansible的facts变量_30

8 注册变量

register:把模块输出到指定字符串中

---
- name: test register
  hosts: list1
  tasks:
    - shell:
        hostname
      register: westos
    - debug:
        msg: "{{westos['stdout']}}"
...

ansible的facts变量 ansible变量文件_清单文件_31

9 事实变量

  • 事实变量是ansible在受控主机中自动检测出的变量,事实变量中还有与主机相关的信息,当需要使用主机相关的信息时不需要采集赋值,直接调用即可,因为变量信息为系统信息所以不能随意设定,仅为采集信息,故称为事实变量。
ansible list1 -m setup ##setup模块用于收集远程主机的一些基本信息

ansible的facts变量 ansible变量文件_主机名_32

ansible的facts变量 ansible变量文件_ansible的facts变量_33

ansible的facts变量 ansible变量文件_清单文件_34

---
- name: test register
  hosts: list1
  tasks:
    - debug:
        msg: "{{ansible_facts['enp1s0']['ipv4']['address']}}"
...

ansible的facts变量 ansible变量文件_主机名_35

测试

  • 将采集到的受控主机的ip和主机名信息在远程登陆时显示
---
- name: information
  hosts: list1
  tasks:
    - name:
      copy:
        content: "hostname:{{ansible_facts['fqdn']}}\nipaddr:{{ansible_facts['enp1s0']['ipv4']['address']}}"
        dest: /etc/motd ##登陆该主机时提示主机的ip和主机名
...

ansible的facts变量 ansible变量文件_文件名_36

ansible的facts变量 ansible变量文件_ansible的facts变量_37

10 魔法变量

ansible all -m debug -a "var=hostvars"

ansible的facts变量 ansible变量文件_主机名_38

ansible all -m debug -a "var=group_names"

ansible的facts变量 ansible变量文件_主机名_39

ansible all -m debug -a "var=groups"

ansible的facts变量 ansible变量文件_清单文件_40

ansible all -m debug -a "var=inventory_hostname"

ansible的facts变量 ansible变量文件_主机名_41

测试

  • 将受控主机的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 %}

ansible的facts变量 ansible变量文件_清单文件_42


ansible的facts变量 ansible变量文件_文件名_43

11 加密文件

(1)创建加密文件

ansible-vault create files1.yml
ansible-vault create files2.yml --vault-password-file=password ##password中是加密文件的密码

ansible的facts变量 ansible变量文件_清单文件_44

ansible的facts变量 ansible变量文件_文件名_45

(2)加密现有文件:

ansible-vault encrypt test1.yml

ansible的facts变量 ansible变量文件_清单文件_46

(3)查看加密文件:

ansible的facts变量 ansible变量文件_主机名_47

ansible-vault view test1.yml
ansible-vault view test1.yml --vault-password-file=password

ansible的facts变量 ansible变量文件_主机名_48


(4)编辑加密文件

ansible-vault edit test1.yml 
ansible-vault edit test1.yml --vault-password-file=password ##将密码写入password中

ansible的facts变量 ansible变量文件_文件名_49

(5)更改密码

ansible-vault rekey test1.yml
ansible-vault rekey test1.yml --new-vault-password-file=password##利用文件更改密码

ansible的facts变量 ansible变量文件_主机名_50

(6)解密文件

  • 文件永久解密
ansible-vault decrypt test1.yml

ansible的facts变量 ansible变量文件_主机名_51

  • 将文件解密并保存为west
ansible-vault decrypt test1.yml --output=west

ansible的facts变量 ansible变量文件_主机名_52

ansible的facts变量 ansible变量文件_文件名_53

10 魔法变量

ansible all -m debug -a "var=hostvars"

ansible的facts变量 ansible变量文件_主机名_38

ansible all -m debug -a "var=group_names"

ansible的facts变量 ansible变量文件_主机名_39

ansible all -m debug -a "var=groups"

ansible的facts变量 ansible变量文件_清单文件_40

ansible all -m debug -a "var=inventory_hostname"

ansible的facts变量 ansible变量文件_主机名_41

测试

  • 将受控主机的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 %}

ansible的facts变量 ansible变量文件_清单文件_42


ansible的facts变量 ansible变量文件_文件名_43