Ansible中的变量及加密

  • 一、变量的设定
  • 一、变量命名规则
  • 二、变量级别
  • 三、变量设定和使用方式
  • 二、JINJIA2模板
  • 一、简介
  • 二、使用方法
  • 三、jinjia2模板的for循环,if用法
  • 一、for循环
  • 二、if判断语句
  • 三、练习
  • 四、文件加密


一、变量的设定

一、变量命名规则

只能包含数字,下划线,字母
只能用下划线或字母开头

二、变量级别

全局:
从命令行或配置文件中设定的
paly:
在play和相关结构中设定的
主机:
由清单,事实收集或注册的任务

三、变量设定和使用方式

这里使用循环定义的方式,使用loop和item实现循环执行
1、在playbook中直接定义变量

---
- name: test
  hosts: 172.25.42.200
  vars:
    user:
      - ttt
      - qqq  
  tasks:          
    - name: user
      user:
        name: "{{ item }}"              代表循环的每一个变量
        state: present
      loop:                             定义循环
        "{{ user }}"

ansible内置变量怎么查找 ansible 变量赋值_linux


ansible内置变量怎么查找 ansible 变量赋值_linux_02


ansible内置变量怎么查找 ansible 变量赋值_for循环_03

2、在文件中定义变量
定义变量

[ck@ansible ansible]$ cat westos.yml 
---
westos:
  - hhh
  - kkk

使用变量、建立多个用户

[ck@ansible ansible]$ cat test1.yml 
---
- name: test
  hosts: 172.25.42.200
  vars_files:                                
    - ./westos.yml                     定义文件位置
  tasks:          
    - name: user
      user:
        name: "{{ item }}"             每次执行一个westos的值
        state: present
      loop:                            循环定义语句,定义westos的值为多个个
        "{{ westos }}"

ansible内置变量怎么查找 ansible 变量赋值_for循环_04


ansible内置变量怎么查找 ansible 变量赋值_ansible内置变量怎么查找_05


3、清单使用变量

清单中直接给出变量,yml文件直接执行清单即可引用清单中的变量

清单内容

[westos:vars]
USER=test                 直接给予变量

文件内容

[ck@ansible ansible]$ cat test2.yml 

/
---
- name: create user
  hosts: westos                  执行清单,将会直接执行清单的变量
  tasks: 
    - name: user mode
      user:
        name: "{{ USER }}"
        state: present
//

修改清单路径

ansible内置变量怎么查找 ansible 变量赋值_运维_06


执行ymal文件,得到结果

ansible内置变量怎么查找 ansible 变量赋值_for循环_07

ansible内置变量怎么查找 ansible 变量赋值_for循环_08

4、针对清单生效
设定清单里面的变量
主机的执行清单

[ck@ansible ansible]$ cat westos 
[westos]
172.25.42.200

建立用户yml文件

[ck@ansible ansible]$ cat useradd.yml 
---
- name: create user
  hosts: westos                              执行westos清单
  tasks: 
    - name: user mode
      user:
        name: "{{ USER }}"
        state: present

但是目前没有定义USER的变量,可以直接新建特定名称的group_vars文件,系统会自动识别此目录。在文件里设定执行清单westos里的变量USER,注意定义变量清单的名字和定义执行的清单名称必须一致
建立清单、设定清单变量

[ck@ansible ansible]$ mkdir group_vars
[ck@ansible ansible]$ cd group_vars
[ck@ansible group_vars]$ vim westos               此文件必须和执行清单的名字保持一致

///
USER: ppppppp
/

5、针对主机生效
可以针对特定的主机设定特定变量
建立特定的host_vars文件,ansible会自动读取。注意目录中的文件名称与主机名称一致。

[ck@ansible ansible]$ mkdir host_vars
[ck@ansible ansible]$ cd host_vars/
[ck@ansible host_vars]$ vim 172.25.42.200

///
---
USER: ckckckck
///

yml文件为

[ck@ansible ansible]$ cat useradd.yml 


---
- name: create user
  hosts: westos                  
  tasks: 
    - name: user mode
      user:
        name: "{{ USER }}"
        state: present
//

ansible内置变量怎么查找 ansible 变量赋值_for循环_09


ansible内置变量怎么查找 ansible 变量赋值_运维_10

6、针对列表生效
单独建立列表,使用数组设定变量。
建立列表

[ck@ansible ansible]$ cat list.yaml 


---
LIST:
  - name: user1
    path: /home/user1
  - name: user2
    path: /home/user2

