“Saltstack文件管理”与“Saltstack的配置管理salt.states”:页面之间的差异

来自linuxsa wiki
(页面间差异)
跳转到导航 跳转到搜索
Evan留言 | 贡献
 
Evan留言 | 贡献
 
第1行: 第1行:
saltstack 文件管理
=最简单的sls  state =
SLS(代表SaLt State文件)是Salt State系统的核心
==Q:问题出现==
项目有好几台机器要改一下备份脚本,如果一台台上去,真的是烦和累,刚好想到salt ,爽了一把 又有想学好 python的动力了 哈哈
 
==配置==
<pre>
<pre>
# Example: 记住 第一行 是 空格二个  二行是4个  三行是6个哦 
  file_roots:
    base:
      - /srv/salt/
## 首先修改master的配置文件,指定根目录,注意缩进全部使用两个空格来代替Tab(python规范)
[root@ ~]# vi /etc/salt/master
file_roots:
  base:
    - /srv/salt
#  dev:
#    - /srv/salt/dev   
## 确定指定的目录是否存在,如果不存在,需要手动来创建目录


/srv/salt/base和/srv/salt/failover这些目录是不存在,需要手动创建。这里还需要说明的是下载文件时的搜索顺序。文件服务器在给minions传输文件时,是有搜索顺序的。这里用上述配置说明:如果文件URL为:salt://httpd/httpd.conf。那么传输文件时,首先搜索/srv/salt/base/httpd/httpd.conf,如果找到了,则下载;否则就使用/srv/salt/failover/httpd/httpd.conf
vim /srv/salt/top.sls
#正则匹配
base:
  '*':
    - webserver
   
vim /srv/salt/webserver.sls
lynx:                # 标签定义
  pkg:                  # state declaration
    - installed        # function declaration
   


## 重启master服务
第一行被称为(ID declaration) 标签定义,在这里被定义为安装包的名。注意:在不同发行版软件包命名不同,比如 fedora 中叫httpd的包 Debian/Ubuntu中叫apache2
/etc/init.d/salt-master  restart
第二行被称为(state declaration)状态定义, 在这里定义使用(pkg state module)
第三行被称为(function declaration)函数定义, 在这里定义使用(pkg state module)调用 installed 函数


salt://httpd/httpd.conf表示 /srv/salt/base/httpd/httpf.conf</pre>
   
salt '*' state.highstate -v test=True
salt '*' state.highstate
 


==A: 解决方案==
2.9  配置管理从这里开始  p27
[[Salt-cp]]
===1、文件传输:===
<pre>salt自带有cp模块,模块的方法可以用下面的命令查看下
salt '*' sys.doc | grep "salt '\*' cp"


1.查看支持的所有states 列表


salt 'gitlabzbx' sys.list_state_modules
gitlabzbx:
    - alias
    - alternatives
    - apt
    - archive
    - artifactory
    - beacon
    - bigip


#利用 salt 传输和安装 jdk
mv  jdk-8u172-linux-x64.rpm /srv/salt/
salt prod-secret* test.ping
salt prod-secret*  cp.get_file salt://jdk-8u172-linux-x64.rpm  /root/jdk-8u172-linux-x64.rpm
salt prod-secret* cmd.run 'rpm -ivh /root/jdk-8u172-linux-x64.rpm'
alt prod-secret* cmd.run 'java'


5. 从一个简单的实例理解states




cat /srv/salt/one.sls
/tmp/foo.conf:
    file.managed:
        - source: salt://foo.conf
        - user: root
        - group: root
        - mode: 644
        - backup: minion




root@myxp:~# echo "salt books" > /srv/salt/foo.conf






这样就把 master上的 /src/salt/foo.conf 分发到 minon的 /tmp/foo.conf


