所有执行模块: http://docs.saltstack.cn/zh_CN/latest/ref/states/all/index.html
常用模块:cmd, cron, file, mount, ntp, pkg, service, user, group
1 ##先看一个简单的例子: 2 salt: 3 pkg.latest: 4 - name: salt 5 service.running: 6 - names: #多个值,一行一个,且为names,复数 7 - salt-master 8 - salt-minion 9 - require: 10 - pkg: salt 11 - watch: 12 - file: /etc/salt/minion 13 14 /etc/salt/minion: 15 file.managed: 16 - source: salt://salt/minion 17 - user: root 18 - group: root 19 - mode: 644 20 - require: 21 - pkg: salt 22 23 24 ##一个小的注意: 25 /dbdata: 26 file.directory: #如果只有一个函数,这样写是错误的 27 要改成: 28 /dbdata: 29 file: 30 - directory
cmd模块:
1 name:要执行的命令,记住该命令将会在salt-minion的路径和权限下执行 2 onlyif:用于检查的命令,仅当``onlyif``选项指向的命令返回true时才执行name定义的命令 3 unless:用于检查的命令,仅当``unless``选项指向的命令返回false时才执行name指向的命令 4 cwd:执行命令时的当前工作目录,默认是/root 5 user:以指定用户身份运行命令 6 group:以指定用户组身份运行命令 7 shell:用于执行命令的shell,默认shell grain 8 run:运行name后的命令 9 [root@test81 ~]# cat install.sls 10 nginx_source: 11 file.managed: 12 - name: /tmp/nginx-1.4.5.tar.gz 13 - unless: test -f /tmp/nginx-1.4.5.tar.gz ##若minion端不存在/tmp/nginx-1.4.5.tar.gz这个文件,才会执行这个file模块 14 - source: salt://nginx/files/nginx-1.4.5.tar.gz 15 16 tar_nginx: 17 cmd.run: 18 - cwd: /usr/local/src ##当前工作目录 19 - name: tar zxvf nginx-1.4.5.tar.gz 20 - unless: test -d /usr/local/src/nginx-1.4.5 ##若minion端不存在/usr/local/src/nginx-1.4.5 这个目录,才会执行name后命令 21 - require: 22 - file: nginx_source 23 ##unless:后面的条件不满足(条件为假)时才会执行 24 ##onlyif:条件为真时执行
1 ntpdate_cron: 2 cron: 3 - present 4 - name: /usr/sbin/ntpdate pool.ntp.org 5 - minute: '*/30' 6 - require: 7 - cmd: isntp 8 9 isntp: 10 cmd: 11 - run 12 - name: yum -y install ntp 13 - unless: test ! -z `rpm -qa ntp` ##反逗点调用shell命令(tab键上面那个)
cron模块:
1 minute:分 2 hour:时 3 daymonth:日 4 month:月 5 dayweek:周 6 user:用户名 7 present:创建计划任务 8 name:计划任务内容 9 [root@scj cron]# cat cron.sls 10 mysql_cron: 11 cron: 12 - present 13 - name: cd /tmp/scripts;./mysql_backup.sh 14 - user: root 15 - minute: 0 16 - hour: 1 17 #- daymonth: 18 #- month: 19 #- dayweek: 20 #- minute: "*/5"
1 ##修改计划任务: 2 ##如上面的例子: 3 mysql_cron: 4 cron: 5 - present 6 - name: cd /tmp/scripts;./mysql_backup.sh 7 - user: root 8 - minute: 0 9 - hour: 2 #将1改为2 10 #- daymonth: 11 #- month: 12 #- dayweek: 13 #- minute: "*/5" 14 注意:以name后面的命令为主 15 可以理解为name后面的命令是唯一键 16 若把name后面的命令改了,则是重新创建了一个计划任务 17 18 ##删除一个计划任务: 19 ##如上面的例子: 20 mysql_cron: 21 cron: 22 - absent ##absent删除计划任务 23 - name: cd /tmp/scripts;./mysql_backup.sh ##只要保证name后命令不变,能匹配到 24 - user: root 25 - minute: 0 26 - hour: 2 27 #- daymonth: 28 #- month: 29 #- dayweek: 30 #- minute: "*/5"
file模块:
注意:只有file模块里才可以使用template函数
1 .sls文件1: 2 /tmp/salt/: 3 file: 4 - directory #目录不存在,则创建目录 5 - name: /tmp/salt/ 6 - user: nobody 7 - group: nobody 8 - file_mode: 644 #与recurse递归函数一起用 9 - dir_mode: 755 #文件权限644,目录权限755 10 - makedirs: True 11 - recurse: #递归目录权限,包括用户和权限 12 - user #若本来此目录就存在,且此目录下有很多文件,则recurse函数会把此目录和目录下的所有文件的权限都修改(nobody 644 755) 13 - group 14 - mode #文件644,目录755,就是上面的file_mode和dir_mode 15 #- ignore_files #忽略文件 16 #- ignore_dirs 17 18 /tmp/salt/file: 19 file: 20 - managed #创建文件 21 - name: /tmp/salt/file 22 - source: salt://web/files/httpd.conf 23 - user: nobody 24 - group: nobody #若此文件本来就存在,则会修改此文件的权限(nobody 644) 25 - mode: 644 26 #- backup: minion 27 #- template: jinja #调用pillar变量和grains变量 28 - require: 29 - file: /tmp/salt/ 30 31 32 .sls文件2: 33 {% set site_user = 'testuser' %} #定义变量 34 {% set site_name = 'test_site' %} 35 {% set project_name = 'test_proj' %} 36 {% set sites_dir = 'test_dir' %} 37 django-project: 38 file.recurse: 39 - name: {{ sites_dir }}/{{ site_name }}/{{ project_name }} 40 - user: {{ site_user }} #直接调用变量 41 - dir_mode: 2775 42 - file_mode: '0644' 43 - template: jinja #指定template: jinja 44 - source: salt://project/templates_dir 45 - include_empty: True 46 47 48 49 .sls文件3: 50 /etc/http/conf/http.conf: 51 file.managed: 52 - source: salt://apache/http.conf 53 - user: root 54 - group: root 55 - mode: 644 56 - template: jinja 57 - defaults: #默认变量,多个一行一个 58 custom_var: "default value" #这些变量将会在salt://apache/http.conf这个文件里使用 59 other_var: 123 60 {% if grains['os'] == 'Ubuntu' %} ##if语句要定格## 61 - context: #以context下的变量为准,没有时再用defaults下的变量 62 custom_var: "override" #这里以这个变量为准,defaults里的是无效的 63 {% endif %} 64 65 .sls文件4: 66 /tmp/dir1/file1: 67 file: 68 - managed 69 - makedirs: True 70 ##若minion端没有dir1目录,使用makedirs函数可以直接创建dir1目录,再创建file1文件
group模块:
1 absent:删除用户组 2 name:与absent一起用,则是删除的用户组名 3 present:管理用户组,不存在则创建;存在则管理其属性 4 name:与present一起用,则是被管理的用户组名 5 ##下面的属性全都是与present一起用的## 6 gid:组ID分配给命名组;如果留空,那么下一个可用的组ID将被分配 7 system:命名组是否是一个系统组,这本质上是groupadd“-r”选项 8 addusers:添加更多的用户列表作为组成员 9 delusers:确保这些用户从组成员中删除 10 members:用新成员的名单替换现有组成员。 11 ##注:选项'members'和'adduser/delusers'是相互排斥的,不能一起使用 12 cheese: 13 group.present: #用户组不存在,则创建;若存在,则管理,包括将用户添加到此组中或将用户从组中移除 14 - gid: 7648 15 - system: True 16 - addusers: 17 - user1 #将user1添加到组中 18 - users2 19 - delusers: 20 - foo 21 22 23 cheese: 24 group.present: 25 - gid: 7648 26 - system: True 27 - members: #只有这4个用户属于这个组 28 - foo 29 - bar 30 - user1 31 - user2
iptables模块:
lvm模块:
1 /dev/sda: 2 lvm: 3 - pv_present #创建pv 4 #-name: /dev/sda 5 6 my_vg: 7 lvm.vg_present: #创建vg 8 - devices: /dev/sda #指定pv 9 10 lvroot: 11 lvm.lv_present: 12 - vgname: my_vg #指定vg 13 - name: lvroot 14 - size: 10G 15 #- stripes: 5 16 #- stripesize: 8K
mount模块:
1 /mnt/sdb: #标识,没有name函数则表示挂载点 2 mount.mounted: 3 - device: /dev/sdb1 #挂载的设备名 4 #- name: /mnt/sdb #挂载点 5 - fstype: ext4 6 - mkmnt: True #挂载点不存在则自动创建,最好将其设置为True 7 - opts: 8 - defaults 9 10 /srv/bigdata: 11 mount: 12 - mounted: 13 - device: UUID=066e0200-2867-4ebe-b9e6-f30026ca2314 14 - fstype: xfs 15 - opts: nobootwait,noatime,nodiratime,nobarrier,logbufs=8 16 #- dump: 0 #默认是0 17 #- pass_num: 2 #默认是0 18 #- persist: True #是不是将其写入/etc/fstab文件里,默认是True,写入 19 - mkmnt: True 20 21 ##dump: The dump value to be passed into the fstab, Default is 0 22 ##pass_num: The pass value to be passed into the fstab, Default is 0
pkg模块:
1 mypkgs: 2 pkg.installed: 3 - pkgs: #安装多个软件包,用pkgs函数,一行一个 4 - gcc 5 - cmake 6 - make 7 #- name: httpd #安装的软件包名,与pkgs一起用时,此函数将被忽略 8 9 ##installed:安装软件包 10 ##latest:将软件更新到最新 11 ##removed:卸载软件包 12 ##pkgs:安装多个软件包时,一次全部安装(推荐) 13 ##names:安装多个软件包时,一次安装一个,需安装多次(不推荐)
service模块:
1 httpd: 2 service: 3 - running #使服务处于运行状态 4 - enable: True #设置开机自动启动 5 - reload: True #watch函数下监控的/etc/httpd/conf/httpd.conf文件发生变化,则会重新加载reload;若reload函数不存在或reload值为False,则会重新启动restart 6 - watch: 7 - file: /etc/httpd/conf/httpd.conf 8 - require: 9 - pkg: httpd 10 11 ##dead:使服务处于stop状态 12 13 ##reload值为True: 14 ID: httpd 15 Function: service.running 16 Result: True 17 Comment: Service reloaded ##reload服务 18 Started: 14:56:31.920445 19 Duration: 1702.923 ms 20 Changes: 21 ---------- 22 httpd: 23 True 24 25 ##不存在reload函数或reload值为False: 26 ID: httpd 27 Function: service.running 28 Result: True 29 Comment: Service restarted ##restart服务 30 Started: 14:58:05.723261 31 Duration: 1193.026 ms 32 Changes: 33 ---------- 34 httpd: 35 True
user模块:
user1: user: - present #- name: user1 #- home: /home/user1 #- shell: /bin/bash - uid: 600 - gid: 600 - system: True #设置为系统用户 - groups: #设置用户的所属组 - nobody #把user1用户加入到nobody组中,且仅属于nobody组;如果用户原本在jeff组中,执行后用户只在nobody组中,不再属于jeff组了 #- group1 ##absent:删除用户 ##force:强制删除用户(即便用户正在登陆)
实例:
公司来新的员工,需要在所有的服务器上添加一个普通账号:
1 ##先创建MD5加密密码 2 [root@dbm133 ~]# openssl passwd -1 -salt 'shencj' ##用户名,如这个shencj用户可以不存在;但是必须和下面创建的新用户对应 3 Password: ##输入密码 4 $1$shencj$i3JtzHYM7hFcNP63VLK..1 ##生成的加密密码
1 ##定义pillar变量 2 [root@dbm133 ~]# cat /srv/pillar/user/init.sls 3 username: shencj 4 password: '$1$shencj$i3JtzHYM7hFcNP63VLK..1'
1 ##创建state的.sls文件 2 [root@dbm133 ~]#cat /srv/salt/user/adduser.sls 3 {{ pillar['username'] }}: 4 user: 5 - present 6 # - uid: 1001 7 # - gid: 1001 8 - password: {{ pillar['password'] }} 9 - groups: 10 - nobody 11 12 /home/{{ pillar['username'] }}/.ssh: 13 file: 14 - directory 15 - require: 16 - user: {{ pillar['username'] }} 17 18 /home/{{ pillar['username'] }}/.ssh/authorized_keys: 19 file: 20 - managed 21 - source: salt://files/authorized_keys 22 - mode: 400 23 - user: {{ pillar['username'] }} 24 - group: {{ pillar['username'] }} 25 - require: 26 - file: /home/{{ pillar['username'] }}/.ssh
1 ##master端数据推送 2 [root@dbm133 ~]# salt '*' state.sls user.adduse