安装 6 台虚拟机192.168.4.10 --- master192.168.4.11 --- node1192.168.4.12 --- node2192.168.4.13 --- node3192.168.4.14 --- node4192.168.4.15 --- node5
把 saltstack 的安装 rpm 部署到 yum 源解压 salt.tar 到 ftp 目录createrepo .
在所有机器上添加 salt yum 源地址
安装 masteryum clean allyum install salt-mastersystemctl enable salt-master
node{1..5} 安装 minionyum clean allyum install salt-minionsystemctl enable salt-minion
#----------------------------------------------------------#master: 安装 salt-master 配置 /etc/salt/master 启动 salt-master
node: 安装 salt-minion 配置 /etc/salt/minion master: master ip id: node name 启动 salt-minion
#----------------------------------------------------------#master: 查看 salt-key -L
删除 salt-key -d nodename
添加 salt-key -a nodename 添加所有 salt-key -A -y
删除所有 salt-key -D 测试所有主机连通性 salt '*' test.ping
在任意主机上执行指令 salt 'node1' cmd.run 'ifconfig' salt '*' cmd.run 'uptime'
\d 匹配一个数字 \d+ 匹配 1..n 个数字 salt -E "node\d" test.ping
L 列表 后面跟随主机的名称,用 “,”分割 salt -L "node1,node3,node5" test.ping
使用分组 配置 /etc/salt/masternodegroups: group1: 'L@node4,node5' 重启 salt-master salt -N group1 test.ping 通过 IP 掩码分组匹配 salt -S "192.168.4.13" test.ping salt -S "192.168.4.0/24" test.ping
文件分发 mkdir -p /srv/salt/files cd /srv/salt/files 创建要分发到节点的文件 testfile 执行分发指令{指令} {目标主机匹配模式}{模块.指令}{源文件地址} {目标文件地址} salt -N group1 cp.get_file salt://files/testfile /var/tmp/f1
验证 salt -N group1 cmd.run 'md5sum /var/tmp/*'
查看模块,功能和使用方法 列出所有模块 salt 'node1' sys.list_modules
列出模块所有的方法 salt 'node1' sys.list_functions test
查看模块帮助 salt 'node1' sys.doc test 拷贝文件(相当于 ssh 到目的主机执行 cp) salt -L 'node1,node2' file.copy /etc/passwd /var/tmp/passwd 拷贝文件夹 salt -L 'node1,node2' file.copy /etc/selinux /var/tmp/selinux recurse=True 验证结果: salt '*' cmd.run 'tree -L 2 /var/tmp'
添加用户 salt 'node3' user.add zhang3 2000
grains 模块 查看 节点 grains 的所有信息 salt 'node1' grains.items 在节点上定义角色,配置节点上的 /etc/salt/minion grains: role: webserver
grains: deployment: datacenter4
配置完以后要重启节点 salt-minion 服务 查看角色 salt '*' grains.item role salt '*' grains.item deployment
通过 grains 查看节点系统是什么 salt '*' grains.item os 查看系统ip网卡信息 salt '*' grains.item ip4_interfaces 查询主机名 salt '*' grains.item fqdn
客户端的 grains 配置文件修改后,必须重启服务或刷新后才有效 重启服务 systemctl restart salt-minion 刷新服务 salt '*' saltutil.sync_grains
pillar 模块 修改 master 上的 pillar 相关配置 /etc/salt/masterpillar_roots: base: - /srv/pillar 创建 pillar root 的根目录 mkdir -p /var/pillar
pillar 的数据组织是使用 sls 的文件,入口文件是 top.slsbase: 'node3': - data - users
data.sls 文件appname: websiteflow: maxconn: 3000 maxmem: 6G
users文件夹下默认的 init.sls 文件users: zhang3: 2000 li4: 2001
数据同步 salt '*' saltutil.refresh_pillar
获取所有pillar数据 salt '*' pillar.items
获取指定的数据 salt '*' pillar.item appname
根据 pillar 定义的数据匹配主机,执行 salt -I 'appname:website' test.ping
jinja 模版 在state文件中使用"- template: jinja"声明使用 jinja 模版 在模版中变量是使用 {{name}} 表示 模版中支持循环,判断语句,使用格式 {% if ... %} ... ... {%endif%} {%for ...%} ... ... {%endfor%}
-----------------------1 配置 yum 源2 把 salt 拷贝到 源里面createrepo .3 安装master 上安装 salt-masteryum install -y salt-masternode 上安装 salt-minionyum install -y salt-minion
# master 上默认启动 4505,4506配置文件保持默认,启动服务# minion 上配置master 的地址id 标识nmap -p 4505,4506 masterip
启动服务master 上可以查看到minion已经申请链接salt-key -L添加授信后可以开始使用salt-key -A -y
# 测试使用salt '*' test.ping
按照用户纬度查询注: 2015 版本有bug,查询有时候会出不来,升级到 2016 版,问题解决salt '*' pillar.item 'users:zhang3' salt -I 'users:zhang3' test.ping
salt 模块 state查看 state 所有模块salt 'node1' sys.list_state_modules查看 state 模块方法salt 'node1' sys.list_state_functions modules_name查看 state 帮助salt 'node1' sys.state_doc modules.function
修改配置文件 /etc/salt/masterfile_roots: base: - /srv/salt/base dev: - /srv/salt/dev prod: - /srv/salt/prod
创建对应的文件夹mkdir -p /srv/salt/{base,dev,prod}重启服务systemctl restart salt-master
文件管理更改 base 环境的 dns 配置,首先在 base 文件夹下创建入口文件 top.sls目的1,修改 node1 的 resolv.conf 配置目的2,给 node1,node4 的 issue 文件追加内容
base: 'node1': - dns - issue 'node4': - issue 'L@node2,node3,node5' - rpm_pkgs
这里引用的 dns 配置文件 dns.sls 和 issue 追加配置文件 issue.slsdns.slsresolv_conf: file.managed: - name: /etc/resolv.conf - source: salt://files/resolv.conf - user: root - group: root - mode: 644 - template: jinja - defaults: DNS_IP: 192.168.113.254
这里指定了 source 文件在 files/resolv.conf,并且在配置中使用了 jinja 模版定义 dns_ip创建files文件夹和 resolv.conf 文件mkdir -p /srv/salt/bash/files
resolv.conf 文件ameserver {{DNS_IP}}
issue.slsissue_file: file.append: - name: /etc/issue - text: - Red Hat Enterprise Linux 7 - Tedu Ltd Server
创建文件夹 rpm_pkgs配置文件 rpm_pkgs.sls rpms: file.directory: - name: /opt/rpm_pkgs - user: root - group: root - dir_mode: 755 - file_mode: 644
测试执行salt '*' state.highstate saltenv=base test=True
运行salt '*' state.highstate saltenv=base test=False
为 salt 添加执行的条件判断unless 判断条件为【假】的时候执行onlyif 判断条件为【真】的时候执行例子: 添加用户,当用户不存在的时候执行添加操作add_user.slsuseradd zhang3: cmd.run: - unless: id zhang3
删除用户,当用户 存在的时候执行删除操作del_user.slsuserdel zhang3: cmd.run: - onlyif: id zhang3
在 top.sls 对应要增加或删除的机器上配置base: "node3": - add_user "node4": - del_user
项目1: 利用 salt 给多台机器实现下列功能: 配置多台minion的dns服务器地址为192.168.4.1 配置history命令显示时间 配置系统内核参数 net.ipv4.ip_forward 打开路由转发 创建用户zhang3 设置初始化密码为123456 配置用户初次登陆必须修改密码
分析: 初始化的工作比较多,写入一个文件比较凌乱,设计一个初始化模块 init 在模块下分别配置 dns,sysctl, history, adduser 实现 创建 init 文件夹 mkdir /srv/salt/base/init 进入这个文件夹 cd /srv/salt/base/init 配置 dns dns.slsresolv_conf: file.managed: - name: /etc/resolv.conf - source: salt://init/files/resolv.conf - user: root - group: root - mode: 644 - template: jinja - defaults: DNS_IP: 192.168.4.1
创建文件夹mkdir files
配置 files/resolv.conf 文件nameserver {{DNS_IP}}
配置 history.sls 增加时间history_file: file.append: - name: /etc/profile - text: - export HISTTIMEFORMAT="[%F_%T]:"
配置 sysctl.sls 开启路由转发net.ipv4.ip_forward: sysctl.present: - value: 1
配置 add_user.sls 添加用户useradd zhang3: cmd.run: - unless: id zhang3
设置默认密码echo 123456 | passwd --stdin zhang3: cmd.run: - onlyif: id zhang3
设置初次登录修改密码策略chage -d0 zhang3: cmd.run: - onlyif: id zhang3
配置入口文件 top.slsbase: 'L@node2,node3,node4': - init/dns - init/history - init/sysctl - init/add_user
测试执行salt '*' state.highstate saltenv=base test=True
运行salt '*' state.highstate saltenv=base test=False
安装部署软件,使用 pkg 模块,这次使用 prod 环境部署首先根据 /etc/salt/master 里面定义的路径创建 prod 的根目录mkdir -p /srv/salt/prodcd /srv/salt/prod
创建入口文件: top.slsprod: 'L@node1,node5': - httpd
创建 httpd.sls 文件httpd_pkg_installd: pkg.installed: - name: httpd
httpd_conf: file.managed: - name: /etc/httpd/conf/httpd.conf - source: salt://files/httpd.conf - template: jinja - defaults: PORT: 80 - require: - pkg: httpd_pkg_installd
httpd_service_running: service.running: - name: httpd - enable: true - restart: true - watch: - file: httpd_conf
创建 files 文件夹,并编辑 httpd.conf 的配置文件mkdir files修改 httpd.conf 配置文件Listen {{ PORT }}ServerName local
测试执行salt '*' state.highstate saltenv=prod test=True
运行salt '*' state.highstate saltenv=prod test=False
# 以上就完成了 批量 安装 部署软件、批量修改配置文件,批量设置服务状态并且运行服务
nginx 源码编译安装,这次使用 dev 环境编译源码安装步骤1、安装依赖包 编译源码包需要安装依赖 gcc gcc-c++ make autoconf prce-devel openssl-devel2、创建用户、编译源码3、设置开机启动、启动服务
由于 nginx 源码安装是一个独立工作,我们建立一个项目mkdir -p /srv/salt/dev/nginx_install
工作分为3部分第一部分安装依赖包 initpkg.sls init_pkg_install: pkg.installed: - names: - gcc - gcc-c++ - make - autoconf - openssl-devel - pcre-devel
第二部分源码编译安装 install.slsnginx_src_install: file.managed: - name: /usr/local/src/nginx-1.9.12.tar.gz - source: salt://nginx_install/files/nginx-1.9.12.tar.gz - user: root - group: root - mode: 644 cmd.script: - source: salt://nginx_install/files/build.sh - cwd: /usr/local/src - user: root - unless: test -d /usr/local/nginx - require: - file: nginx_src_install - pkg: init_pkg_install
第二部分需要源码文件、服务配置文件、和编译安装脚本mkdir -p /srv/salt/dev/nginx_install/files拷贝 nginx-1.9.12.tar.gz 到这个目录下拷贝 nginx.service 到这个目录下创建编译安装脚本 build.sh#!/bin/bashuseradd -s /sbin/nologin nginxtar xzf nginx-1.9.12.tar.gzcd nginx-1.9.12./configure --prefix=/usr/local/nginx --user=nginx --group=nginxmakemake install
第三部分设置开机启动服务 nginx_init.sls nginx_init: file.managed: - name: /usr/lib/systemd/system/nginx.service - source: salt://nginx_install/files/nginx.service - user: root - group: root - mode: 644
nginx_service: service.running: - name: nginx - enable: true - restart: true
编辑入口文件 top.slsdev: 'node5': - nginx_install
编辑 nginx_install 入口文件 init.slsinclude: - .initpkg - .install - .nginx_init
测试执行salt '*' state.highstate saltenv=dev test=True
运行salt '*' state.highstate saltenv=dev test=False
执行后等待几分钟就可以看到 nginx 在服务器上已经正确启动运行了