运维自动化工具ansible(5)Ansible中的变量以及加密

1. 变量命名

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

测试一下:
首先设置一个变量westos@1看看执行playbook,报错了
在这里插入图片描述
改@为下划线_

在这里插入图片描述
执行成功

在这里插入图片描述

2. 变量级别

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

变量优先级设定:
狭窄范围有限与广域范围

3. 变量设定和使用方式

(1)在playbook中直接定义变量

westos_1: hello 设定变量
“{{ westos_1 }}” 使用变量

在这里插入图片描述

(2)在文件中定义变量

编辑一个westos.yml文件

[lee@westos_ansible ansible]$ cat westos.yml
---
westos: hello westos

编辑test.yml,变量文件设为westos.yml
在这里插入图片描述
执行

在这里插入图片描述如果有两个变量文件该如何编辑呢
编辑westos1.yml

[lee@westos_ansible ansible]$ cat westos1.yml 
---
user: linux

编辑test.yml

[lee@westos_ansible ansible]$ cat test.yml 
---
- name: test
  hosts: westos
  vars_files:
    - ./westos.yml                     指定两个变量文件
    - ./westos1.yml
  tasks:
      - name: test
        debug:
          msg: "{{ westos }} {{ user }}"

执行

在
我们给变量文件中写入两个值,添加创建用户的模块

[lee@westos_ansible ansible]$ cat westos.yml 
---
westos:
  - westos
  - linux
[lee@westos_ansible ansible]$ cat test.yml 
---
- name: test
  hosts: westos
  vars_files:
    - ./westos.yml
  tasks:
      - name: test
        user:
          name: "{{ westos }}"
          state: present

执行,很明显不可以

在这里插入图片描述

继续编辑test.yml文件

使用loop进行循环迭代任务

[lee@westos_ansible ansible]$ cat test.yml 
---
- name: test
  hosts: westos
  vars_files:
    - ./westos.yml
  tasks:
    - name: westos
      user:
        name: "{{ item }}"
        state: present
      loop:
        "{{ westos }}"

执行成功

在这里插入图片描述

练习:安装vsftpd,httpd并且启动

编辑变量文件

[lee@westos_ansible ansible]$ cat install.yml 
---
install:
  - vsftpd
  - httpd

编辑test.yml文件

[lee@westos_ansible ansible]$ cat test.yml 
---
- name: test
  hosts: westos
  vars_files:
    - ./install.yml
  tasks:
    - name: install
      dnf:
        name: "{{ install }}"
        state: latest

    - name: start service
      service:
        name: "{{ item }}"
        state: restarted
        enabled: yes
      loop:
        "{{ install }}"

执行成功
在这里插入图片描述

(3)在清单中使用变量

编辑test.yml和inventory

[lee@westos_ansible ansible]$ ansible-playbook test.yml 

PLAY [test] *****************************************************************************************************************************************************************

TASK [Gathering Facts] ******************************************************************************************************************************************************
ok: [172.25.10.200]

TASK [user mode] ************************************************************************************************************************************************************
changed: [172.25.10.200]

PLAY RECAP ******************************************************************************************************************************************************************
172.25.10.200              : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[lee@westos_ansible ansible]$ cat test.yml 
---
- name: test
  hosts: westos
  tasks:
    - name: user mode
      user:
        name: "{{ USER }}"    使用这个变量
        state: present
[lee@westos_ansible ansible]$ cat inventory 
[westos]
172.25.10.200
[westos:vars]
USER=test                      变量是test

执行成功

在这里插入图片描述

(4)用命令覆盖变量

编辑文件

[lee@westos_ansible ansible]$ cat inventory 
[westos]
172.25.10.200
[westos:vars]
USER=linux
[lee@westos_ansible ansible]$ cat test.yml 
---
- name: test
  hosts: westos
  tasks:
    - name: user mode
      debug:
        msg: "{{ USER }}"
          

本来根据变量debug要输出的时linux,但是我们可以通过命令来覆盖变量

在这里插入图片描述

(5)使用数组定义变量

编辑文件

[lee@westos_ansible ansible]$ cat userlist.yml 
---
LIST:
  - name: user1
    path: /home/user1
  - name: user2
    path: /home/user2
[lee@westos_ansible ansible]$ cat test.yml 
---
- name: test
  hosts: westos
  vars_files:
    - ./userlist.yml
  tasks:
    - name: test
      debug:
        msg: "{{item.name}} {{item.path}}" 
      loop:
        "{{LIST}}"

测试成功

在这里插入图片描述

(6)注册变量

编辑文件

[lee@westos_ansible ansible]$ cat test.yml 
---
- name: test
  hosts: westos
  tasks:
    - name: hostname
      shell:
        hostname
      register: msg

    - debug:
        msg: "{{msg['stdout']}}"

将hostname产生的结果注册到msg中,再将msg中的stdout输出,就可以得到hostname的结果

在这里插入图片描述

(7)事实变量

事实变量是ansible在受控主机空自动检测出的变量
事实变量中还有与主机相关的信息

