SaltStack基础 - 03模块与方法


SaltStack基础 - 03模块与方法

一、查看模块与方法

### function是 module提供的方法 
[root@cl-server ~]#  salt cl-node01 sys.list_modules
[root@cl-server ~]#  salt cl-node01 sys.list_functions
[root@cl-server ~]#  salt cl-node01 sys.list_functions cmd

[root@cl-server ~]#  salt cl-node01 sys.doc cmd
[root@cl-server ~]#  salt cl-node01 sys.doc cmd.run

[root@cl-server ~]#  salt cl-node01 sys.doc  > salt-command.txt

二、file模块

###2.1  从master向minion传输文件
[root@cl-server init]# cat files_test.sls 
copy_file:
  file.managed:
    - name: /tmp/resolv.conf
    - source: salt://init/files/resolv.conf
    - user: root
    - group: root
    - mode: 644

[root@cl-server init]# salt cl-node01 state.sls init/files_test
cl-node01:
----------
          ID: copy_file
    Function: file.managed
        Name: /tmp/resolv.conf
      Result: True
     Comment: File /tmp/resolv.conf updated
     Started: 16:55:04.086735
    Duration: 34.759 ms
     Changes:   
              ----------
              diff:
                  New file
              mode:
                  0644

Summary for cl-node01
------------
Succeeded: 1 (changed=1)
Failed:    0
------------
Total states run:     1
Total run time:  34.759 ms
	
###2.2 在minion端创建文件夹	
make_directory:
  file.directory:
    - name: /tmp/zabbix/zabbix_agentd.conf.d
    - user: root
    - group: root
    - mode: 755
    - makedirs: True  ### 目录不存在自动创建
    - recurse:        ### 将属组权限递归到文件夹内的文件
      - user
      - group
      - mode

###2.3 文件内容追加	  
append_file:
  file.append:
    - name: /tmp/resolv.conf
    - text:
      - "nameserver:192.168.234.1"
[root@cl-server init]# salt cl-node01 state.sls init/files_test
cl-node01:
----------
          ID: copy_file
    Function: file.managed
        Name: /tmp/resolv.conf
      Result: True
     Comment: File /tmp/resolv.conf updated
     Started: 16:57:05.886843
    Duration: 51.475 ms
     Changes:   
              ----------
              diff:
                  --- 
                  +++ 
                  @@ -1,3 +1,4 @@
                   # Generated by NetworkManager
                   nameserver 114.114.114.114
                   nameserver 8.8.8.8
                  +nameserver 192.168.234.2

Summary for cl-node01
------------
Succeeded: 1 (changed=1)
Failed:    0
------------
Total states run:     1
Total run time:  51.475 ms	  

###2.4 在远程主机minion端执行文件拷贝
### 命令行方式: salt cl-node01 file.copy /tmp/aa.txt  /tmp/aa-01.txt	  
copy_file_on_remote:
  file.copy:
    - name: /tmp/zabbix/resolv.conf
    - source: /tmp/resolv.conf
	
###2.5 文件软连接
### Created new symlink /tmp/zabbix-agent -> /tmp/zabbix/zabbix_agentd.conf.d/	
make_link:
  file.symlink:
    - name: /tmp/zabbix-agent
    - target: /tmp/zabbix/zabbix_agentd.conf.d/

  

[root@cl-server salt]# salt cl-node01 file.get_sum /etc/resolv.conf md5
### 获取文件的用户、组、时间、权限、大小、类型
[root@cl-server salt]# salt cl-node01 file.stats /etc/resolv.conf

### 使用jinja模板
file-managed-exp:
  file.managed:
    - name: /etc/http/conf/http.conf
    - source: salt://apache/http.conf
    - user: root
    - group: root
    - mode: 644
    - template: jinja
    - defaults:
        custom_var: "default value"
        other_var: 123
{% if grains['os'] == 'Ubuntu' %}
    - context:
        custom_var: "override"
{% endif %}

### source- 指定源文件,使用第一个匹配到的文件,设置一个默认的文件。
/etc/foo.conf:
  file.managed:
    - source:
      - salt://foo.conf.{{ grains['fqdn'] }}
      - salt://foo.conf.fallback
    - user: foo
    - group: users
    - mode: 644
    - backup: minion
	
### 使用dev环境里的foo.conf文件	
/etc/foo.conf:
  file.managed:
    - source:
      - salt://foo.conf?saltenv=dev
    - user: foo
    - group: users
    - mode: 644
    - backup: minion

三、命令执行模块

[root@cl-server ~]# salt 'cl-node03' cmd.run 'uname -a'

