管理变量、机密和事实

一、管理变量

1、Ansible变量简介

Ansible支持利用变量来存储值,并在Ansible项目的所有文件中重复使用这些值。这可以简化项目的创建和维护,并减少错误的数量。

通过变量,可以轻松地在Ansible项目中管理给定环境的动态值。例如,变量可能包含下面这些值:

  • 要创建的用户
  • 要安装的软件包
  • 要重新启动的服务
  • 要删除的文件
  • 要从互联网检索的存档

2、命名变量

变量的名称必须以字母开头,并且只能包含字母、数字和下划线

无效的变量名称有效的变量名称
web serverweb_server
remote.fileremote_file
1st filefile_1
file1
remoteserver$1remote_server_1
remote_server1

3、定义变量

可以在Ansible项目中的多个位置定义变量。不过,这些变量大致可简化为三个范围级别:

  • 全局范围:从命令行或Ansible配置设置的变量
  • Play范围:在play和相关结构中设置的变量
  • 主机范围:由清单、事实收集或注册的任务,在主机组和个别主机上设置的变量

如果在多个xeklh定义了相同名称的变量,则采用优先级别最高的变量。窄范围优先于更广泛的范围:由清单定义的变量将被playbook定义的变量覆盖,后者将被命令行中定义的变量覆盖。

4、playbook中的变量

编写playbook时,可以定义自己的变量,然后在任务中调用这些值。例如,名为web_package的变量可以使用值httpd来定义。然后,任务可以使用yum模块调用该变量来安装httpd软件包。

Playbook变量可以通过多种方式定义。一种常见的方式是将变量放在playbook开头的vars块中:

[root@192 playbook]# vim /opt/test.yml
---
  - hosts: all
    vars:
      user: alice
      home: /home/alice

也可以在外部文件中定义playbook变量。此时不使用playbook中的vars块,可以改为使用vars_files指令,后面跟上相对于playbook位置的外部变量文件名称列表:

[root@192 playbook]# cat test.yml 
---
- hosts: all
  vars_files:
    - ./user.yml

而后,可以使用YAML格式在这一/这些文件中定义playbook变量:

[root@192 playbook]# cat  user.yml
user: alice
home: /home/alice

声明了变量后,可以在任务中使用这些变量。若要引用变量,可以将变量名放在双大括号内。在任务执行时,Ansible会将变量替换为其值。当变量用作开始一个值的第一元素时,必须使用引号。这可以防止Ansible将变量引用视为YAML字典的开头。

[root@192 playbook]# cat  user.yml
vars:
  user: joe
tasks:
    # This line will read: Creates the user joe
  - name: Creates the user {{ user }}
    user:
      # This line will create the user named joe
      name: "{{ user }}"

5、主机变量和组变量

直接应用于主机的清单变量分为两在类:

  • 主机变量,应用于特定主机
  • 组管理,应用于一个主机组或一组主机组中的所有主机

主机变量优先于组变量,但playbook中定义的变量的优先级比这两者更高。

若要定义主机变量和组变量,一种方法是直接在清单文件中定义。这是较旧的做法,不建议采用,但你可能会在未来的工作当中遇到。

定义192.168.129.133的ansible_user主机变量:

[root@ansible project]# cat /opt/project/host_vars/inventory 
[httpd]
192.168.129.133 ansible_user=root ansible_password=1

定义servers主机组的user组变量:

[root@ansible project]# cat /opt/project/host_vars/inventory 
192.168.129.133
192.168.129.135

[httpd:vars]
ansible_user=root
ansible_password=1

定义servers组的user组变量,该组由两个主机组成,每个主机组有两个服务器:(渐渐淘汰)

[root@ansible project]# cat /opt/project/host_vars/inventory 
[httpd]
192.168.129.135 

[httpd:children]
httpd

[httpd:vars]
nsible_user=root 
ansible_password=1
主机:
[root@ansible project]# cat inventory 
[httpd]
192.168.129.135

主机组:(管理主机的ip)
[root@ansible project]# cat group_vars/httpd 
ansible_user: root
ansible_password: 1

项目文件
[root@ansible project]# tree
.
├── ansible.cfg
├── group_vars
│   └── httpd
├── host_vars
├── inventory
└── playbook

使用目录填充主机和组变量

