编写Ansible模块并自定义Facts


背景介绍:
Ansible自带的Facts有很多,但很多时候并不够用。 比如,Ansible就没有ansible_private_ipv4_address这样一个Facts,用来保存私网IP地址。 而我们恰恰就需要这样的一个Facts,因为我们有很多服务器的默认网卡并非是eth0,有的是bond0,eth1,em0,em1等,而公网IP地址与私网IP地址也并没有固定的绑定在某个网卡上,很多时候还是虚拟网卡。 还好,我们可以通过编写Ansible模块并自定义Facts来实现。

具体步骤:
[root@idc-server2 ~]# ifconfig

[root@idc-server1 ansible]# vim myfacts.yml

[root@idc-server1 ansible]# mkdir -p roles/myfacts/{tasks,templates}
[root@idc-server1 ansible]# vim roles/myfacts/tasks/main.yml

[root@idc-server1 ansible]# vim roles/myfacts/templates/myfacts.txt.j2

[root@idc-server1 ansible]# mkdir -p library/heylinux
[root@idc-server1 ansible]# vim library/heylinux/myfacts

[root@idc-server1 ansible]# ansible-playbook -u root myfacts.yml -i hosts

[root@idc-server1 ansible]# ssh idc1-server2 'cat /tmp/myfacts.txt'

,

  1. #1 by mcsrainbow on 2016/08/12 - 13:25

    更简单的方式:
    $ cat /etc/ansible/facts.d/datacenter.fact
    #!/bin/bash

    #This will set a ansible_local.datacenter.location fact
    #This tries to handle the 2 ways we name hosts.
    DC1=$(hostname -f | cut -d'.' -f2) # host.datacenter.heylinux.com
    DC2=$(hostname -f | cut -d'-' -f1) # datacenter-host.heylinux.com

    if [[ ${DC1} == "heylinux" ]]; then
    DC=${DC2}
    else
    DC=${DC1}
    fi

    cat <<EOF
    {
    "location" : "${DC}"
    }
    EOF

(will not be published)
*