创建目录:
一个创建目录基本的例子:
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