7.7 SaltStack 入门指南

image0


一、安装SaltStack

1.1 准备工作

准备两台机器,一台做master,一台做minion。 保证两台的内网可通信。

这个master和minion都要设定。才能安装。

导入yum源认证的公钥

rpm --import https://repo.saltstack.com/yum/redhat/7/x86_64/latest/SALTSTACK-GPG-KEY.pub

安装yum源

# $vim /etc/yum.repos.d/saltstack.repo

[saltstack-repo]
name=SaltStack repo for RHEL/CentOS $releasever
baseurl=https://repo.saltstack.com/yum/redhat/$releasever/$basearch/latest
enabled=1
gpgcheck=1
gpgkey=https://repo.saltstack.com/yum/redhat/$releasever/$basearch/latest/SALTSTACK-GPG-KEY.pub

1.2 master

安装salt-master

yum install -y salt-master

设定开机自启,并启动salt-master

chkconfig salt-master on
service salt-master start

开启端口

firewall-cmd --permanent --zone=public --add-port=4505-4506/tcp
firewall-cmd --reload

1.3 minion

安装salt-minion

yum install -y salt-minion

修改配置 vim /etc/salt/minion

# 填写master的ip
master: 192.168.1.80

# 设定client的id/name,这里以hostname为例
id: nfs-server

开启firewalld端口

service firewalld start
firewall-cmd --permanent --zone=public --add-port=4505-4506/tcp

设定iptables

# 如果没有安装iptables,需要先安装
yum install iptables-services

iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 4505 -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 4506 -j ACCEPT

service iptables save

设定开机自启,并启动salt-minion

chkconfig salt-minion on
service salt-minion restart

二、认证工作

重启minion的服务后,在master上执行salt-key -L可以查看所有认证相关信息列表,salt-key -A可以通过所有认证。

其他相关命令还有

salt-key -L              ## 查看所有minion-key
salt-key -a <key-name>   ## 接受某个minion-key
salt-key -d <key-name>   ## 删除某个minion-key
salt-key -A              ## 接受所有的minion-key
salt-key -D              ## 删除所有的minion-key

三、模块介绍

3.1 Jinjia2模板

在介绍各种模块之前先提一下jinjia模板

我们可以在sls文件里使用Jinjia2模板语言

关于Jinjia2模板语言可以参看 http://jinja.pocoo.org/docs/2.10/

在Jinjia2模板里,我们使用salt的各种基础组件来获取变量,通常使用的有salt,grains,pillar三种

3.2 State

state功能 state是Saltstack最核心的功能,通过预先定制好的sls(salt state file)文件对被控制主机进行状态管理,支持包括程序包(pkg)、文件(file)、网络配置(network)、系统服务(service)、系统用户(user)等。

state的定义 state的定义是通过sls文件进行描述的,支持YAML语法,定义规则如下:

$ID: # 定义state名称,若是文件,可以文件名命名,若是服务,可以服务名命名等等
  $state: # 须管理对象的类型:pkg,service,file,network,user
    - $state: states # 定制对象的状态,不同类型的状态不一样

服务/软件管理

apache:
  pkg:
    - installed
  service:
    - running
    - require:
      - pkg: apache
# -------------或者这么写-------------------------
# <state_module>.<function>

apache:
  pkg.installed: []
  service.running:
    - require:
      - pkg: apache

pkg要执行的方法:install,如未安装就进行安装,后面pkg.installed: []没有指定安装包,就会以name apache为准。 否则就应该是这样,会要求安装iptables-services

unzip_VmpControllerRpmPackages:
    pkg.installed:
        - pkgs:
          - iptables-services

service要执行的方法:running,如未运行就进行启动 关键字require,确保apache服务只有在成功安装软件包后才会启动

来看一个复杂一点的例子

apache:
  pkg.installed: []
  service.running:
    - watch:
      - pkg: apache
      - file: /etc/httpd/conf/httpd.conf
      - user: apache
  user.present:
    - uid: 87
    - gid: 87
    - home: /var/www/html
    - shell: /bin/nologin
    - require:
      - group: apache
  group.present:
    - gid: 87
    - require:
      - pkg: apache

/etc/httpd/conf/httpd.conf:
  file.managed:
    - source: salt://apache/httpd.conf
    - user: root
    - group: root
    - mode: 644

这里新增了一个watch,它是做什么用的。顾名思义,监听。 它会时刻监听pkg:apache 这个包若有更新,或者配置文件file: /etc/httpd/conf/httpd.conf 有更改,又或者用户uid user: apache 有变化,只要前面三个条件有一个变更了都会触发service.running执行