当需要使用主机的相关信息时不再需要采集赋值,直接调用即可
因为变量信息为系统信息,所以不能随意设定仅为采集信息,故被称为事实变量

ansible westos -m setup | less   查看受控主机的信息(westos是我清单中的受控主机)

在这里插入图片描述编辑文件

[lee@westos_ansible ansible]$ cat test.yml 
---
- name: test
  hosts: all
  gather_facts: yes          yes 打开事实变量收集,默认为打开
  tasks:
    - debug:
        msg: "{{ansible_facts['all_ipv4_addresses']}}"

执行,可以看到受控主机信息
在这里插入图片描述

(8)魔法变量

ansible的内嵌变量

 ansible westos -m debug -a "var=hostvars"		查看ansible软件内部信息

在这里插入图片描述

ansible westos -m debug -a "var=group_names"		当前受管主机所在组

在这里插入图片描述

ansible westos -m debug -a "var=groups"		列出清单中所有的组和主机

在这里插入图片描述

ansible westos -m debug -a "var=inventory_hostname"	清单中配置的当前授管主机的名称

在这里插入图片描述

练习

显示所有受控主机中能够登陆的用户

awk -F ":" '/bash$/||/sh$/{print $1}' /etc/passwd    显示所有可以能登陆的用户

在这里插入图片描述
编辑文件

[lee@westos_ansible ansible]$ cat test.yml 
---
- name: users who can log in
  hosts: all
  tasks:
    - name: grep USERS
      shell:
        awk -F ":" '/bash$/||/sh$/{print $1}' /etc/passwd
      register: USERS    使用注册变量

    - name: show USERS
      debug:
        msg: "{{USERS['stdout_lines']}}"

在这里插入图片描述

4. Jinjia2模板

Jinja2是python的一种模板语言,是一种系统的完整的python模板语言。其设计思想来源于Django的模板引擎。
其中最显著的一个是增加了沙箱执行功能和可选的自动转义功能。

沙箱模式: 将代码与外界隔离,不管你在箱子里做什么,都不会污染到全局。

(1)Jinjia2模板书写规则

利用受控主机远程信息找到IP
在这里插入图片描述
在这里插入图片描述
找到主机名
在这里插入图片描述
编辑test.j2文件

[lee@westos_ansible ansible]$ cat test.j2 
{{ansible_facts['enp1s0']['ipv4']['address']}} {{ansible_facts['fqdn']}}

编辑test.yml文件

[lee@westos_ansible ansible]$ cat test.yml 
---
- name: test j2
  hosts: westos
  tasks:
    - name: test j2
      template:
        src: ./test.j2
        dest: /mnt/test

执行

在这里插入图片描述
查看

在这里插入图片描述

for循环

编辑文件

[lee@westos_ansible ansible]$ cat user.yml   			 	 变量文件
users:
  - westos
  - linux
  - haha
[lee@westos_ansible ansible]$ cat test.j2    
{% for NAME in users %}                          			 for循环
{{ NAME }}
{% endfor %}
[lee@westos_ansible ansible]$ cat test.yml 
---
- name: test j2
  hosts: westos
  vars_files: ./user.yml
  tasks:
    - name: test j2
      template:                                    			  j2模板
        src: ./test.j2			
        dest: /mnt/user_list

执行

在这里插入图片描述
查看生成的文件

在这里插入图片描述
还可以添加迭代,编辑文件

[lee@westos_ansible ansible]$ cat test.j2 
{% for NAME in users %}
{{loop.index}} {{ NAME }}
{% endfor %}

执行看效果

在这里插入图片描述

if判定

编辑文件

[lee@westos_ansible ansible]$ cat user.yml 
users:
  - westos
  - linux
  - hello
[lee@westos_ansible ansible]$ cat test.j2 
{% for NAME in users %}              
{% if NAME in "linux" %}                  如果有名字为linux
{{loop.index}}                            输出迭代序号
{%endif%}
{% if NAME not in "linux" %}               如果没有
{{loop.index}} {{ NAME }}                  输出序号和名字
{%endif%}
{% endfor %}
[lee@westos_ansible ansible]$ cat test.yml 
---
- name: test j2
  hosts: westos
  vars_files: ./user.yml
  tasks:
    - name: test j2
      template:                     
        src: ./test.j2               
        dest: /mnt/user_list       输出到受控主机的目录下

执行并查看

在这里插入图片描述

5. Ansible的加密控制

ansible-vault create westos.yml	加密并生成westos.yml加密文件

在这里插入图片描述
在这里插入图片描述

ansible-vault view westos		查看加密文件
ansible-vault view --vault-password-file=pass westos	非交互式查看

在这里插入图片描述
在这里插入图片描述

ansible-vault edit westos		编辑加密文件
ansible-vault edit --vault-password-file=pass westos
ansible-vault decrypt westos	解密文件
ansible-vault decrypt westos --output=linux	解密文件到linux文件,源文件依然加密

在这里插入图片描述

ansible-vault rekey westos		修改密码

在这里插入图片描述

ansible-vault encrypt westos.yml		加密
ansible-playbook westos.yml --ask-vault-pass	输入密码执行

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值