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