### 在cl-node03上切换到/目录以soupman用户运行uname -a命令。
[root@cl-server ~]# salt 'cl-node03' cmd.run 'uname -a' cwd=/ user=soupman
[root@cl-server ~]# salt 'cl-node01' cmd.run 'netstat -tunlp'
[root@cl-server ~]# salt 'cl-node01' cmd.run 'df -h'
[root@cl-server ~]# salt 'cl-node01' cmd.run 'free -m'
[root@cl-server salt]#  salt cl-node01 cmd.run "ls -l | grep super"
cl-node01:
    -rwxr-xr-x  1 root root       8 Sep 25  2003 super_pi
    -rw-r--r--  1 root root   74961 Nov 20  2007 super_pi.tar.bz2

[root@cl-server salt]#  salt cl-node01 cmd.run "ls -l | awk '/super/{print \$1}'"
cl-node01:
    -rwxr-xr-x
    -rw-r--r--

 

### 在minion端执行master上的脚本
[root@cl-server ~]# salt cl-node01 cmd.script salt://scripts/getDisk.sh
[root@cl-server ~]# salt '*' cmd.script salt://scripts/runme.sh
[root@cl-server ~]# salt '*' cmd.script salt://scripts/runme.sh  'arg1 arg2 "arg 3"'
[root@cl-server ~]# salt '*' cmd.script salt://scripts/windows_task.ps1  args=' -Input c:\tmp\infile.txt'  shell='powershell'
[root@cl-server ~]# salt '*' cmd.script salt://scripts/runme.sh  stdin='one\ntwo\nthree\nfour\nfive\n'

  

四、user/group/shadow模块

### 设置加密密码
[root@cl-server init]# openssl passwd -1 Password: Verifying - Password: $1$.gbV8Cuu$3fxQbApoSCvfF2aiPoggr1

### 新增用户 [root@cl-server init]# cat create_user.sls create_group: group.present: - name: yunwei - gid: 600 - system: True create_user2: user.present: - name: developer - fullname: developer - shell: /bin/bash - home: /home/developer - uid: 4008 - gid: 600 - password: '$1$.bStQQby$QbItq0gA0zolzOycaGVDB.' [root@cl-server init]# salt cl-node03 state.sls init/create_user cl-node03: ---------- ID: create_group Function: group.present Name: yunwei Result: True Comment: Group yunwei is present and up to date Started: 14:13:07.339376 Duration: 1.921 ms Changes: ---------- ID: create_user2 Function: user.present Name: developer Result: True Comment: User developer is present and up to date Started: 14:13:07.341964 Duration: 33.821 ms Changes: Summary for cl-node03 ------------ Succeeded: 2 Failed: 0 ------------ Total states run: 2 Total run time: 35.742 ms
### 删除用户 [root@cl-server init]# cat delete_user.sls delete_developer: user.absent: - name: developer

  

[root@cl-server init]# pwd
/application/salt/init
[root@cl-server init]# cat useradd.sls 
{% set user= 'mall' %}
{% set home= '/home/mall' %}
group_add:
  group.present:
    - name: {{ user }}
{{ user }}:
  user.present:
    - uid: 895
    - gid_from_name: True
    - home: {{ home }}
    - createhome: True
    - shell: /bin/bash
    - maxdays: 90
    - password: '$1$2nTddib7$PT1LxjTL7Jfc3p39zzMUM/'
cp_skel:
  cmd.run:
    - name: 'cp /etc/skel/.bash* {{ home }} && chown -R {{ user }}.{{ user }} {{ home }}'
    - unless: test -f {{ home }}/.bashrc
[root@cl-server init]# salt cl-node01 state.sls init.useradd

  

### 修改密码
[root@cl-server pillar]# pwd /application/salt/pillar [root@cl-server pillar]# cat user.sls user_chpw: mall: '$1$2nTddib7$PT1LxjTL7Jfc3p39zzMUM/' adminx: '$1$2nTddib7$PT1LxjTL7Jfc3p39zzMUM/' [root@cl-server init]# cat chpw.sls {% for user, passwd in pillar.get('user_chpw',{}).items() %} {{ user }}: user.present: - password: {{ password }} {% endfor %} [root@cl-server init]# salt cl-node01 state.sls init.chpw

  

[root@cl-server init]# salt cl-node01 shadow.gen_password 'test8888'  ###默认使用sha512
cl-node01:
    $6$ePk84MXl$VrnRO8FnHpNHuQ62Ok6IcxVAoFpsjW/Knt4aR/2wIA.C0LOq1hjdEtqQ0MGBzSv.OEpJ9kmi88DPteURVFQms1