定义主机和主机组的变量的首选做法是在与清单文件或目录相同的工作目录中,创建group_vars和host_vars两个目录。这两个目录分别包含用于定义组变量和主机变量的文件。

建议的做法是使用host_vars和group_vars目录定义清单变量,而不直接在清单文件中定义它们。

为了定义用于servers组的组变量,需要创建名为group_vars/servers的YAML文件,然后该文件的内容将使用与playbook相同的语法将变量设置为值:

user: alice

例如在一个场景中,需要管理两个数据中心,并在/opt/inventory清单文件中定义数据中心主机:

[root@192 opt]# cd /opt/playbook/
[root@192 playbook]# cat inventory 
[datacenter1]
httpd

[datacenter2]
mysql

[datacenters:children]
datacenter1
datacenter2

6、从命令行覆盖变量

清单变量可被playbook中设置的变量覆盖,这两种变量又可通过在命令行中传递参数到ansible或ansible-playbook命令来覆盖。在命令行上设置的变量称为额外变量。

当需要覆盖一次性运行的playbook的变量的已定义值时,额外变量非常有用。例如:

[root@192 playbook]# cat hh.yml 
name: task1
  hosts: httpd
  tasks: 
    - name: 创建用户
      user:
        name: "{{user}}"
        state: present
[root@192 playbook]# ansible-playbook -e "user=qqkk" hh.yml 
PLAY [task1] *********************************************************************************************************

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

TASK [创建用户] **********************************************************************************************************
changed: [192.168.129.133]

PLAY RECAP ***********************************************************************************************************
192.168.129.133            : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
[root@apache ~]# id qqkk
uid=1002(qqkk) gid=1002(qqkk)=1002(qqkk)

7、使用数组作为变量

user1_first_name: Bob
user1_last_name: Jones
user1_home_dir: /users/bjones
user2_first_name: Anne
user2_last_name: Cook
user2_home_dir: /users/acook

这将可以改写成名为users的数组:

users:
  bjones:
    first_name: Bob
    last_name: jones
    home_dir: /users/bjones
  acook:
    first_name: Anne
    last_name: Cook
    home_dir: /users/acook
然后可以使用以下变量来访问用户数据:
# Returns 'Bob'
users.bjones.first_name

# Returns '/users/acook'
users.acook.home_dir

由于变量被定义为Python字典,因此可以使用替代语法:

# Returns 'Bob'
users['bjones']['first-name']

# Returns '/users/acook'
users['acook']['home_dir']

如果键名与python方法或属性的名称(如discard、copy和add)相同,点表示法可能会造成问题。使用中括号表示法有助于避免冲突和错误。

但要声明的是,上面介绍的两种语法都有效,但为了方便故障排除,建议在任何给定Ansible项目的所有文件中一致地采用一种语法,不要混用。

8、使用已注册变量捕获命令输出

可以使用register语句捕获命令输出。输出保存在一个临时变量中,然后在playbook中可用于调试用途或者达成其他目的,例如基于命令输出的特定配置。

以下playbook演示了如何为调试用途捕获命令输出:

[root@192 playbook]# cat www.yml
---
- name: Installs a package and prints the result
    hosts: all
    tasks:
      - name: Install the package
        yum:
          name: httpd
          state: installed
        register: install_result               
      - debug: var=install_result

运行该playbook时,debug模块用于将install_result注册变量的值转储到终端。

[root@192 playbook]# ansible-playbook www.yml

PLAY [Installs a package and prints the result] **********************************************************************

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

TASK [Install the package] *******************************************************************************************
ok: [192.168.129.133]

TASK [debug] *********************************************************************************************************
ok: [192.168.129.133] => {
    "install_result": {
        "changed": false,
        "failed": false,
        "msg": "Nothing to do",
        "rc": 0,
        "results": []
    }
}

PLAY RECAP ***********************************************************************************************************
192.168.129.133            : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 

二、管理机密

1、Anssible Vault

Ansible可能需要访问密码或API密钥等敏感数据,以便能配置受管主机。通常,此信息可能以纯文本形式存储在清单变量或其他Ansible文件中。但若如此,任何有权访问Ansible文件的用户或存储这些Ansible文件的版本控制系统都能够访问此敏感数据。这显示存在安全风险。