执行远程脚本

unzip_VmpControllerRpmPackages:
    cmd.script:
        - source: salt://controller/openstack-controller/files/VmpControllerInsttall.sh
        - user: root

推送文件

/etc/neutron/plugin.ini:
    file.managed:
        - name: /etc/neutron/plugin.ini
        - source: salt://controller/openstack-controller/files/plugin.ini
        - user: neutron
        - group: neutron
        - mode: 640
        - template: jinja

3.3 Grains

# 查看nfs-server这一台的grains变量,如果要查看所有就换成 *
salt 'nfs-server' grains.items

# 我们也可以自定义pillar,后面的文件名可以自已命名
# 自定义完需要同步一下,salt '*' saltutil.sync_all
vim /etc/salt/minion.d/mygrains.conf

grains:
    cloud:
        int-iface: eth1
        out-iface: eth0

grains函数:salt.modules.grains

3.4 Pillar

/srv/pillar 目录下

# /srv/pillar目录是在哪里定义的,下面是默认的
# vim /etc/salt/master
pillar_roots:
  base:
    - /srv/pillar

有一个top.sls这是入口 我们自己写一个common.sls文件,里面自定义我们的变量

# 简单点
apache: httpd

# 复杂点
host_ip: {{ grains['ip4_interfaces'][grains['cloud']['int-iface']] }}

# 使用jinjia模板语言
{% if grains['os'] == 'CentOS' %}
apache: httpd
git: git
{% elif grains['os'] == 'Debian' %}
apache: apache2
git: git-core
{% endif %}

查看pillar变量

salt '*' pillar.items
salt 'nfs-server' pillar.items 或者 salt 'nfs-server' pillar.data
salt 'nfs-server' pillar.get host_ip
salt 'nfs-server' pillar.get host_ip:private

# 在master上修改Pilla文件后,需要用以下命令刷新minion上的数据
salt 'nfs-server' saltutil.refresh_pillar

salt.pillar函数:salt.modules.pillar

在state中如何调用pillar变量

1. {{ pillar['apache']}}
2. {{ salt['pillar.get']('apache') }} 或者指定默认值 {{ salt['pillar.get']('apache', 'httpd') }}

四、目录结构

主目录/srv/salt/ salt:// == /srv/salt/ 在这里配置vim /etc/salt/master

file_roots:
  base:
    - /srv/salt

配置多环境

file_roots:
  base:
    - /srv/salt/base
  dev:
    - /srv/salt/dev
  prod:
    - /srv/salt/prod
  test:
    - /srv/salt/test

state.sls 和 state.highstate 有什么区别

salt.modules.state.sls(mods,saltenv='base',test=None,exclude=None,queue=False,env=None,concurrent=False,**kwargs)

从上面可以看出, state.sls 默认的运行环境是 base,另外通过查看了下 saltstack 的 google groups ,发现绿肥也对这个解答了下, state.sls 并不读取 top.sls,所以 state.sls 需要单独执行哪些 sls 的话,需要你自定义。

salt的sls调用是怎样的结构

top.sls是入口文件

# cat top.sls
base:
    "*":
        - nfs-server

我们需要自己创建nfs-server工程(暂且叫工程吧)结构如下

├── nfs-server
│   ├── files
│   └── init.sls
└── top.sls

# -------或者--------

├── nfs-server.sls
├── nfs-server-files
└── top.sls

files和nfs-server-files是文件夹,里面放所有所需文件:文件/脚本/安装包

五、其他命令

salt命令格式

salt '<target>' <function> [arguments]

<target>可以是以下内容:
1. 正则表达式
salt -E 'Minion*' test.ping  #主机名以Minion开通
2. 列表匹配
salt -L Minion,Minion1 test.ping
3. Grians匹配
salt -G 'os:CentOS' test.ping
4. 组匹配
salt -N groups test.ping
如,在master新建/etc/salt/master.d/nodegroups.conf ,yaml格式
5. 复合匹配
salt -C 'G@os:CentOS or L@Minion' test.ping
6. Pillar值匹配
salt -I 'key:value' test.ping
7. CIDR匹配
salt -S '10.252.137.0/24' test.ping

常用命令

# 检测网络
salt '*' test.ping

# 远程执行命令
salt '*' cmd.run 'ls -al'

# 同步
salt '*' saltutil.sync_all
salt minion01 saltutil.sync_all     # 同步所有模块
salt minion01 saltutil.sync_grains  # 只同步grains

image1