saltstack的深入-再次理解state的基本用法

一、基础环境
1、在tvm-saltmaster的基础上操作。
2、网络:
eth0:host-only(用于虚拟内网,手动固定IP,这样从宿主机可以直接连接到这个vm)
eth1:NAT(用于上外网,动态IP)
[[email protected] ~]# cd /etc/sysconfig/network-scripts/
[[email protected] 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

[[email protected] network-scripts]# cat ifcfg-eth1
DEVICE=eth1
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=dhcp
DNS1=192.168.56.254

二、salt-master大致上是啥样的
1、基本结构
[[email protected] salt]# tree /srv/
/srv/
├── pillar
│   ├── job
│   │   └── init.sls
│   ├── package
│   │   └── init.sls
│   └── top.sls
└── salt
    ├── base
    │   ├── abc
    │   │   ├── hosts.sls
    │   │   ├── init.sls
    │   │   ├── packages.sls
    │   │   └── resolv.sls
    │   ├── conf.d
    │   │   ├── dnsmasq
    │   │   │   └── office.conf
    │   │   ├── monit
    │   │   │   ├── monit-mail.conf
    │   │   │   └── salt-minion.conf
    │   │   ├── resolv
    │   │   │   ├── client.conf
    │   │   │   └── server.conf
    │   │   ├── saltstack
    │   │   ├── ssh
    │   │   │   └── sshd_config
    │   │   └── vim
    │   │       └── vimrc
    │   ├── 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, 31 files

注意:
1)/srv/salt & /srv/pillar是安装完成后默认的路径
2)/srv/salt 下面粉了4个环境,这个是测试多环境的意图,具体配置是在这里定义的:
[[email protected] 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
[[email protected] salt]# mkdir /srv/salt/{base,dev,qa,prod}/ -p
[[email protected] salt]# service salt-master restart

3)默认是在base环境下,这是不可缺的。以base环境为根,我们再继续往下看
4)【top.sls】,这个是一个环境的入口,可以匹配target,指定以“.sls”为后缀来定义的salt state文件,例如:
[[email protected] 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

2)指定一个其他的saltenv
salt ‘tvm-test‘ state.sls crontab saltenv=‘qa‘

2)测试开关
salt ‘tvm-test‘ state.sls crontab saltenv=‘qa‘ test=True

3)highstate方式,minions从salt-master拉取自己匹配的所有的state数据,并执行
salt ‘*‘ state.highstate

    
    
三、/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、入口文件
[[email protected] salt]# cat /srv/pillar/top.sls 
base:
  ‘*‘:
    - package
    - job

