[内容] Ansible 事实变量 (Ansible 内部变量)

注意:

在使用 Ansible 事实变量之前,要先安装 Ansible、添加被 Ansible 管理的主机,并且需要 root 权限

正文:

内容一: 在命令行使用事实变量

1.1 显示所有事实变量

# ansible all -m setup

(补充:这里以显示所有服务器上的所有事实变量为例)

1.2 显示某一个事实变量

# ansible all -m setup -a filter=*hostname*

(补充:这里以显示所有服务器上的 hostname 事实变量为例)

内容二:在 Playbook 使用事实变量的方法

2.1 案例一:在 Playbook 使用事实变量里的信息

# vim test.yml

创建以下内容:

---
- name: test
  hosts: all
  vars:
  - server_name: IP_ADDRESS
    server_cont: "{{ ansible_default_ipv4.address }}"
  - server_name: HOST_NAME
    server_cont: "{{ ansible_hostname }}"
  tasks:
......

或者:

---
- name: test
  hosts: all
  vars:
  - server_name: IP_ADDRESS
    server_cont: "{{ ansible_facts['default_ipv4']['address'] }}"
  - server_name: HOST_NAME
    server_cont: "{{ ansible_facts['hostname'] }}"
  tasks:
......


补充:
这里以在 test.yml 中:
1) 创建一个名为 test,
2) 在所有服务器上执行,
3) 创建名为 IP_ADDRESS 的 IP 地址事实变量和名为 HOST_NAME 的服务器名称的事实变量,
的 Playbook 为例

2.2 案例二:在 Playbook 使用事实变量作为条件判断

# vim test.yml

创建以下内容:

......    
    when:
        - ansible_facts['os_family'] in ["RedHat"]
        - ansible_facts['distribution_major_version'] in ["9"]
        - ansible_facts['userspace_architecture'] == "x86_64"

(补充:这里以在 test.yml 中,当满足 os_family 是 RedHat、distribution_major_version 是 9,userspace_architecture 是 x86_64 时才执行前面的内容为例)

内容三:在 JSON 文档上使用事实变量

# vim index.html.j2

创建以下内容:

{{ ansible_hostname }} {{ ansible_default_ipv4.address }}

或者:

{{ ansible_facts['hostname'] }} {{ ansible_facts['default_ipv4']['address'] }}

(补充:这里以创建 1 个名称为 index.html.j2,包含服务器名称的事实变量和服务器 IP 地址的事实变量的 JSON 文件为例)

补充: Ansible 在 Playbook 里关闭事实收集的方法

# vim test.yml

创建以下内容:

---
- name: test
  hosts: all
  gather_facts: false
  tasks:
......

(补充:这里以在 test.yml 中,创建 1 个名称为 test,在所有服务器上取消事实变量的 playbook 为例)

参考文献:

https://www.redhat.com/sysadmin/playing-ansible-facts

[工具] Shell 批量修改多个远程服务器某个用户的过期密码

介绍

基本信息

作者:朱明宇
名称:批量修改多个远程服务器某个用户的过期密码
作用:批量修改多个远程服务器某个用户的过期密码

使用方法

1. 将此脚本和清单 $list 文件放在同一目录下
2. 清单 $list 里每个远程服务器名或 IP 地址占用 1 行
3. 在此脚本的分割线内写入相应的内容
4. 在执行此脚本的系统上安装 expect
5. 给此脚本添加执行权限
6. 执行此脚本

脚本分割线里的变量

1. oldpassword=123 #原密码
2. newpassword=abc #新密码
3. user=root #要修改密码的用户
4. list=servers.txt #指定服务器清单

脚本

#!/bin/bash

####################### Separator ########################

oldpassword=123
newpassword=abc
user=root
list=servers.txt

####################### Separator ########################

set timeout 5

for i in `cat $list`
do
        echo $i
        ssh $i "whoami"

        if [ $? -eq 0 ];then
                continue
        fi

        expect << EOF
        spawn ssh $user@$i
        expect "Current password:"    {send "$oldpassword\r"}
        expect "New password:"        {send "$newpassword\r"}
        expect "Retype new password:" {send "$newpassword\r"}
        expect ">"                    {send "\r"}
        EOF

       echo

done