设定yml执行文件

[ck@ansible ansible]$ cat test3.yml 

///
---
- name: test
  vars_files:
    - ./list.yml
  hosts: westos
  tasks:
    - name: test
      debug:
        msg: "{{ item.name }} {{ item.path }}"
      loop:
        "{{ LIST }}"

ansible内置变量怎么查找 ansible 变量赋值_vim_11

ansible内置变量怎么查找 ansible 变量赋值_linux_12

ansible内置变量怎么查找 ansible 变量赋值_vim_13


7、变量覆盖

使用时加上参数则会覆盖掉yml文件里面变量的设定

ansible-playbook user.yml -e "USER=hello"

8、变量注册
将运行输出的值通过register注册输出给一个变量

[ck@ansible ansible]$ cat test2.yml 

///
---
- name: test register
  hosts: westos
  tasks: 
    - name: shell
      shell: echo hello world
      register: westos               将输出全部注册给变量westos
      
    - name: show                     
      debug:                         debug输出模块
        msg: "{{westos}}"            msg展示返回的变量westos

ansible内置变量怎么查找 ansible 变量赋值_ansible内置变量怎么查找_14


当需要输出某个具体的参数时:需要具体指定输出变量

ansible内置变量怎么查找 ansible 变量赋值_vim_15

ansible内置变量怎么查找 ansible 变量赋值_vim_16


9、事实变量

事实变量是ansible在受控主机中自动检测出的变量,和采集到的主机信息有关

事实变量中还有与主机相关的信息,其变量都是真实存在的,不需要赋值,直接调用即可。

(1)、查看所有的值

[root@ansible ansible]  ansible localhost -m setup

ansible内置变量怎么查找 ansible 变量赋值_vim_17


(2)、用yml文件看具体值

注意事实变量不用写变量参数前面的ansible

[ck@ansible ansible]$ cat test2.yml 

///
---
- name: test fact
  hosts: westos
  tasks: 
    - name: show
      debug:
        msg: "{{ansible_facts['nodename']}}"     修改[]里面参数即可
//

ansible内置变量怎么查找 ansible 变量赋值_for循环_18

10、魔法变量
和事实变量类似,都是真实存在的变量,和ansible有关
直接执行以下变量即可
列如:

1、ansible软件的内部信息(hostvars:)

ansible localhost -m debug -a "var=hostvars" 2、当前受管主机所在组 (group_names:)

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

3、列出清单中所有的组和主机 (groups:)

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

4、包含清单中配置的当前授管主机的名称(inventory_hostname:)

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

令var变量等于某个参数即可获得该参数信息

ansible内置变量怎么查找 ansible 变量赋值_ansible内置变量怎么查找_19

二、JINJIA2模板

一、简介

Jinja2是Python下一个被广泛应用的模版引擎
并扩展了其语法和一系列强大的功能。
其中最显著的一个是增加了沙箱执行功能和可选的自动转义功能,可以实现所有变量的运用

二、使用方法

1、jinjia模板的实现
建立yml文件,采用j2模板

[ck@ansible ansible]$ cat test4.yml 

//
- name: test j2
  hosts: westos
  tasks: 
    - name: create test file
      template:
        src: ./test.j2              j2文件来源
        dest: /mnt/test             被控端执行文件地址
///

建立jtest.j2模板

[ck@ansible ansible]$ cat test.j2 