Ansible提供的Ansible Vault可以加密和解密任何由Ansible使用的结构化数据文件。若要使用Ansible Vault,可通过一个名为ansible-vault的命令行工具创建、编辑、加密、解密和查看文件。Ansible Vault可以加密任何由Ansible使用的结构化数据文件。这可能包括清单变量、playbook中含有的变量文件、在执行playbook时作为参数传递的变量文件,或者Ansible角色中定义的变量。

2.1、创建加密文件

要创建新的加密文件,可使用ansible-vault create filename命令。该命令将提示输入新的vault密码,然后利用默认编辑器vi打开文件。我们可以设置和导出EDITOR环境变量,通过设置和导出指定其他默认编辑器。例如,若要将默认编辑器设为nano,可设置为export EDITOR=nano。
create

[root@ansible project]# ansible-vault  create group_vars/db
New Vault password: redhat
Confirm New Vault password: redhat

查看:
[root@ansible project]# cat group_vars/db 
$ANSIBLE_VAULT;1.1;AES256
39323932616530363062353261306461336263396631613239346436306461303235356535643961
3264353635363363616538343230393037393835363733380a366532323532306466626266316533
36623963396662386335356333376136333565373133626265336536656665366632373935333435
6634343536613862620a633537363234346163363634373431373332376466313037643766383035
63323761306135316531353136643337343138616266383838316339353465343234

我们还可以用vault密码文件来存储vault密码,而不是通过标准输入途径输入vault密码。这样做需要使用文件权限和其他方式来严密保护该文件。

[root@ansible project]# ansible-vault create --vault-password-file=.mi group_vars/db 

2.2、查看加密文件

可以使用ansible-vault view filename命令查看Ansible Vault加密的文件,而不必打开它进行编辑。

查看时需要输入加密文件的加密密码
view

[root@ansible project]# ansible-vault view group_vars/db 
Vault password: redhat
password: qwe123!

用文件来查看密码(不用输入密码)

[root@ansible project]# ansible-vault view --vault-password-file=.mi group_vars/db 
password: redhat123!

2.3、解密码文件

现有的加密文件可以通过ansible-vault decrypt filename命令永久解密。在解密单个文件时,可使用–output选项以其他名称保存解密的文件。

decrypt

[root@ansible project]# ansible-vault decrypt group_vars/db 
Vault password: redhat
Decryption successful

查看:
[root@ansible project]# cat group_vars/db 
password: qwe123!

用文件解密(不用输入密码)

[root@ansible project]# ansible-vault decrypt --vault-password-file=.mi group_vars/db 
Decryption successful	//解密成功

2.4、编辑现有的加密文件

要编辑现有的加密文件,Ansible Vault提供了ansible-vault edit filename命令。此命令将文件解密为一个临时文件,并允许编辑。保存时,它将复制其内容并删除临时文件。

edit子命令始终重写文件,因此只应在进行更改时使用它。要查看文件的内容而不进行更改时,应使用view子命令。
edit

[root@ansible project]# ansible-vault edit group_vars/db 
Vault password: centos

查看:
[root@ansible project]# ansible-vault view group_vars/db 
Vault password: 
password: redhat123!

2.5、加密现有的文件

要加密已存在的文件,请使用ansible-vault encrypt filename命令。此命令可取多个欲加密文件的名称作为参数。

使用**–output=OUTPUT_FILE选项,可将加密文件保存为新的名称。只能通过–output**选项使用一个输入文件。
encrypt

[root@ansible project]# ansible-vault encrypt group_vars/db
New Vault password: centos
Confirm New Vault password: centos
Encryption successful

查看:
[root@ansible project]# cat group_vars/db 
$ANSIBLE_VAULT;1.1;AES256
39643566363431653261383035646134393562316532336537313966613962326336666563313166
3830393638306466353433323564383462616262626663340a633934623634316137356161343266
33373363343631656530386366303866393133306437363361656132653665646637623363363736
3235366338653730660a613239353130343066396534636464643563653931363833306537646365
36373561616461316664303839626335616364316438363931653438623239613737
[root@ansible project]# ansible-vault encrypt --vault-password-file=.mi group_vars/db 
Encryption successful

2.6、更改加密文件的密码

使用ansible-vault rekey filename命令更改加密文件的密码。此命令可一次性更新多个数据文件的密钥。它将提示提供原始密码和新密码。

rekey

[root@ansible project]# ansible-vault rekey group_vars/db
Vault password: centos	//旧密码
New Vault password: 123456	//新密码
Confirm New Vault password: 123456	//确认新密码
Rekey successful	//修改成功