发送一个文件给客户端: 会自动覆盖原来的文件 这个要小心
root@myxps:/srv/salt# salt '*' state.sls one
root@ab bakcup]# salt 'db' cp.get_file salt://dbbackup.sh /root/dbbackup.sh
zbxAgent:
abroad_db2:
----------
/root/dbbackup.sh
          ID: /tmp/foo.conf
    Function: file.managed
      Result: True
    Comment: File /tmp/foo.conf updated
    Started: 08:31:01.737749
    Duration: 45.764 ms
    Changes: 
              ----------
              diff:
                  New file
              mode:
                  0644


salt的主目录在/srv/salt下面,这个可以在配置文件里设定,我上面就是把/srv/salt/test/dbbackup.sh这个文件推送到客户端去
Summary for zbxAgent
------------
Succeeded: 1 (changed=1)
Failed:    0
------------
Total states run:    1
Total run time:  45.764 ms
gitlabzbx:
----------
          ID: /tmp/foo.conf


这样写可能报错哦
salt ‘abroad_db2’ cp.get_file salt://dbbackup.sh /root/


使用cp.get_file进行文件的分发时时也可以指定是否对分发的文件进行压缩
</pre>
使用gzip的方式进行压缩,数字越大,压缩率就越高,9代表最大的压缩率
=salt系统初始化例子=
[root@ ~]# salt 'db' cp.get_file salt://dbbackup.sh /root/dbbackup.sh gzip=9


当minion上的目标目录不存在时,可以使用makedirs参数来创建目标目录,如下
[root@ ~]# salt 'db' cp.get_file salt://dbbackup.sh /root/dbbackup.sh gzip=9 makedirs=True


</pre>
https://github.com/evan886/saltops


===2、文件追加:===
<pre>使用file模块的append方法:


root@debian:/srv/salt# salt '*' file.append /root/test.sh "adfadf"
192.168.1.101:
Wrote 1 lines to “/root/test.sh”
这样可以轻松把内容添加到文件上去,file还有很多方法,具体可以看看源码


不怕文件零碎,不怕新加了机器你还要为他们单独推送</pre>
下面介绍 使用top.sls 入口文件同时对多台服务器进行的配置管理


===3. 目录传输 cp.get_dir===
salt-master --log-level=debug
<pre>顾名思义,cp.get_dir就是下载目录,用法基本同cp.get_file一样


将master端的test_dir目录下载到minion端的/root目录下
== 环境配置 配置file_roots and pillar_roots  正式例子 ==
[root@vm ~]# salt '*' cp.get_dir salt://test_dir/ /root
<pre>
192.168.30.96:
# Example:  注意  各空两格下去  级级下去  我搞了半天 呀  一开始
     - /root/test_dir/a.txt
file_roots:
     - /root/test_dir/b.txt
  base:
192.168.30.95:
#    - /srv/salt/base
    - /root/test_dir/a.txt
#  dev:
     - /root/test_dir/b.txt
#     - /srv/salt/dev/services
#     - /srv/salt/dev/states
  prod:
    - /srv/salt/prod/
#     - /srv/salt/prod/states


</pre>


===4.cp.push 下载 ===
  pillar_roots:
<pre>cp.push 模块允许minion上传文件到master端。注意事项:
    base:
      - /srv/pillar/base
#
    prod:
      - /srv/pillar/prod
   


cp.push功能默认不开启,需要修改配置文件中的file_recv 环境,默认为False
mkdir  -p /srv/salt/base /srv/salt/prod


上传的文件存放在master端的 /var/cache/salt/master/minions/<minion_id>/files/ 目录下
mkdir  -p /srv/pillar/base /srv/pillar/prod
修改master配置文件并重启。


# Allow minions to push files to the master. This is disabled by default, for
/etc/init.d/salt-master restart
file_recv: True
</pre>
== 系统初始化==
=== dns config ===


# It will be interpreted as megabytes. Default: 100
<pre>
file_recv_max_size: 400
cat /srv/salt/base/init/dns.sls
/etc/resolv.conf:
    file.managed:
      - source: salt://init/files/resolv.conf
      - user: root
      - group: root
      - mode: 644