///
{ # test file }
hello world
//

实现了文件的创造

ansible内置变量怎么查找 ansible 变量赋值_for循环_20


ansible内置变量怎么查找 ansible 变量赋值_vim_21


2、jinjia模板实现变量输出

输出被控主机地址解析文件到指定位置

[ck@ansible ansible]$ cat test5.yml 

//
- name: test j2
  hosts: westos
  tasks: 
    - name: create test file
      template:
        src: ./hosts.j2
        dest: /mnt/test
//

建立hosts.j2文件

[ck@ansible ansible]$ cat hosts.j2 
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
{{ ansible_facts['ens3']['ipv4']['address'] }} {{ ansible_facts['fqdn'] }}  {{ ansible_facts['hostname'] }}

ansible内置变量怎么查找 ansible 变量赋值_ansible内置变量怎么查找_22

ansible内置变量怎么查找 ansible 变量赋值_vim_23


成功在受控主机端查看到变量生成的解析地址

ansible内置变量怎么查找 ansible 变量赋值_linux_24

三、jinjia2模板的for循环,if用法

一、for循环

设定变量

[ck@ansible ansible]$ cat user.yml
users:
  - westos
  - linux
  - ansible

设定jinjia2模板
变量用{{ }}括起来

[ck@ansible ansible]$ cat test1.j2
{% for NAME in users %}                  for循环设定变量NAME,值来源于变量文件
{{ NAME }}                               变量用{{}},每次循环NAME的值都不同
{% endfor %}                             for循环结束

设定yaml文件

[ck@ansible ansible]$ cat test5.yml 
- name: test j2
  vars_files: ./user.yml               变量文件
  hosts: westos
  tasks: 
    - name: create list
      template:                  
        src: ./test1.j2                j2文件来源
        dest: /mnt/user_list

ansible内置变量怎么查找 ansible 变量赋值_ansible内置变量怎么查找_25


成功输出结果

ansible内置变量怎么查找 ansible 变量赋值_ansible内置变量怎么查找_26

二、if判断语句

当变量等于linux时,只显示记数,不等于linux时,显示记数和变量名称。
设定变量

[ck@ansible ansible]$ cat user.yml
users:
  - westos
  - linux
  - ansible

设定j2文件
loop.index ##循环迭代记数从1开始
loop.index0 ##循环迭代计数从0开始

[ck@ansible ansible]$ cat test1.j2 
{% for NAME in users %}
{% if NAME in "linux"%}         in 代表“是否等于”
{{ loop.index0 }}
{% endif %}
{% if NAME not in "linux"%}
{{ loop.index0 }} {{ NAME }}
{% endif %}
{% endfor %}

设定yml文件

[ck@ansible ansible]$ cat test5.yml 
- name: test j2
  vars_files: ./user.yml
  hosts: westos
  tasks: 
    - name: create list
      template:
        src: ./test1.j2
        dest: /mnt/user_list

ansible内置变量怎么查找 ansible 变量赋值_linux_27

三、练习

在被控主机端生成所有ansible主机的全部地址解析文件

[ck@ansible ansible]$ cat create.yml 

//
- name: create hosts
  hosts: westos
  tasks:
    - name: create hosts
      template:
        src: ./hosts.j2
        dest: /mnt/reslove
/

jinjia2模板
在for循环下,利用魔法变量和事实变量结合

[ck@ansible ansible]$ cat hosts.j2 


///
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
{% for WESTOS in groups['all'] %}
{{ hostvars[WESTOS]['ansible_facts']['ens3']['ipv4']['address'] }} {{ hostvars[WESTOS]['ansible_facts']['fqdn'] }} {{ hostvars[WESTOS]['ansible_facts']['hostname'] }}
{% endfor %}

ansible内置变量怎么查找 ansible 变量赋值_ansible内置变量怎么查找_28


ansible内置变量怎么查找 ansible 变量赋值_运维_29


ansible内置变量怎么查找 ansible 变量赋值_ansible内置变量怎么查找_30

四、文件加密

1、创建加密文件、给予密码

[ck@ansible ansible]$ ansible-vault create westos111

///
hello
///

ansible内置变量怎么查找 ansible 变量赋值_ansible内置变量怎么查找_31


2、普通查看、发现文件已经加密,查看不到密码

ansible内置变量怎么查找 ansible 变量赋值_for循环_32


3、使用加密的方式查看文件内容

[ck@ansible ansible]$ ansible-vault view westos111

ansible内置变量怎么查找 ansible 变量赋值_for循环_33


4、编辑加密文件、输入密码更改文件

[ck@ansible ansible]$ ansible-vault edit westos111

ansible内置变量怎么查找 ansible 变量赋值_for循环_34


可以更改位文件

ansible内置变量怎么查找 ansible 变量赋值_运维_35


5、永久解密文件

[ck@ansible ansible]$ ansible-vault decrypt westos111

解密成功,可以直接查看到文件

ansible内置变量怎么查找 ansible 变量赋值_运维_36


6、加密现有文件

对刚才解密的文件进行加密

[ck@ansible ansible]$ ansible-vault encrypt westos111

ansible内置变量怎么查找 ansible 变量赋值_ansible内置变量怎么查找_37


7、更改密码

[ck@ansible ansible]$ ansible-vault encrypt westos111

ansible内置变量怎么查找 ansible 变量赋值_linux_38


8、执行加密文件

[ck@ansible ansible]$ ansible-vault encrypt westos111

ansible内置变量怎么查找 ansible 变量赋值_运维_39