SaltStack master file_roots 变量与 salt 命令执行的关系

一、第一种目录结构方式

1、salt-master 配置

# cat /etc/salt/master
…… 省略内容
file_roots:
  base:
    - /srv/salt/base
  prod:
    - /srv/salt/prod
…… 省略内容
pillar_roots:
  base:
    - /srv/salt/base
  prod:
    - /srv/pillar/prod
…… 省略内容

2、目录结构

[root@salt-master ~]# tree /srv/
/srv/
├── pillar
│   ├── base
│   │   └── top.sls
│   └── prod
│       └── haproxy
│           └── default.sls
└── salt
    ├── base
    │   ├── init
    │   │   ├── dns.sls
    │   │   ├── env_init.sls
    │   │   ├── files
    │   │   │   └── resolv.conf
    │   │   └── sysctl.sls
    │   └── top.sls
    └── prod
        ├── haproxy
        │   ├── config.sls
        │   ├── files
        │   │   ├── haproxy-1.8.14.tar.gz
        │   │   ├── haproxy.cfg
        │   │   └── haproxy.init
        │   └── install.sls
        └── pkg
            └── pkg-init.sls

12 directories, 13 files

重要提示:salt 命令的执行跟 file_roots 的配置有关

3、执行单个 sls 文件

// 在 /etc/salt/master file_roots.base 配置的目录(/srv/salt/base)中的文件可以直接执行
[root@salt-master init]# pwd
/srv/salt/base/init
[root@salt-master init]# ls
dns.sls  env_init.sls  files  sysctl.sls
[root@salt-master init]# salt 'salt-minion' state.apply init.dns

// 在 /etc/salt/master file_roots.prod 配置的目录(/srv/salt/prod)中的文件不可以直接执行,会提示“No matching sls found for 'xxx' in env 'base'”
[root@salt-master haproxy]# pwd
/srv/salt/prod/haproxy
[root@salt-master haproxy]# ls
config.sls  files  install.sls
[root@salt-master haproxy]# salt 'salt-minion' state.apply haproxy.config 
salt-minion:
    - No matching sls found for 'haproxy.config' in env 'base'
ERROR: Minions returned with non-zero exit code

// 要指定 file_roots 中的 prod 变量执行
[root@salt-master haproxy]# salt 'salt-minion' state.apply saltenv='prod' haproxy.config

4、查看应用 sls 文件的执行顺序

// 在 /etc/salt/master file_roots.base 配置的目录(/srv/salt/base)
[root@salt-master init]# salt 'salt-minion' state.show_sls init.dns

// 在 /etc/salt/master file_roots.prod 配置的目录(/srv/salt/prod)
# salt 'salt-minion' state.show_sls saltenv='prod' haproxy.config

5、执行 top.sls

[root@salt-master ~]# pwd
/root

[root@salt-master ~]# ll /srv/salt/base/top.sls 
-rw-r--r-- 1 root root 79 Sep 29 15:31 /srv/salt/base/top.sls

// 会找到在 /etc/salt/master file_roots.base 配置的目录(/srv/salt/base)的 top.sls 来执行 
[root@salt-master ~]# salt 'salt-minion' state.highstate

二、第二种目录结构方式

1、salt-master 配置

# cat /etc/salt/master
…… 省略内容
file_roots:
  base:
    - /srv/salt
  prod:
    - /srv/salt/prod
…… 省略内容
pillar_roots:
  base:
    - /srv/pillar
  prod:
    - /srv/pillar/prod
…… 省略内容

2、目录结构

[root@salt-master ~]# tree /srv/
/srv/
├── pillar
│   ├── prod
│   │   └── haproxy
│   │       └── default.sls
│   └── top.sls
└── salt
    ├── init
    │   ├── dns.sls
    │   ├── env_init.sls
    │   ├── files
    │   │   └── resolv.conf
    │   └── sysctl.sls
    ├── prod
    │   ├── haproxy
    │   │   ├── config.sls
    │   │   ├── files
    │   │   │   ├── haproxy-1.8.14.tar.gz
    │   │   │   ├── haproxy.cfg
    │   │   │   └── haproxy.init
    │   │   └── install.sls
    │   └── pkg
    │       └── pkg-init.sls
    └── top.sls

10 directories, 13 files

重要提示:salt 命令的执行跟 file_roots 的配置有关

3、执行单个 sls 文件

// init 目录在 /etc/salt/master file_roots.base 配置的目录(/srv/salt)下可以直接执行
[root@salt-master init]# pwd
/srv/salt/init
[root@salt-master init]# ls
dns.sls  env_init.sls  files  sysctl.sls
[root@salt-master init]# salt 'salt-minion' state.apply init.dns

[root@salt-master haproxy]# pwd
/srv/salt/prod/haproxy

// prod 目录也在 /etc/salt/master file_roots.base 配置的目录(/srv/salt)下,但是 /etc/salt/master 中也定义了 file_roots.prod 变量,所以要加上 saltenv='prod' 来执行
[root@salt-master haproxy]# salt 'salt-minion' state.apply haproxy.config
salt-minion:
    - No matching sls found for 'haproxy.config' in env 'base'

[root@salt-master haproxy]# salt 'salt-minion' state.apply saltenv='prod' haproxy.config

4、查看应用 sls 文件的执行顺序

// 在 /etc/salt/master file_roots.base 配置的目录(/srv/salt)
[root@salt-master init]# salt 'salt-minion' state.show_sls init.dns

// 在 /etc/salt/master file_roots.prod 配置的目录(/srv/salt/prod)
# salt 'salt-minion' state.show_sls saltenv='prod' haproxy.config

5、执行 top.sls

[root@salt-master ~]# pwd
/root
[root@salt-master ~]# ll /srv/salt/top.sls 
-rw-r--r-- 1 root root 79 Sep 29 15:31 /srv/salt/top.sls

// 会找到在 /etc/salt/master file_roots.base 配置的目录(/srv/salt)的 top.sls 来执行 
[root@salt-master ~]# salt 'salt-minion' state.highstate

三、top.sls 说明

[root@salt-master ~]# cat /srv/salt/top.sls 
base:
  '*':
    - init.env_init 
// 1、执行在 /etc/salt/master file_roots.base 配置的目录(/srv/salt)下的 init.env_init sls 文件
// 2、'*' 代表了匹配所有主机,可以这样指定所有主机 salt '*' state.highstate 执行,也可以指定具体的主机执行 salt 'salt-minion' state.highstate  

prod:
  'salt-minion':
    - haproxy.config
// 1、执行在 /etc/salt/master file_roots.prod 配置的目录(/srv/salt/prod)下的 haproxy.config sls 文件
// 2、'salt-minion' 代表了只匹配 salt-minion 的主机,可以这样指定所有主机 salt '*' state.highstate 执行,但其他主机不会执行 haproxy.confg,因为不匹配 top.sls 指定的 'salt-minion',只有匹配 'salt-minion' 的主机会执行
// 3、就是说匹配优先级: top.sls 中的主机匹配 > salt 命令执行时的主机匹配 
// 4、也可以指定具体的主机执行 salt 'salt-minion' state.highstate 

[root@salt-master ~]#
# cat /srv/pillar/top.sls 
prod:
  '*':
    - haproxy.default

你可能感兴趣的:(SaltStack master file_roots 变量与 salt 命令执行的关系)