查看:
[root@ansible project]# ansible-vault view group_vars/db 
Vault password: 123456
password: redhat123!

在使用vault密码文件时,请使用–new-vault-password-file选项:

[root@ansible project]# ansible-vault rekey --vault-password-file=.mi --new-vault-password-file=.ma group_vars/db 
Rekey successful

查看:
[root@ansible project]# ansible-vault view --vault-password-file=.mi group_vars/db 
ERROR! Decryption failed (no vault secrets were found that could decrypt) on group_vars/db for group_vars/db	//老文件看不了

[root@ansible project]# ansible-vault view --vault-password-file=.ma group_vars/db 
password: redhat123!	//新文件

随机密码:

[root@httpd ~]# openssl rand -base64 20
/xHJhyDxUgctvcgWS9ZJVXfHgO4=

l临时解密

[root@ansible project]# ansible httpd -m ping --vault-password-file=.ma

[root@ansible project]# ansible instal.yml --vault-password-file=.ma

2、playbook和ansible vault

要运行可访问通过Ansible Vault加密的文件的playbook,需要向ansible-playbook命令提供加密密码。如果不提供密码,playbook将返回错误:

[root@ansible project]# tree
.
├── ansible.cfg
├── group_vars
│   ├── db
│   └── httpd
├── host_vars
├── inventory
└── playbook
    ├── test.yml
    └── vars
        └── users.yml

[root@ansible project]# ansible-playbook playbook/test.yml
ERROR! Attempting to decrypt but no vault secrets found

要为playbook提供vault密码,可使用–vault-id选项。例如,要以交互方式提供vault密码,请使用下例中所示的–vault-id @prompt:

[root@ansible project]# ansible-playbook --vault-id @prompt site.yml

使用playbook

[root@ansible project]# ls -a
.  ..  ansible.cfg  group_vars  host_vars  inventory  .ma  .mi  playbook
[root@ansible project]# cat .ma
GHEyNxNbFXWsRq+7weNhtqaglLlEZ6+pHOYHGfEe

[root@ansible playbook]# cat test.yml 
---
- hosts: httpd
  gather_facts: no
  vars_files:
    - vars/users.yml
  tasks:
    - name: create user {{ user }}
      user:
        name: "{{ user }}"
        state: present

[root@ansible playbook]# cat vars/users.yml 
user: tom

[root@ansible project]# ansible-playbook --vault-password-file=.ma playbook/test.yml
PLAY [httpd] *******************************************************************************************************************************************************

TASK [create user tom] *******************************************************************************************************************************************************
changed: [192.168.129.135]

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

[root@httpd ~]# id tom
uid=1001(tom) gid=1001(tom)=1001(tom) 

从Ansible2.4开始,可以通过ansible-playbook使用多个Ansible Vault密码。要使用多个密码,需要将多个–vault-id或–vault-password-file选项传递给ansible-playbook命令。

[root@ansible playbook]# ansible-playbook --vault-id one@prompt --vault-id two@prompt site.yml

三、管理事实

1、描述Ansible事实

事实:就是已经存在的,已经被定义好的
为受管主机收集的一些事实可能包括:

  • 主机名称
  • 内核版本
  • 网络接口
  • IP地址
  • 操作系统版本
  • 各种环境变量
  • CPU数量
  • 提供的或可用的内存
  • 可用磁盘空间

借助事实,可以方便地检索受管主机的状态,并根据该状态确定要执行的操作

  • 可以根据含有受管主机当前内核版本的事实运行条件任务,以此来重启服务器
  • 可以根据通过事实报告的可用内存来自定义MySQL配置文件
  • 可以根据事实的值设置配置文件中使用的IPv4地址
[root@ansible project]# cat playbook/uu.yml
---
- hosts: httpd
  tasks:
    - name: Prints various Ansible facts
      debug:
        var: ansible_facts["all_ipv4_addresses"]

[root@ansible project]# ansible-playbook playbook/uu.yml 
PLAY [httpd] *******************************************************************************************************************************************************

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

TASK [Prints various Ansible facts] *******************************************************************************************************************************************************
ok: [192.168.129.135] => {
    "ansible_facts[\"all_ipv4_addresses\"]": [
        "192.168.129.135",
        "192.168.122.1"
    ]
}