2、针对安装包,指定vim和apache的k/v键值对
[[email protected] 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
[[email protected] 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
[r[email protected] salt]# cat base/dnsmasq/init.sls 
dnsmasq:
  pkg.installed: []
  service.running:
    - enable: True
    - reload: 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
[[email protected] 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
[[email protected] 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
[[email protected] salt]# cat base/abc/init.sls 
include:
  - abc.hosts
  - abc.resolv
  - abc.packages
-------------------------------------------------------------abc init end  
2)“hosts.sls”更新了“/etc/hosts”文件。
这里用到了:“file.append”:
-------------------------------------------------------------abc hosts  
[[email protected] salt]# cat base/abc/hosts.sls 
/etc/hosts:
  file.append:
    - text: 
      - ‘192.168.56.253  salt-m.office.test‘
      - ‘192.168.56.254  mirror.office.test‘
      - "127.0.0.1       {{ grains[‘id‘] }}"
-------------------------------------------------------------abc hosts end        
3)“resolv.sls”更新了/etc/resolv.conf文件。
这里用到了:“if..else..endif, grains”
-------------------------------------------------------------abc resolv  
[[email protected] 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)指定要安装的包。
这里用到了:“pkg.installed, pkgs, pkg.latest”
-------------------------------------------------------------abc packages 
[[email protected] 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”
-------------------------------------------------------------abc monit
[[email protected] 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
-------------------------------------------------------------abc monit end 
-------------------------------------------------------------abc postfix
[[email protected] salt]# cat base/postfix/init.sls 
postfix:
  pkg.installed: []
  service.disabled: []
-------------------------------------------------------------abc postfix end 
-------------------------------------------------------------abc salt
[[email protected] salt]# cat base/salt/minion.sls 
salt-minion:
  pkg.installed: []
  service.running:
    - enable: True
-------------------------------------------------------------abc salt end     
-------------------------------------------------------------abc ssh 
[[email protected] 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
-------------------------------------------------------------abc ssh end 
-------------------------------------------------------------abc vim end 
vim:
  pkg.installed:
    - name: {{ pillar[‘pkgs‘][‘vim‘] }}

/root/.vimrc:
  file.managed:
    - source: salt://conf.d/vim/vimrc
    - require:
      - pkg: vim
-------------------------------------------------------------abc vim end 

      
4、中间的2个环境略过,再看看qa环境的配置.
这里用到了:“cron.file”
[[email protected] salt]# cat qa/top.sls 
qa:
  ‘* and not tvm-yum‘:
    - crontab
[[email protected] salt]# cat qa/crontab/init.sls 
## 使用cron.file这个方法来控制,可以替换全部的crontab内容
cron-ntpdate-office:
  cron.file:
    - name: salt://conf.d/crontab/client.conf

要注意,这里是用“name”,而不是“source”来指定文件路径。

五、小结一下state
1、state.sls, state.highstate
2、pkg
pkg.installed
pkg.latest
pkgs

3、file
file.managed
file.replace
file.append

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
时间: 2024-11-05 11:51:43

saltstack的深入-再次理解state的基本用法的相关文章

再次理解WCF以及其通信(附加一個編程小經驗)

一.概述 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口,它是.NET框架的一部分.由 .NET Framework 3.0 开始引入. WCF的最终目标是通过进程或不同的系统.通过本地网络或是通过Internet收发客户和服务之间的消息. WCF合并了Web服务..net Remoting.消息队列和Enterprise Services的功能并集成在Visual Studio中. WCF

(转)java.ByteArrayInputStream与ByteArrayOutputStream再次理解

转载自:java.ByteArrayInputStream与ByteArrayOutputStream再次理解 第一次看到ByteArrayOutputStream的时候是在Nutch的部分源码,后来在涉及IO操作时频频发现这两个类的踪迹,觉得确实是很好用,所以把它们的用法总结一下. ByteArrayOutputStream的用法 以下是JDK中的记载: public class ByteArrayOutputStream  extends OutputStream 此类实现了一个输出流,其中

再次理解HTTP请求过程

我曾多次阅读http协议,但是理解依然不深,在此,再次阅读,再次理解.加深两点:解析头部信息\r\n,分解头部和主体用\r\n\r\n.之所以一次请求会看到网络里有很多请求,是因为浏览器代替访问了多次!程序只管处理一次即可! HTTP请求 步骤1:浏览器首先向服务器发送HTTP请求,请求包括: 方法:GET还是POST,GET仅请求资源,POST会附带用户数据: 路径:/html/path: 域名:由Host头指定:Host: www.sina.com.cn 以及其他相关的Header: 如果是

ON_MESSAGE和ON_NOTITY再次理解

ON_NOTIFY是控件向其父窗口发送消息处理的宏,ON_COMMAND是菜单和工具栏项处理消息的宏,ON_MESSAGE是处理自定义消息的宏 对这几个消息的理解要先了解一下Window消息的背景. 在Windows3.1里,控件会将mouse, keybord等等的消息通知它的父窗口, 使用的消息就只有WM_COMMAND, 事件种类和控件ID被包含在wParam中, 控件的句柄包含在lParam中.由于wParam和 lParam已经满了,当控件要向父窗口发送其它特殊消息同时附带很多信息的时

二分算法 再次理解

二分算法 再次理解 详解二分查找算法 这篇博客很详细介绍了二分算法的一些细节问题 寻找一个数,也是最基本的二分搜索 //代码示例如下 int bsearch(int []nums, int target) { int left=0, right=nums.length-1;//这里的数组长度用法可以是其他的形式 while(left<=right) { int mid = left + (right - left) / 2; if(num[mid] == target) return mid;

SaltStack配置管理之Gains与State测试

SaltStack的Grains主要是收集了minion的一些配置信息,如CPU.内存.硬盘.网络.操作系统等很少发生变化的静态数据,我们也可以在minion自定义Grains项和相应的值,Grains也可以用来匹配目标minion.SaltStack的state通过预先定制好的sls(salt state file)文件对被控制主机进行状态管理,支持包括程序包(pkg).文件(file).网络配置(network).系统服务(service).系统用户(user)等.通过sls文件定义好要达到

C++再次理解虚表

#include <iostream> using namespace std; class Base { public: virtual void fun1() { cout << "Base::fun1()" << endl; } virtual void fun2() { cout << "Base::fun2()" << endl; } }; class Son : public Base { pu

再次理解javascript的apply

普通函数执行的时候,this指向函数执行的上下文 其实就是一个原型链的结构... 我一直没有搞懂原型链莫非它们像链条一样连在一起? 昂... 原型链可以理解成继承吗? 就像,java里边的继承吧嗯嗯刚想说这个 写js的时候一般没用到这里,还有apply()和call()一直搞不清太灵活了,不知道是什么,想要干啥 ES6新的语法来讲,你可能会看着比较熟悉了 call 和 apply就是绑定一个函数执行的 this指向 觉apply()和代码上下文有很大关系 这意思是修改父类吗? 不是.. 那我又不

再次理解js中的call函数

a.call(b); 网上说明的版本比较多.有的说,是指针替换.有说,将a对象的方法加在b对象执行.官方说:什么对象替换什么对象.反正看了几个版本,尽管有具体的实例,看了我三次都没看懂它的具体含义.看过还是云里雾里的.后来发现,结合实验去理解非常好. 其实,换成自己能够接受的方式理解为好.a对象的方法应用到b对象上(函数apply的意思正好说明符合这样理解:a对象应用到b对象上去) a对象既然添加到b对象上了.那么b对象自然就拥有了a对象所有的内容.所有,b对象就继承了a对象了.结合自己编写的下