#从minions 中把 miniontest 文件 下载回master
[root@vm ~]# salt '192.168.30.95' cp.push /root/miniontest
192.168.30.95:
    True


cat  /srv/salt/base/init/files/resolv.conf
# Generated by NetworkManager
nameserver 192.168.88.1
nameserver fd67:f843:530::1


# 查看文件
[root@vm ~]# ls /var/cache/salt/master/minions/192.168.30.95/files/root/miniontest
/var/cache/salt/master/minions/192.168.30.95/files/root/miniontest


</pre>
</pre>


==利用Salt API分发文件==
===history记录时间 ===
<pre>
cat /srv/salt/base/init/history.sls
  /etc/bashrc:
    file.append:
      - text:
        - HISTTIMEFORMAT="%F %T `whoamii` "
    cmd.run:
      - name: source /etc/bashrc
 
# or
cat /srv/salt/base/init/history.sls
  /etc/profile:
    file.append:
      - text:
        - HISTTIMEFORMAT="%F %T `whoamii` "
    cmd.run:
      - name: source /etc/bashrc
</pre>
</pre>
In [10]: import salt.client


In [11]: local = salt.client.LocalClient()
===初始化环境引用  ===
<pre>
cat /srv/salt/base/init/env_init.sls
include:
    - init.dns
    - init.history


In [12]: local.cmd('*', 'cp.get_file', ['salt://httpd/httpd.conf', '/root/aaaaaaa'])
Out[12]: {'192.168.1.223': '/root/aaaaaaa'}


最近在写运维管理平台时,要做一个文件分发的功能,因此就用到了Salt的文件服务器以及cp模块来做,再调用下Salt开放的API,达到的效果也是十分理想的。当然,前提是要把文件准备在特定的目录下,这点只要自己做一个规范,也是很好管理的
tree /srv/salt/base/
</pre>
/srv/salt/base/
├── init
│   ├── dns.sls
│   ├── dns.slsbak
│   ├── env_init.sls
│   ├── files
│   │   └── resolv.conf
│   └── history.sls
├── top.sls
 


== 其它 ==
cat /srv/salt/base/top.sls
<pre>salt提供的sls模板来实现下
先在/srv/salt目录下建立一个入口文件
root@debian:/srv/salt# cat top.sls
base:
base:
'*':
  '*':
- scpfile.mytest
    - init.env_init


第二行是一个标志
salt '*' state.highstate test=True
第三行是指定机器
salt '*' state.highstate


第四行就是去执行scpfile目录下mytest.sls这个文件
</pre>
[root@ab scpfile]# cat mytest.sls
/root/test.sh:
file.managed:
- source: salt://scpfile/test.sh
- mode: 755


sls文件讲解
=站内资源=
第二行是客户端文件位置
[[Saltstack文件管理]]
第三行是salt函数
第四行是源文件
第五行是指文件的权限控制
然后在scpfile目录下新建一个test.sh
最后我们来推送一下:


#run
= install nginx=
[root@abroad_sdk scpfile]# salt '*' state.highstate -v
[[saltstack state安装nignx]]
Executing job with jid 20161111165118556055
——————————————-


abroad_queue:
=trouble shooting=
———-
<pre>
ID: /root/test.sh
trouble
Function: file.managed
    Rendering SLS 'base:init.dns' failed: mapping values are not allowed here; line 2
Result: True
Comment: File /root/test.sh updated
Started: 16:51:18.969509
Duration: 14.46 ms
Changes:
———-
diff:
New file
mode:
0755


Summary
cat init/dns.sls
————
/etc/resolv.conf: 少了这个的原因 ? 老报错  不有 第二行 要空4格  这书本 看起来是空了3格
Succeeded: 1 (changed=1)
    file.managed:
Failed: 0
        - source: salt://init/files/resolv.conf
————
- user: root
Total states run: 1
- group: root
- mode: 644
 
参考一下别人发现的错
</pre>


这里开始 是另外一个机器了
=see also=