### 显示用户密码信息
[root@cl-server init]# salt cl-node01 shadow.info root

### 设置用户密码
[root@cl-server init]# salt cl-node01 shadow.set_password root '$6$I5wR7XBJ/tuVV7vK$LY51pyV5iI7a5eUdpNOH9yvjjJZfSmGhNj3pVFcesdPhp8g/UwiXxpwRaslWq7104sUHBpIhOU2rfUF/L1FFo/'

### 删除用户密码,删除后可无密码登录
[root@cl-server init]# salt cl-node01 shadow.del_password mall

### 显示指定用户的信息
[root@cl-server init]# salt cl-node01 user.info root

 

五、文件拷贝cp模块

cp.get_dir / cp.get_url / cp.push / cp.push_dir / cp.cache_file / cp.cache_files / cp.cache_master /

1. 复制目录,新增目录本身
[root@cl-server salt]# salt cl-node01 cp.get_dir salt://prod/haproxy/ /tmp/haproxy/
cl-node01:
    - /tmp/haproxy//haproxy/files/haproxy-2.4.4.tar.gz
    - /tmp/haproxy//haproxy/files/haproxy.init
    - /tmp/haproxy//haproxy/install.sls

2. 主节点访问的URL下载到从节点
[root@cl-server salt]# salt cl-node01 cp.get_url http://nginx.org/download/nginx-1.20.2.tar.gz /tmp/haproxy/
cl-node01:
    /tmp/haproxy/nginx-1.20.2.tar.gz

3. 把从节点的文件拷到主节点,需要salt-master开启 file_recv
[root@cl-server salt]# salt cl-node01 cp.push /tmp/haproxy/nginx-1.20.2.tar.gz
cl-node01:
    False

### 开启 file_recv [root@cl-server salt]# vi /etc/salt/master file_recv: True [root@cl-server salt]# systemctl restart salt-master
### 将minion的文件拷贝到指定目录, /var/cache/salt/master/minions/cl-node01/files [root@cl-server salt]# salt cl-node01 cp.push /tmp/haproxy/nginx-1.20.2.tar.gz cl-node01: True [root@cl-server salt]# ls /var/cache/salt/master/minions/cl-node01/files/tmp/haproxy/ nginx-1.20.2.tar.gz 4. 把从节点的目录拷贝到主节点。 # 拷贝到 /var/cache/salt/master/minions/cl-node01/files/root/redis-5.0.12/ [root@cl-server salt]# salt cl-node01 cp.push_dir /root/redis-5.0.12/ cl-node01: True # 指定路径,拷贝到 /var/cache/salt/master/minions/cl-node01/files/tmp [root@cl-server salt]# salt cl-node01 cp.push_dir /root/redis-5.0.12/ upload_path='/tmp/' cl-node01: True
### 只拷贝目录下的特定文件 [root@cl-server tmp]# rm -rf * [root@cl-server salt]# salt cl-node01 cp.push_dir /root/redis-5.0.12/ upload_path='/tmp/' glob='*.conf' [root@cl-server tmp]# tree . ├── redis.conf ├── sentinel.conf └── tests └── assets └── default.conf
### 拷贝链接文件时,指定拷贝原文件 [root@cl-server ~]# ls -l /etc/system-release lrwxrwxrwx. 1 root root 14 4月 8 2021 /etc/system-release -> centos-release [root@cl-server ~]# salt cl-node01 cp.push /etc/system-release keep_symlinks=True [root@cl-server ~]# cd /var/cache/salt/master/minions/cl-node01/files [root@cl-server files]# ls -l ./etc/system-release -rw-r--r-- 1 root root 37 12月 6 10:57 ./etc/system-release

  

### 拷贝master上的文件到minion端
[root@cl-server salt]# salt-cp cl-node01 /tmp/server06.txt /tmp/server-06.txt
cl-node01:
    ----------
    /tmp/server-06.txt:
        True

### 缓存文件到 minion 端
[root@cl-server salt]# salt cl-node01 cp.cache_file salt://init/files/resolv.conf
cl-node01:
    /var/cache/salt/minion/files/base/init/files/resolv.conf
### 缓存多个文件到 minion 端
[root@cl-server salt]# salt cl-node01 cp.cache_files salt://init/files/resolv.conf,salt://top.sls

### 操作minion端备份本地文件到缓存目录中
[root@cl-server salt]# salt cl-node01 cp.cache_local_file /tmp/server-06.txt
cl-node01:
    /var/cache/salt/minion/localfiles/tmp/server-06.txt

