一、基础环境
1、在tvm-saltmaster的基础上操作。
2、网络:
eth0:host-only(用于虚拟内网,手动固定IP,这样从宿主机可以直接连接到这个vm)
eth1:NAT(用于上外网,动态IP)
[root@tvm-saltmaster ~]# cd /etc/sysconfig/network-scripts/
[root@tvm-saltmaster network-scripts]# cat ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
IPADDR=192.168.56.253
PREFIX=24
GATEWAY=192.168.56.1
DNS1=192.168.56.254
[root@tvm-saltmaster network-scripts]# cat ifcfg-eth1
DEVICE=eth1
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=dhcp
DNS1=192.168.56.254
二、salt-master大致上是啥样的
1、基本结构
[root@tvm-saltmaster salt]# tree /srv/
/srv/
├── pillar
│ ├── job
│ │ └── init.sls
│ ├── package
│ │ └── init.sls
│ └── top.sls
└── salt
├── base
│ ├── abc
│ │ ├── hosts.sls
│ │ ├── init.sls
│ │ ├── locale.sls
│ │ ├── ntp.sls
│ │ ├── packages.sls
│ │ ├── resolv.sls
│ │ └── yum.sls
│ ├── conf.d
│ │ ├── dnsmasq
│ │ │ └── office.conf
│ │ │ ├── locale
│ │ │ │ ├── ntp.conf
│ │ │ │ ├── README.txt
│ │ │ │ ├── sysconfig_i18n
│ │ │ │ ├── sysconfig_ntpd
│ │ │ │ └── tpl.ntp.conf
│ │ ├── monit
│ │ │ ├── monit-mail.conf
│ │ │ └── salt-minion.conf
│ │ ├── resolv
│ │ │ ├── client.conf
│ │ │ └── server.conf
│ │ ├── ssh
│ │ │ └── sshd_config
│ │ ├── vim
│ │ │ └── vimrc
│ │ └── yum
│ │ └── local-office.repo
│ ├── crontab
│ │ └── init.sls
│ ├── dnsmasq
│ │ └── init.sls
│ ├── monit
│ │ └── init.sls
│ ├── postfix
│ │ └── init.sls
│ ├── README.TXT
│ ├── salt
│ │ └── minion.sls
│ ├── ssh
│ │ └── init.sls
│ ├── top.sls
│ ├── vim
│ │ └── init.sls
│ └── web
│ └── init.sls
├── dev
│ ├── top.sls
│ └── web.sls
├── prod
│ ├── top.sls
│ └── web.sls
└── qa
├── conf.d
│ └── crontab
│ └── client.conf
├── crontab
│ └── init.sls
└── top.sls
27 directories, 33 files
注意:
1)/srv/salt & /srv/pillar是安装完成后默认的路径
2)/srv/salt 下面粉了4个环境,这个是测试多环境的意图,具体配置是在这里定义的:
[root@tvm-saltmaster salt]# cat /etc/salt/master.d/file_roots.conf
# Master file_roots configuration:
file_roots:
base:
- /srv/salt/base
dev:
- /srv/salt/dev
qa:
- /srv/salt/qa
prod:
- /srv/salt/prod
[root@tvm-saltmaster salt]# mkdir /srv/salt/{base,dev,qa,prod}/ -p
[root@tvm-saltmaster salt]# service salt-master restart
3)默认是在base环境下,这是不可缺的。以base环境为根,我们再继续往下看
4)【top.sls】,这个是一个环境的入口,可以匹配target,指定以“.sls”为后缀来定义的salt state文件,例如:
[root@tvm-saltmaster salt]# cat base/top.sls
base:
'tvm-yum':
- dnsmasq
- crontab
- web
'*':
- abc
- monit
- postfix
- salt.minion
- ssh
- vim
上面指定了dnsmasq,其实对应的就是/srv/salt/base/dnsmasq.sls,但我们改进成通过目录来管理,因此变成:
/srv/salt/base/dnsmasq/init.sls,因此我们得到6)的经验
5)【init.sls】,这个特殊的sls会继承当前目录的名称
6)通常是用多级目录来分类管理sls文件,例如:
salt.minion,对应的是:/srv/salt/base/salt/minion.sls
依此类推,还可以划分的更细。
2、如何让minion的state变成我们期望的那样呢?
1)首先,我们知道可以执行指定的模块.函数来执行salt命令
salt 'tvm-test' cmd.run 'hostname'
2)其实执行state也是类似的。指定了target主机为:'tvm-test' ,再指定一个sls文件“web.sls”,默认的saltenv='base'
salt 'tvm-test' state.sls web
3)指定一个其他的saltenv
salt 'tvm-test' state.sls crontab saltenv='qa'
4)测试开关
salt 'tvm-test' state.sls crontab saltenv='qa' test=True
5)highstate方式,minions从salt-master拉取自己匹配的所有的state数据,并执行
salt '*' state.highstate
6)salt执行后的输出太多怎么办?
[root@tvm-saltmaster base]# salt '*' state.highstate --out-file=/tmp/salt.log
强制将输出重定向到文件,默认是在cat时带有颜色显示。可以对比一下,用>/tmp/salt.log来输出是没有颜色显示的。
三、/srv/pillar
pillar经常拿来和grains做对比。官网也有介绍:
Grains and Pillar are sometimes confused, just remember that Grains are data about a minion which is stored or generated from the minion. This is why information like the OS and CPU type are found in Grains. Pillar is information about a minion or many minions stored or generated on the Salt Master.
后者(grains)记录了minions中包括了os,cpu等相对静态的k/v键值对的数据,通常是来自salt-minion上报的信息。
前者(pillar)咱们可以定义一些自定义的参数供salt的sls文件来引用,这个通常是在salt-master上为minions而定义的。
1、入口文件
[root@tvm-saltmaster salt]# cat /srv/pillar/top.sls
base:
'*':
- package
- job
2、针对安装包,指定vim和apache的k/v键值对
[root@tvm-saltmaster salt]# cat /srv/pillar/package/init.sls
pkgs:
{% if grains['os_family'] == 'RedHat' %}
vim: vim-enhanced
apache: httpd
{% elif grains['os_family'] == 'Debian' %}
vim: vim
apache: apache2
{% elif grains['os'] == 'Arch' %}
vim: vim
apache: httpd
{% endif %}
3、针对highstate,定义一个schedule
[root@tvm-saltmaster salt]# cat /srv/pillar/job/init.sls
schedule:
highstate:
function: state.highstate
minutes: 2
四、/srv/salt
这里定义了一些state文件,重点是“base”这个环境,其次是在“qa”这个环境做一些测试的工作。
1、首先,我们保证“tvm-yum”上安装的dnsmasq,crontab和web中的服务是符合预期
1)配置dnsmasq服务的状态是:正在运行、开机启动,配置文件变得可以重启服务。
这里用到了:“pkg.installed, service.running, file.replace”
-------------------------------------------------------------dnsmasq
[root@tvm-saltmaster salt]# cat base/dnsmasq/init.sls
dnsmasq:
pkg.installed: []
service.running:
- enable: True
- restart: True
- watch:
- file: /etc/dnsmasq.d/office.conf
- file: /etc/dnsmasq.conf
/etc/dnsmasq.d/office.conf:
file.managed:
- source: salt://conf.d/dnsmasq/office.conf
/etc/dnsmasq.conf:
file.replace:
- pattern: '#addn-hosts=/etc/banner_add_hosts'
- repl: 'addn-hosts=/etc/dnsmasq.d/office.conf'
-------------------------------------------------------------dnsmasq end
2)配置crontab服务的状态是:定时执行指定的脚本。
这里用到了:“cron.present”
-------------------------------------------------------------crontab
[root@tvm-saltmaster salt]# cat base/crontab/init.sls
## 使用cron.present这个方法来控制,默认是追加到现有的crontab中
crontab-REPO-UPDATE:
cron.present:
- identifier: CRON-REPO-UPDATE
- name: '/bin/bash /data/ops/bin/repo_update.sh >/tmp/repo_update.log 2>&1 &'
- user: root
- minute: '0'
- hour: '12'
- daymonth: '*'
- month: '*'
- dayweek: '*'
-------------------------------------------------------------crontab end
3)配置web服务的状态是:正在运行和开机启动。(当然,此处的处理简略粗糙)
这里用到了:“pkg.installed, service.running, pillar”
-------------------------------------------------------------web
[root@tvm-saltmaster salt]# cat base/web/init.sls
apache:
pkg.installed:
- name: {{ pillar['pkgs']['apache'] }}
service.running:
- name: {{ pillar['pkgs']['apache'] }}
- enable: True
- require:
- pkg: apache
-------------------------------------------------------------web end
2、接着,我们在“abc”中列出了基本的安装包和域名解析相关的配置文件,期望的定位是:在主机上线前固定不变的一些初始化操作。
1)“init.sls”用“include”来包含了几个分类的状态文件。
这里用到了:“include”
-------------------------------------------------------------abc init
[root@tvm-saltmaster salt]# cat base/abc/init.sls
include:
- abc.hosts
- abc.resolv
- abc.yum
- abc.locale
- abc.ntp
- abc.packages
-------------------------------------------------------------abc init end
2)“hosts.sls”更新了“/etc/hosts”文件。
这里用到了:“file.append”:
-------------------------------------------------------------abc hosts
[root@tvm-saltmaster salt]# cat base/abc/hosts.sls
/etc/hosts:
file.append:
- text:
- '192.168.56.253 salt-m.office.test'
- '192.168.56.254 mirrors.office.test'
- "127.0.0.1 {{ grains['id'] }}"
-------------------------------------------------------------abc hosts end
3)“resolv.sls”更新了/etc/resolv.conf文件。
这里用到了:“if..else..endif, grains”
-------------------------------------------------------------abc resolv
[root@tvm-saltmaster salt]# cat base/abc/resolv.sls
/etc/resolv.conf:
file.managed:
{% if grains['id'] == 'tvm-yum' %}
- source: salt://conf.d/resolv/server.conf
{% else %}
- source: salt://conf.d/resolv/client.conf
{% endif %}
-------------------------------------------------------------abc resolv end
4)指定yum源的配置。
这里用到了:“file.managed”
-------------------------------------------------------------abc yum
[root@tvm-saltmaster salt]# cat base/abc/yum.sls
/etc/yum.repos.d/local-office.repo:
file.managed:
- name: /etc/yum.repos.d/local-office.repo
- source: salt://conf.d/yum/local-office.repo
- mode: 644
-------------------------------------------------------------abc end
5)指定i18n,timezone和ntp这类本地化的配置
这里用到了:“file.managed, file.copy, pkg.installed, service.running”
-------------------------------------------------------------abc locale
[root@tvm-saltmaster salt]# cat base/abc/locale.sls
## update i18n settings
#
# via pc @ 2015/8/19
/etc/sysconfig/i18n:
file.managed:
- source: salt://conf.d/locale/sysconfig_i18n
-------------------------------------------------------------abc locale end
-------------------------------------------------------------abc ntp
[root@tvm-saltmaster salt]# cat base/abc/ntp.sls
## use local timezone and ntp settings
#
# via pc @ 2015/8/19
/etc/localtime:
file.copy:
- source: /usr/share/zoneinfo/Asia/Shanghai
- force: True
pkg-ntp-start:
pkg.installed:
- name: ntp
file.managed:
- name: /etc/ntp.conf
- source: salt://conf.d/locale/ntp.conf
- requires:
- pkg: ntp
service.running:
- name: ntpd
- enable: True
- reload: True
- watch:
- file: /etc/ntp.conf
- require:
- pkg: ntp
- require_in:
- file: /etc/sysconfig/ntpd
/etc/sysconfig/ntpd:
file.managed:
- source: salt://conf.d/locale/sysconfig_ntpd
-------------------------------------------------------------abc ntp end
6)指定要安装的包。
这里用到了:“pkg.installed, pkgs, pkg.latest”
-------------------------------------------------------------abc packages
[root@tvm-saltmaster salt]# cat base/abc/packages.sls
## 此处列出主机上线时需要的软件包
#
common-pkgs:
pkg.installed:
- pkgs:
- lrzsz
- wget
- curl
- rsync
- screen
- dos2unix
- tree
- ntp
- bind-utils
- nc
- telnet
- git
## 此处列出需要update的软件包
#
up2date-pkgs:
pkg.latest:
- pkgs:
- bash
- openssl
-------------------------------------------------------------abc packages end
3、最后,给出了一些自定义的配置的示例,例如针对monit,postfix,salt,ssh和vim的配置。
1)配置monit,salt的状态是:正在运行和开机启动,并配置禁用了postfix服务。
这里用到了:“pkg.installed, service.running, file.managed, service.disabled, pillar”
-------------------------------------------------------------monit
[root@tvm-saltmaster salt]# cat base/monit/init.sls
monit:
pkg.installed: []
service.running:
- enable: True
/etc/monit.d/monit-mail.conf:
file.managed:
- source: salt://conf.d/monit/monit-mail.conf
- require:
- pkg: monit
/etc/monit.d/salt-minion.conf:
file.managed:
- source: salt://conf.d/monit/salt-minion.conf
- require:
- pkg: monit
-------------------------------------------------------------monit end
-------------------------------------------------------------postfix
[root@tvm-saltmaster salt]# cat base/postfix/init.sls
postfix:
pkg.installed: []
service.disabled: []
-------------------------------------------------------------postfix end
-------------------------------------------------------------salt
[root@tvm-saltmaster salt]# cat base/salt/minion.sls
salt-minion:
pkg.installed: []
service.running:
- enable: True
-------------------------------------------------------------salt end
-------------------------------------------------------------ssh
[root@tvm-saltmaster salt]# cat base/ssh/init.sls
openssh-clients:
pkg.installed: []
openssh-server:
pkg.installed: []
sshd:
service.running:
- enable: True
- require:
- pkg: openssh-clients
- pkg: openssh-server
- file: /etc/ssh/sshd_config
/etc/ssh/sshd_config:
file.managed:
- source: salt://conf.d/ssh/sshd_config
- require:
- pkg: openssh-server
-------------------------------------------------------------ssh end
-------------------------------------------------------------vim
[root@tvm-saltmaster salt]# cat base/vim/init.sls
vim:
pkg.installed:
- name: {{ pillar['pkgs']['vim'] }}
/root/.vimrc:
file.managed:
- source: salt://conf.d/vim/vimrc
- require:
- pkg: vim
-------------------------------------------------------------vim end
4、中间的2个环境略过,再看看qa环境的配置.
这里用到了:“cron.file”
-------------------------------------------------------------qa
[root@tvm-saltmaster salt]# cat qa/top.sls
qa:
'* and not tvm-yum':
- crontab
[root@tvm-saltmaster salt]# cat qa/crontab/init.sls
## 使用cron.file这个方法来控制,可以替换全部的crontab内容
cron-ntpdate-office:
cron.file:
- name: salt://conf.d/crontab/client.conf
-------------------------------------------------------------qa end
要注意,这里是用“name”,而不是“source”来指定文件路径。
五、小结一下state
1、state.sls, state.highstate
2、pkg
pkg.installed
pkg.latest
pkgs
3、file
file.managed
file.replace
file.append
file.copy
4、service
service.running
service.disabled
5、cron
cron.present
cron.file
6、grains
7、pillars
8、include
ZYXW、参考
1、官网doc
http://docs.saltstack.com/en/latest/topics/tutorials/pillar.html
http://docs.saltstack.com/en/latest/ref/modules/all/salt.modules.state.html
http://docs.saltstack.com/en/latest/ref/states/requisites.html
http://docs.saltstack.com/en/latest/ref/states/all/salt.states.cron.html
http://docs.saltstack.com/en/latest/ref/states/all/salt.states.file.html
http://docs.saltstack.com/en/latest/ref/states/all/salt.states.pkg.html
http://docs.saltstack.com/en/latest/ref/states/all/salt.states.service.html
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com