saltstack模块分解解析

创建目录:
一个创建目录基本的例子:

create my_new_directory:
 file.directory:
   - name: /opt/my_new_directory
   - user: root
   - group: root
   - mode: 755

更多的例子看这里;https://docs.saltstack.com/en/latest/ref/states/all/salt.states.file.html#salt.states.file.directory
服务运行:
这个state确保了服务在客户端正在运行;

Make sure the mysql service is running:
  service.running:
    - name: mysql

上面函数的第一行的state声明是一个state ID,这个必须是唯一的,可包含数字空格,如下,也可以在一个声明下添加多重函数调用:

Install mysql and make sure the mysql service is running:
  pkg.installed:
    - name: mysql
  service.running:
    - name: mysql

下载一个git仓库:
每一个函数都有一个name参数,如果没有定义name值,salt会有state ID做为这个name的值,比如下面的例子:

https://github.com/saltstack/salt-bootstrap:
  git.latest:
    - rev: develop
    - target: /tmp/salt

通常情况下,大神都是这么写的,小白都是用下面的方法:

Clone the SaltStack bootstrap script repo:
  pkg.installed: 
    - name: git # make sure git is installed first!
  git.latest:
    - name: https://github.com/saltstack/salt-bootstrap
    - rev: develop
    - target: /tmp/salt

此处有了name值,所以不会去引用第一行的ID.
用户添加:

user account for pete:
  user.present:
    - name: pete
    - shell: /bin/bash
    - home: /home/pete
    - groups:
      - sudo

group的参数是一个列表,所以它在下一行,缩进两个空格,然后是一个破折号。
添加一个hosts;

myserver in hosts file:
  host.present:
    - name: myserver
    - ip: 192.168.0.42

调用一个函数:

restart vsftpd:
  module.run:
    - name: service.restart
    - m_name: vsftpd  # m_name gets passed to the execution module as "name"

函数调用可以参靠这里;https://docs.saltstack.com/en/latest/ref/modules/all/salt.modules.service.html#salt.modules.service.restart

pillar

在定义的pillar目录下创建一个top.sls文件,例如下面:

base:
  '*':
    - default

然后再统计目录下创建一个default.sls文件,内容如下:
editor: vim
这个定义了是对于所有的minion端有效,一旦刷新,所有的客户端都会执行,为了让其生效在素有的minion上,我们要执行下面命令:

salt '*' saltutil.refresh_pillar

pillar使用在state中:
salt pillar的key是在state中有效的,我们可以下面的例子来调用上面的pillar-key:

vim installed:
  pkg.installed:
    - name: {{ pillar['editor'] }}

pillar中一班定义的是比较敏感的数据,可以通过key: value来进行定义,如下:

ftpusername: me
ftppassword: oxfm4@8t5gglu^h^&

例如参考下面的例子:

sync directory using lftp:
  cmd.run:
    - name: lftp -c "open -u {{ pillar['ftpusername'] }},{{ pillar['ftppassword'] }}
           -p 22 sftp://example.com;mirror -c -R /local /remote"

要是通过命令行来设置pillar值,这些值会覆盖pillar文件中定义的值,所以要谨慎:

salt '*' state.apply ftpsync pillar='{"ftpusername": "test", "ftppassword": "0ydyfww3giq8"}'

include---

有时候可以能对于state-tree ,你需要对多个文件进行多次利用,这里include就派上用处了,例如下面这个例子:

sync directory using lftp:
  cmd.run:
    - name: lftp -c "open -u {{ pillar['ftpusername'] }},{{ pillar['ftppassword'] }}
           -p 22 sftp://example.com;mirror -c -R /local /remote"

这个例子中,lftp命令是需要被下载了才能执行的,但是我们有写到了另外一个lftp.sls中,要想执行这段,必须先下载lftp,下面是lftp.sls:
srv/salt/lftp.sls:

install lftp:
  pkg.installed:
    - name: lftp

用clude组合起来就是:

include:
  - lftp

sync directory using lftp:
  cmd.run:
    - name: lftp -c "open -u {{ pillar['ftpusername'] }},{{ pillar['ftppassword'] }}
           -p 22 sftp://example.com;mirror -c -R /local /remote"

note:include必须在stat文件顶部。
文件管理------
通过指定source源,可以管理本地文件:

deploy the http.conf file:
  file.managed:
    - name: /etc/http/conf/http.conf
    - source: salt://apache/http.conf

其中salt://所定义的路径是在master的配,置文件中的file_roots段定义的,一般定义的都是/srv/salt,你要管理的文件都要放这里。
minion下载lftp,然后将配置传到minion:

install network packages:
  pkg.installed:
    - pkgs:
      - rsync
      - lftp
      - curl

copy lftp config file:
  file.managed:
    - name: /etc/lftp.conf
    - source: salt://_tmpl_lftp.conf

目录传输:

copy some files to the web server:
  file.recurse:
    - name: /var/www
    - source: salt://apache/www

你可能感兴趣的:(saltstack模块分解解析)