追加内容: sed 的好像不成功
https://docs.saltproject.io/en/latest/ref/states/all/salt.states.file.html
[root@abroad_sdk scpfile]# cat mytest.sls
/root/test.sh:
file.managed:
- source: salt://scpfile/test.sh
- mode: 755
/root/test.sh:
file.append:
- text:
- "11111111111111"


sed修改内容:
[https://www.zhb127.com/archives/saltstack-how-to-use-salt-states.html SaltStack 学习:如何使用配置管理good]


root@ubuntu:/srv/salt/scpfile# vi my.sls
[https://www.cnblogs.com/yanjieli/p/10877258.html  SaltStack--配置管理 ]
- textdd:
/root/test.sh:
file.managed:
- source: salt://scpfile/test.sh
- mode: 755
/root/test.sh:
file.append:
- text:
- "11111111111111"
/root/test.sh:
file.sed:
- before: 11111111111111
- after: 2222
——————————————————–
root@ubuntu:/srv/salt/scpfile# salt ‘*’ state.highstate -v
Executing job with jid 20131031165305244140
——————————————-
192.168.1.101:
———-
State: – file
Name: /root/test.sh
Function: sed
Result: True
Comment: sed ran without error
Changes: diff: —
+++
@@ -1,4 +1,4 @@
adfkdddddd
ddddddddddd
ddd
-11111111111111
+2222


Summary
[https://blog.csdn.net/weixin_30266829/article/details/95576657  Salt 系统初始化]
————
Succeeded: 1
Failed: 0
————
Total: 1 </pre>


==参考==
[https://www.jianshu.com/p/65253efcc0a0 saltstack 的日常使用(一)]


[https://blog.csdn.net/m0_37814112/article/details/80348715 saltstack使用指南:saltstack组件之state状态管理]
[https://www.jianshu.com/p/fa3a067b7c1b good saltstack-的日常使用 (二) redis sls]


[https://blog.csdn.net/Freshair_x/article/details/80290562 saltstack salt的state.sls的使用]
[https://www.jianshu.com/p/ff70dd688aba saltstack 的日常使用 (三)]






http://lihuipeng.blog.51cto.com/3064864/1317841
[https://www.cnblogs.com/guigujun/p/8516324.html  saltstack 初始化LINUX系统 ]


自动化运维神器之saltstack (二)文件服务器
[https://blog.csdn.net/weixin_30788731/article/details/98583404?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7Edefault-12.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7Edefault-12.control  saltstack 初始化LINUX系统]
http://www.ahlinux.com/mainte/9915.html


[http://www.jianshu.com/p/a0677d38bd1f Salt文件服务器与salt-cp以及cp模块]
[http://732233048.blog.51cto.com/9323668/1640990 saltstack管理六之数据同步方式和常用命令]
[[category:ops]] [[category:saltstack]]
[[category:ops]] [[category:saltstack]]

2021年9月8日 (三) 04:15的最新版本

最简单的sls state

vim /srv/salt/top.sls
#正则匹配
base:
  '*':
    - webserver
    
vim /srv/salt/webserver.sls
lynx:                 # 标签定义
  pkg:                  # state declaration
    - installed         # function declaration
    

第一行被称为(ID declaration) 标签定义,在这里被定义为安装包的名。注意:在不同发行版软件包命名不同,比如 fedora 中叫httpd的包 Debian/Ubuntu中叫apache2
第二行被称为(state declaration)状态定义, 在这里定义使用(pkg state module)
第三行被称为(function declaration)函数定义, 在这里定义使用(pkg state module)调用 installed 函数

    
 salt '*' state.highstate -v test=True
salt '*' state.highstate 
   

2.9  配置管理从这里开始  p27

1.查看支持的所有states 列表

 salt 'gitlabzbx' sys.list_state_modules
gitlabzbx:
    - alias
    - alternatives
    - apt
    - archive
    - artifactory
    - beacon
    - bigip


5. 从一个简单的实例理解states 


 cat /srv/salt/one.sls 
/tmp/foo.conf:
    file.managed:
        - source: salt://foo.conf
        - user: root
        - group: root
        - mode: 644
        - backup: minion


root@myxp:~# echo "salt books" > /srv/salt/foo.conf



这样就把 master上的 /src/salt/foo.conf 分发到 minon的 /tmp/foo.conf 

root@myxps:/srv/salt# salt '*' state.sls one 
zbxAgent:
----------
          ID: /tmp/foo.conf
    Function: file.managed
      Result: True
     Comment: File /tmp/foo.conf updated
     Started: 08:31:01.737749
    Duration: 45.764 ms
     Changes:   
              ----------
              diff:
                  New file
              mode:
                  0644

Summary for zbxAgent
------------
Succeeded: 1 (changed=1)
Failed:    0
------------
Total states run:     1
Total run time:  45.764 ms
gitlabzbx:
----------
          ID: /tmp/foo.conf


salt系统初始化例子

https://github.com/evan886/saltops


下面介绍 使用top.sls 入口文件同时对多台服务器进行的配置管理

salt-master --log-level=debug

环境配置 配置file_roots and pillar_roots 正式例子

# Example:  注意  各空两格下去   级级下去  我搞了半天 呀  一开始
 file_roots:
   base:
#     - /srv/salt/base
#   dev:
#     - /srv/salt/dev/services
#     - /srv/salt/dev/states
   prod:
     - /srv/salt/prod/
#     - /srv/salt/prod/states


  pillar_roots:
    base:
      - /srv/pillar/base
#
    prod:
      - /srv/pillar/prod
    

 mkdir  -p /srv/salt/base /srv/salt/prod

 mkdir  -p /srv/pillar/base /srv/pillar/prod

/etc/init.d/salt-master restart

系统初始化

dns config

cat /srv/salt/base/init/dns.sls
/etc/resolv.conf:
     file.managed:
       - source: salt://init/files/resolv.conf
       - user: root
       - group: root
       - mode: 644


 cat  /srv/salt/base/init/files/resolv.conf 
# Generated by NetworkManager
nameserver 192.168.88.1
nameserver fd67:f843:530::1


history记录时间

 cat /srv/salt/base/init/history.sls 
  /etc/bashrc:
    file.append:
      - text:
        - HISTTIMEFORMAT="%F %T `whoamii` "
    cmd.run:
      - name: source /etc/bashrc

# or 
 cat /srv/salt/base/init/history.sls 
  /etc/profile:
    file.append:
      - text:
        - HISTTIMEFORMAT="%F %T `whoamii` "
    cmd.run:
      - name: source /etc/bashrc

初始化环境引用

 cat /srv/salt/base/init/env_init.sls 
include:
    - init.dns
    - init.history


 tree /srv/salt/base/
/srv/salt/base/
├── init
│   ├── dns.sls
│   ├── dns.slsbak
│   ├── env_init.sls
│   ├── files
│   │   └── resolv.conf
│   └── history.sls
├── top.sls


 cat /srv/salt/base/top.sls
base:
  '*':
    - init.env_init

salt '*' state.highstate test=True
 salt '*' state.highstate 

站内资源

Saltstack文件管理

install nginx

saltstack state安装nignx

trouble shooting

trouble 
    Rendering SLS 'base:init.dns' failed: mapping values are not allowed here; line 2

 cat init/dns.sls 
/etc/resolv.conf: 少了这个的原因 ? 老报错  不有 第二行 要空4格  这书本 看起来是空了3格 
    file.managed:
        - source: salt://init/files/resolv.conf
	- user: root
	- group: root
	- mode: 644

参考一下别人发现的错 

see also

https://docs.saltproject.io/en/latest/ref/states/all/salt.states.file.html

SaltStack 学习:如何使用配置管理good

SaltStack--配置管理

Salt 系统初始化

saltstack 的日常使用(一)

good saltstack-的日常使用 (二) redis sls

saltstack 的日常使用 (三)


saltstack 初始化LINUX系统

saltstack 初始化LINUX系统