管理变量、机密和事实

  • 一、管理变量
    • 1、Ansible变量简介
    • 2、命名变量
    • 3、定义变量
    • 4、playbook中的变量
    • 5、主机变量和组变量
      • 使用目录填充主机和组变量
    • 6、从命令行覆盖变量
    • 7、使用数组作为变量
    • 8、使用已注册变量捕获命令输出
  • 二、管理机密
    • 1、Anssible Vault
      • 2.1、创建加密文件
      • 2.2、查看加密文件
      • 2.3、解密码文件
      • 2.4、编辑现有的加密文件
      • 2.5、加密现有的文件
      • 2.6、更改加密文件的密码
    • 2、playbook和ansible vault
  • 三、管理事实
    • 1、描述Ansible事实
      • 1.1、Ansible事实的示例
    • 2、Ansible事实作为变量注入
      • 2.1选定的Ansible事实名称比较
    • 3、关闭事实收集
    • 4、创建自定义事实

一、管理变量

1、Ansible变量简介

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

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

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

2、命名变量

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

无效的变量名称 有效的变量名称
web server web_server
remote.file remote_file
1st file file_1
file1
remoteserver$1 remote_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: allvars:user: alicehome: /home/alice

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

[root@192 playbook]# cat test.yml
---
- hosts: allvars_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 joename: "{{ 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: task1hosts: httpdtasks: - 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: Boblast_name: joneshome_dir: /users/bjonesacook:first_name: Annelast_name: Cookhome_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 resulthosts: alltasks:- name: Install the packageyum:name: httpdstate: installedregister: install_result               - debug: var=install_result

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

[root@192 playbook]# ansible-playbook www.ymlPLAY [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: httpdgather_facts: novars_files:- vars/users.ymltasks:- 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: httpdtasks:- name: Prints various Ansible factsdebug: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: httpdtasks:- name: Prints various Ansible factsdebug: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: httpdtasks:- name: Prints various Ansible factsdebug: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: httpdtasks:- name: Prints various Ansible factsdebug:msg: >The host named {{ ansible_facts["fqdn"] }} isip 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: httpdgather_facts: no  //禁用事实收集功能tasks:- name: Prints various Ansible factsdebug:msg: >The host named {{ ansible_facts["fqdn"] }} isip 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: httpdtasks:- name: Prints various Ansible factsdebug: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: alltasks:- name: Prints various Ansible factsdebug:msg: >The package to install on {{ ansible_facts['fqdn'] }}is {{ ansible_facts['ansible_local']['cutstom']['packages']['web_package'] }}

管理变量、机密和事实相关推荐

  1. Ansible的管理变量、机密和事实

    文章目录 管理变量.机密和事实 1.管理变量 1.1Ansible变量简介 1.1.1 命令变量 1.12 定义变量 1.2 playbook中的变量 1.2.1在Playbook中定义变量 1.2. ...

  2. ansible之机密、事实、循环

    ansible之机密.事实.循环 1. 机密管理 1.1 创建加密文件 1.2 查看加密文件 1.3 编辑加密文件 1.4 加密现有的文件 1.5解密现有的文件 1.6 更改加密文件的密码 1.7 加 ...

  3. python内存管理 变量无需事先声明_python 内存管理

    内存管理 包括: 变量无须事先声明 变量无须指定类型 不用关心内存管理 变量名会被"回收" del 语句能够直接释放资源 变量定义 python中, 变量在第一次被赋值时自动声明, ...

  4. 在Asp.NET Core中如何优雅的管理用户机密数据

    在Asp.NET Core中如何优雅的管理用户机密数据 背景 回顾 在软件开发过程中,使用配置文件来管理某些对应用程序运行中需要使用的参数是常见的作法. 在早期VB/VB.NET时代,经常使用.ini ...

  5. Uipath 认识变量及如何管理变量

    Uipath 管理变量 文章目录 Uipath 管理变量 前言 一.认识变量 二.管理变量 1.创建变量 2.删除变量 前言 本节主要介绍Uipath Studio 变量使用及如何进行管理变量. 一. ...

  6. 13、内存管理—变量作用

    内存管理-变量作用 一.普通局部变量 include <stdio.h>int main(int argc, char const *argv[]) {int a = 10;if(1){i ...

  7. python内存管理变量_Python变量内存管理

    Python变量内存管理 一 .引入 解释器在执行到定义变量的语法时,会申请内存空间来存放变量的值,而内存的容量是有限的,这就涉及到变量值所占用内存空间的回收问题,当一个变量值没有用了(简称垃圾)就应 ...

  8. python内存管理 变量无需事先声明_Python 快速入门

    一团网资讯 一团资讯 > python > Python 快速入门 Python 快速入门 2017-11-09 03:01:22     发布者:来源网络 1.Python语句中一些基本 ...

  9. python内存管理 变量无需事先声明_关于python本身的内存管理

    一.在python中,变量和内存管理的特点 1.变量无需事先声明 2.变量无需指定类型 3.程序员不用关心内存的管理问题 4.变量名会被回收 5.del语句能够直接释放资源 二.内存分配问题 在为变量 ...

  10. python内存管理 变量无需指定类型_Python内存管理

    到现在为止,你已经看了不少Python代码的例子.我们本节的主题是变量和内存管理的细节,包括: 变量无需事先声明. 变量无需指定类型. 程序员不用关心内存管理. 变量名会被"回收" ...

最新文章

  1. java 获取泛型_Java泛型 | Jackson TypeReference获取泛型类型信息
  2. php怎么写获取手机剪切板到搜索栏,如何根据指定的剪切板获取html?
  3. 04 javascirpt基础知识---听课笔记
  4. 3,ORM组件XCode(简介)
  5. 又到中元节 应用宝教你如何打败各种鬼
  6. 深入JVM虚拟机(四) Java GC收集器
  7. memcached和php关系,php – memcacheD这没关系?
  8. excel如何快速选中某个区域
  9. C语言课后习题(2)
  10. linux抹掉所有分区,找到了linux分区顺序错乱修复方法
  11. 在.net中创建外接程序
  12. 使用SQL语句的子查询批量复制表数据
  13. 算术收益率与对数收益率(几何收益率)
  14. html 选择列表框,列表框的selected属性
  15. 图片上的文字用CSS写出毛玻璃效果
  16. 微信小程序-如何申请百度开放平台的密钥
  17. 电脑里的计算机无法打字,电脑键盘无法打字的原因及解决方案
  18. Javascript删除网页悬浮广告(一)
  19. 学习SSH远程登陆协议与TCP Wrappers
  20. php命名错误,php – ZipArchive :: close():重命名临时文件失败:权限被拒绝

热门文章

  1. python书籍推荐django_关于Django,我想推荐这样一本书给你
  2. 清华领军计划计算机试题,清华大学2017年自主招生领军计划笔试真题
  3. 1582年日历怎么了_1582年从10月5日到15日到底发生了什么?为何所有日历全是空白?...
  4. 艾默生首席执行官范大为退休;液化空气将新建生产装置为京东方供应气体 | 美通企业日报...
  5. 系统封装失败遇到windows 无法分析或处理
  6. SHOWWINDOW最小化不好用
  7. 域和工作组的概念以及区别
  8. qq邮箱发件转发php,phpmailer 利用qq邮箱转发邮件的问题
  9. 【环境】NVIDIA驱动安装+cuda11.0(ubuntu16.04)
  10. python的三种将整数转换成二进制的方法