PLAY RECAP *********************************************************************************************************************************************************
192.168.129.135            : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
[root@ansible project]# cat playbook/uu.yml
---
- hosts: httpd
  tasks:
    - name: Prints various Ansible facts
      debug:
        var: ansible_facts["default_ipv4"]

[root@ansible project]# ansible-playbook playbook/uu.yml 

PLAY [httpd] *******************************************************************************************************************************************************

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

TASK [Prints various Ansible facts] *******************************************************************************************************************************************************
ok: [192.168.129.135] => {
    "ansible_facts[\"default_ipv4\"]": {
        "address": "192.168.129.135",
        "alias": "ens160",
        "broadcast": "192.168.129.255",
        "gateway": "192.168.129.2",
        "interface": "ens160",
        "macaddress": "00:0c:29:9f:41:29",
        "mtu": 1500,
        "netmask": "255.255.255.0",
        "network": "192.168.129.0",
        "type": "ether"
    }
}
[root@ansible project]# cat playbook/uu.yml
---
- hosts: httpd
  tasks:
    - name: Prints various Ansible facts
      debug:
        var: ansible_facts["default_ipv4"]["address"]

[root@ansible project]# ansible-playbook playbook/uu.yml 
PLAY [httpd] **************************************************************************************************************************

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

TASK [Prints various Ansible facts] ****************************************************************************************************************************************
ok: [192.168.129.135] => {
    "ansible_facts[\"default_ipv4\"][\"address\"]": "192.168.129.135"
}

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

1.1、Ansible事实的示例

事实变量
短主机名ansible_facts[‘hostname’]
完全限定域名ansible_facts[‘fqdn’]
IPv4地址ansible_facts[‘default_ipv4’][‘address’]
所有网络接口的名称列表ansible_facts[‘interfaces’]
/dev/vda1磁盘分区的大小ansible_facts[‘devices’][‘vda’][‘partitions’][‘vda1’][‘size’]
DNS服务器列表ansible_facts[‘dns’][‘nameservers’]
当前运行的内核版本ansible_facts[‘kernel’]

如果变量的值为散列/字典类型,则可使用两种语法来获取其值。比如:

  • ansible_facts[‘default_ipv4’][‘address’]也可以写成ansible_facts.default_ipv4.address
  • ansible_facts[‘dns’][‘nameservers’]也可以写成ansible_facts.dns.nameservers

在playbook中使用事实时,Ansible将事实的变量名动态替换为对应的值:

[root@ansible ~]# hostname
ansible.example.com
   |		|
 主机名	 完全限定域名
[root@ansible project]# cat  playbook/uu.yml
---
- hosts: httpd
  tasks:
    - name: Prints various Ansible facts
      debug:
        msg: >
          The host named {{ ansible_facts["fqdn"] }} is
          ip is {{ ansible_facts["default_ipv4"]["address"] }}

[root@ansible project]# ansible-playbook playbook/uu.yml 
PLAY [httpd] **********************************************************************************************************************

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

TASK [Prints various Ansible facts] ****************************************************************************************************************************************
ok: [192.168.129.135] => {
    "msg": "The host named ansible.example.com is ip is 192.168.129.135\n"
}

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

2、Ansible事实作为变量注入

Ansible2.5之前,事实是作为前缀为字符串ansible_的单个变量注入,而不是作为ansible_facts变量的一部分注入。例如,ansible_facts[‘distribution’]事实会被称为ansible_distribution。

许多较旧的playbook仍然使用作为变量注入的事实,而不是在ansible_facts变量下创建命名空间的新语法。我们可以使用临时命令来运行setup模块,以此形式显示所有事实的值。以下示例中使用一个临时命令在受管主机192.168.129.133上运行setup模块:

[root@ansible project]# ansible 192.168.129.133 -m setup

2.1选定的Ansible事实名称比较

ansible_facts形式旧事实变量形式
ansible_facts[‘hostname’]ansible_hostname
ansible_facts[‘fqdn’]ansible_fqdn
ansible_facts[‘default_ipv4’][‘address’]ansible_default_ipv4[‘address’]
ansible_facts[‘interfaces’]ansible_interfaces
ansible_facts[‘devices’][‘vda’][‘partitions’][‘vda1’][‘size’]ansible_devices[‘vda’][‘partitions’][‘vda1’][‘size’]
ansible_facts[‘dns’][‘nameservers’]ansible_dns[‘nameservers’]
ansible_facts[‘kernel’]ansible_kernel