### 推送master上的全部文件到minion
[root@cl-server salt]# salt cl-node01 cp.cache_master
cl-node01:
    - /var/cache/salt/minion/files/base/_grains/node02.py
    - /var/cache/salt/minion/files/base/_grains/test.py
	......
	
### 拷贝master上的文件夹到minion端的指定位置	
[root@cl-server salt]# salt cl-node01 cp.get_dir salt://crontab /tmp
cl-node01:
    - /tmp/crontab/files/crontab.soupman
	
### 拷贝master上的文件到minion端cache中,返回文件内容	
[root@cl-server files]# salt cl-node01 cp.get_file_str salt://crontab/files/crontab.soupman
cl-node01:
    # test22
    * * * * * echo "hello world" >> /tmp/aa.txt

### 查看minion端是否缓存了
[root@cl-server files]# salt cl-node01 cp.is_cached salt://crontab/files/crontab.soupman

### 列出minion 端 缓存的master的文件 [root@cl-server salt]# salt cl-node01 cp.list_master cl-node01: - _grains/node02.py - _grains/test.py - _returners/file.py ...... [root@cl-server salt]# salt cl-node01 cp.list_master saltenv=prod cl-node01: - cluster/files/haproxy-outside.cfg - cluster/haproxy-outside.sls - haproxy/files/haproxy-2.4.4.tar.gz - haproxy/files/haproxy.init - haproxy/install.sls - pkg/pkg-init.sls

 

六、定时任务模块cron

cron.set_job / cron.raw_cron / cron.rm_job

### 新增一个定时任务
[root@cl-server salt]# salt 'cl-node03' cron.set_job root '1' '*' '*' '*' '*' echo "test"
cl-node03:
    new
### 查看用户的定时任务列表
[root@cl-server salt]# salt 'cl-node03' cron.raw_cron root cl-node03: */2 * * * * /usr/sbin/logrotate /etc/logrotate.d/logrotate-test # Lines below here are managed by Salt, do not edit 1 * * * * echo
### 新增任务,命令为 echo '123' > /tmp/aa.txt , 命令需要使用'' [root@cl-server salt]# salt 'cl-node03' cron.set_job root '0' '*/1' '*' '*' '*' echo '123' > /tmp/aa.txt "test123" ### 失败 [root@cl-server salt]# salt 'cl-node03' cron.raw_cron root cl-node03: */2 * * * * /usr/sbin/logrotate /etc/logrotate.d/logrotate-test # Lines below here are managed by Salt, do not edit # test123 0 */1 * * * echo [root@cl-server salt]# salt 'cl-node03' cron.set_job root '0' '*/1' '*' '*' '*' 'echo "123" > /tmp/aa.txt' "test1234" cl-node03: new [root@cl-server salt]# salt 'cl-node03' cron.raw_cron root cl-node03: */2 * * * * /usr/sbin/logrotate /etc/logrotate.d/logrotate-test # Lines below here are managed by Salt, do not edit # test123 0 */1 * * * echo 0 */1 * * * echo "123" > /tmp/aa.txt
### 更新定时任务 [root@cl-server salt]# salt 'cl-node03' cron.set_job root '*' '*' '*' '*' '*' 'echo "123" >> /tmp/aa.txt' "test12345" cl-node03: updated [root@cl-server salt]# salt 'cl-node03' cron.raw_cron root cl-node03: */2 * * * * /usr/sbin/logrotate /etc/logrotate.d/logrotate-test # Lines below here are managed by Salt, do not edit # test123 0 */1 * * * echo * * * * * echo "123" > /tmp/aa.txt ### 删除定时任务 格式: salt 'target' cron.rm_job user ${my_cron} ${exec_crondtion} [root@cl-server salt]# salt 'cl-node03' cron.rm_job root echo minute='0' hour='*/1' cl-node03: removed [root@cl-server salt]# salt 'cl-node03' cron.raw_cron root cl-node03: */2 * * * * /usr/sbin/logrotate /etc/logrotate.d/logrotate-test # Lines below here are managed by Salt, do not edit * * * * * echo "123" > /tmp/aa.txt [root@cl-server salt]# salt 'cl-node03' cron.rm_job root 'echo "123" > /tmp/aa.txt' ### 通过文件修改crontab任务 [root@cl-server salt]# vi crontab_soupman.sls [root@cl-server salt]# cat crontab_soupman.sls /var/spool/cron/soupman: file.managed: - source: salt://crontab/files/crontab.soupman - mode: 600 - user: soupman - group: soupman [root@cl-server salt]# mkdir -p crontab/files [root@cl-server salt]# cd crontab/files/ [root@cl-server files]# pwd /application/salt/crontab/files [root@cl-server files]# cat crontab.soupman # test22 * * * * * echo "hello world" >> /tmp/aa.txt [root@cl-server files]# salt 'cl-node03' state.sls crontab_soupman cl-node03: ---------- ID: /var/spool/cron/soupman Function: file.managed Result: True Comment: File /var/spool/cron/soupman updated Started: 11:39:33.553118 Duration: 41.725 ms Changes: ---------- diff: New file group: soupman user: soupman Summary for cl-node03 ------------ Succeeded: 1 (changed=1) Failed: 0 ------------ Total states run: 1 Total run time: 41.725 ms [root@cl-node03 ~]# crontab -l -u soupman # test22 * * * * * echo "hello world" >> /tmp/aa.txt

  

