一、第一种目录结构方式
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