将Ansible配置文件的[default]部分中inject_facts_as_vars参数设置为False,可关闭旧命名系统。默认设置目前为True

3、关闭事实收集

有时我们不想为play收集事实。这样做的原因可能有:

  • 不准备使用任何事实
  • 希望加快play速度
  • 希望减小play在受管主机上造成的负载
  • 受管主机因为某种原因无法运行setup模块
  • 需要安装一些必备软件后再收集事实

以上种种原因导致我们可能想要永久或暂时关闭事实收集的功能,要为play禁用事实收集功能,可将gather_facts关键字设置为no:

[root@ansible project]# cat  playbook/uu.yml
---
- hosts: httpd
  gather_facts: no	//禁用事实收集功能
  tasks:
    - name: Prints various Ansible facts
      debug:
        msg: >
          The host named {{ ansible_facts["fqdn"] }} is
          ip is {{ ansible_facts["default_ipv4"]["address"] }}

4、创建自定义事实

除了使用系统捕获的事实外,我们还可以自定义事实,并将其本地存储在每个受管主机上。这些事实整合到setup模块在受管主机上运行时收集的标准事实列表中。它们让受管主机能够向Ansible提供任意变量,以用于调整play的行为。
自定义事实可以在静态文件中定义,格式可为INI文件或采用JSON。它们也可以是生成JSON输出的可执行脚本,如同动态清单脚本一样。

有了自定义事实,我们可以为受管主机定义特定的值,供play用于填充配置文件或有条件地运行任务。动态自定义事实允许在play运行时以编程方式确定这些事实的值,甚至还可以确定提供哪些事实。

默认情况下,setup模块从各受管主机的/etc/ansible/facts.d目录下的文件和脚本中加载自定义事实。各个文件或脚本的名称必须以**.fact**结尾才能被使用。动态自定义事实脚本必须输出JSON格式的事实,而且必须是可执行文件。

以下是采用INI格式编写的静态自定义事实文件。INI格式的自定义事实文件包含由一个部分定义的顶层值,后跟用于待定义的事实的键值对:

//在受管主机上创建/etc/ansble/facts.d
[root@httpd ~]# mkdir -p /etc/ansible/facts.d
[root@httpd facts.d]# vi jj.fact
[root@httpd facts.d]# cat jj.fact
[packages]
web_package = httpd
db_package = mariadb-server

[users]
user1 = jjyy
user2 = ggxx

[root@ansible project]# cat  playbook/uu.yml
---
- hosts: httpd
  tasks:
    - name: Prints various Ansible facts
      debug:
        var: ansible_facts["ansible_local"]
        
[root@ansible project]# ansible-playbook playbook/uu.yml 
PLAY [httpd] *********************************************************************************************************************

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

TASK [Prints various Ansible facts] **********************************************************************************************
ok: [192.168.129.135] => {
    "ansible_facts[\"ansible_local\"]": {
        "jj": {
            "packages": {
                "db_package": "mariadb-server",
                "web_package": "httpd"
            },
            "users": {
                "user1": "jjyy",
                "user2": "ggxx"
            }
        }
    }
}

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

同样的事实可能以JSON格式提供。以下JSON事实等同于以上示例中INI格式指定的事实。JSON数据可以存储在静态文本文件中,或者通过可执行脚本输出到标准输出:

{
  "packages": {
  "web_package": "httpd",
  "db_package": "mariadb-server"
  },
    "users": {
    "user1": "joe",
    "user2": "jane"
  }
}

自定义事实文件不能采用playbook那样的YAML格式。JSON格式是最为接近的等效格式。

自定义事实由setup模块存储在ansible_facts.ansible_local变量中。
事实按照定义它们的文件的名称来整理。例如,假设前面的自定义事实由受管主机上保存为**/etc/ansible/facts.d/custom.fact**的文件生成。在这种情况下,ansible_facts.ansible_local[‘custom’][‘users’][‘user1’]的值为joe

自定义事实的使用方式与playbook中的默认事实相同:

[root@ansible project]# cat  playbook/uu.yml
---
- hosts: all
  tasks:
  - name: Prints various Ansible facts
    debug:
      msg: >
        The package to install on {{ ansible_facts['fqdn'] }}
        is {{ ansible_facts['ansible_local']['cutstom']['packages']['web_package'] }}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值