[root@cl-server salt]# cat cronadd.sls 
touch_cron:
  cron.present:
  - name: /bin/touch /tmp/111.txt
  - user: root
  - minute: '*'
  - hour: 20
  - daymonth: 1-10
  - month: '3,5'
  - dayweek: '*'

[root@cl-server salt]# salt cl-node01 state.sls cronadd

 

七、service模块

[root@cl-server files]# salt cl-node01 service.status httpd
cl-node01:
    True
[root@cl-server files]# salt cl-node01 service.reload httpd
cl-node01:
    True
[root@cl-server files]# salt cl-node01 sys.list_functions service
cl-node01:
    - service.available
    - service.disable
    - service.disabled
    - service.enable
    - service.enabled
    - service.execs
    - service.force_reload
    - service.get_all
    - service.get_disabled
    - service.get_enabled
    - service.get_running
    - service.get_static
    - service.mask
    - service.masked
    - service.missing
    - service.reload
    - service.restart
    - service.show
    - service.start
    - service.status
    - service.stop
    - service.systemctl_reload
    - service.unmask

  

八、软件安装模块 pkg

[root@cl-server salt]# cat install_empx.sls 
emqx_env:
  pkg.installed:
  - pkgs:
    - yum-utils
    - device-mapper-persistent-data
    - lvm2	
emqx_yum_install:
  pkg.installed:
  - sources:
    - {"emqx": "salt://temp/emqx-centos7-4.3.10-amd64.rpm"}
  - require:
    - pkg: emqx_env
emqx_start:
  service.running:
    - name: emqx
    - enable: True
    - reload: True
    - require:
      - pkg: emqx_yum_install

  

[root@cl-server ~]# salt 'cl-node02' pkg.install 'telnet'
cl-node02:
    ----------
    telnet:
        ----------
        new:
            1:0.17-66.el7
        old:
[root@cl-server ~]# salt 'cl-node02' pkg.version 'telnet'
cl-node02:
    1:0.17-66.el7
[root@cl-server ~]# salt 'cl-node02' pkg.remove 'telnet'
cl-node02:
    ----------
    telnet:
        ----------
        new:
        old:
            1:0.17-66.el7

  

九、网络模块network

[root@cl-server salt]# salt '*' network.ip_addrs
cl-node01:
    - 192.168.234.11
cl-node02:
    - 192.168.234.12

[root@cl-server files]# salt cl-node01 sys.list_functions network
cl-node01:
    - network.active_tcp
    - network.arp
    - network.calc_net
    - network.connect
    - network.convert_cidr
    - network.default_route
    - network.dig
    - network.get_bufsize
    - network.get_fqdn
    - network.get_hostname
    - network.get_route
    - network.hw_addr
    - network.hwaddr
    - network.ifacestartswith
    - network.in_subnet
    - network.interface
    - network.interface_ip
    - network.interfaces
    - network.ip_addrs
    - network.ip_addrs6
    - network.ip_in_subnet
    - network.ipaddrs
    - network.ipaddrs6
    - network.iphexval
    - network.is_loopback
    - network.is_private
    - network.mod_bufsize
    - network.mod_hostname
    - network.netstat
    - network.ping
    - network.reverse_ip
    - network.routes
    - network.subnets
    - network.subnets6
    - network.traceroute
    - network.wol

  

十、解压缩模块archive

### 将minion端的aa.txt 压缩为 aa.txt.gz
[root@cl-server ~]# salt 'cl-node01' archive.gzip /tmp/aa.txt

### 将minion端的tar.gz文件解压到 /root目录下
[root@cl-server ~]# salt 'cl-node01' archive.tar zxf /tmp/redis-5.0.12.tar.gz

### 将minion端的 目录打包到一个文件中
[root@cl-server ~]# salt 'cl-node01' archive.tar zcf /tmp/playbook.tar.gz /tmp/ansible_playbooks/

  

 

相关