SaltStack--镜像管理

原创
小哥 3年前 (2022-11-02) 阅读数 10 #PHP
文章标签 PHP

SaltStack--配置管理

saltstack配置管理 #

Saltstack状态模块 #

远程执行模块的执行是程序性的,而状态是正确的。 minion 一个描述和定义,管理者不需要描述部署任务是如何完成的,只需描述它。 minion 状态描述。
它的和声是写下来的 sls(Salt State file) 文件, sls 该文件的默认格式为 YAML 格式,并默认使用它。 jinja 模板, jinja 是根据 django 模板语言是从该语言发展而来的,简单而强大,支持 for if 和其他循环语句。 salt state 它主要用于描述系统、服务和配置文件的状态,通常称为配置管理。

mysql-install: #ID声明,必须唯一 pkg.installed: #state状态声明

  • pkgs: #选项声明
    • mariadb: #选项列表
    • mariadb-server

说明: 一个ID只能出现一次 一个ID同一模块只能使用一次。 一个ID下不能使用多个不同的模块

模块帮助手册

列出所有状态模块

[root@salt-master ~]# salt * sys.list_modules

查看指定模块的所有方法。

[root@salt-master ~]# salt * sys.list_state_functions pkg

查看如何使用指定的模块。

[root@salt-master ~]# salt * sys.state_doc pkg

查看指定模块的指定方法的用法。

[root@salt-master ~]# salt * sys.state_doc pkg.installed

pkg软件模块 #

pkg模块官档

pkg.installed 软件安装

php-install: pkg.installed:

  • pkgs:
    • php
    • php-mysql: ">=5.4.16" #指定安装版本
    • php-pdo
    • php-cli

指定安装最新版本的软件

php-install: pkg.latest:

  • pkgs:
    • php
    • php-mysql
    • php-pdo
    • php-cli

file文件模块 #

file模块官档

file.managed 签发文件以确保文件的存在

[root@salt-master ~]# mkdir /srv/salt/base/files [root@salt-master ~]# cp /etc/httpd/conf/httpd.conf /srv/salt/base/files/ [root@salt-master ~]# cat /srv/salt/base/apache_conf.sls apache-config: file.managed:

  • name: /etc/httpd/conf/httpd.conf
  • source: salt://files/httpd.conf
  • user: root
  • group: root
  • mode: 644

说明:

  • name: 指示要存储的目标地址
  • source: 指明本文件的出处(声明本文件必须事先准备)

或者以这种方式写入,直接使用目标地址命令ID,这样ID还指示目标地址 [root@salt-master ~]# cat /srv/salt/base/apache_conf.sls /etc/httpd/conf/httpd.conf: file.managed:

  • source: salt://files/httpd.conf
  • user: root
  • group: root
  • mode: 644

小示例: [root@salt-master ~]# cat /srv/salt/base/test.sls /tmp/passwd_back: file.managed:

  • source: salt://files/passwd
  • user: root
  • group: root
  • mode: 644 [root@salt-master ~]# cp /etc/passwd /srv/salt/base/files/ [root@salt-master ~]# salt state.sls test [root@salt-master ~]# salt cmd.run "ls -l /tmp/passwd_back" salt-minion03: -rw-r--r-- 1 root root 2098 May 15 16:21 /tmp/passwd_back salt-minion02: -rw-r--r-- 1 root root 2098 May 15 16:21 /tmp/passwd_back salt-minion01: -rw-r--r-- 1 root root 2098 May 15 16:21 /tmp/passwd_back

file.directory 建立目录

[root@salt-master ~]# cat /srv/salt/base/directory.sls /tmp/saltdir: file.directory:

  • user: root
  • group: root
  • mode: 755
  • makedirs: True #如果先前的目录不存在,则自动创建;类似(mkdir -p)

[root@salt-master ~]# salt state.sls directory [root@salt-master ~]# salt cmd.run "ls -d /tmp/saltdir" salt-minion03: /tmp/saltdir salt-minion02: /tmp/saltdir salt-minion01: /tmp/saltdir

file.recurse 发行整个目录

[root@salt-master ~]# cat /srv/salt/base/httpd_conf_dir.sls httpd_conf_dir: file.recurse:

  • name: /etc/httpd/conf.d
  • source: salt://files/conf.d
  • file_mode: 600 #文件权限
  • dir_mode: 755 #目录权限
  • include_empty: True #同步空目录
  • clean: True #使用后minion与master保持一致

[root@salt-master ~]# rsync -avh /etc/httpd/conf.d /srv/salt/base/files/

file.symlink 建立软链接

[root@salt-master ~]# cat /srv/salt/base/target_link.sls /etc/grub.cfg: file.symlink:

  • target: /etc/grub2.cfg

[root@salt-master ~]# salt state.sls target_link [root@salt-master ~]# salt cmd.run "ls -l /etc/grub.cfg" salt-minion03: lrwxrwxrwx 1 root root 14 May 15 16:42 /etc/grub.cfg -> /etc/grub2.cfg salt-minion01: lrwxrwxrwx 1 root root 14 May 15 16:42 /etc/grub.cfg -> /etc/grub2.cfg salt-minion02: lrwxrwxrwx 1 root root 14 May 15 16:42 /etc/grub.cfg -> /etc/grub2.cfg

service服务模块 #

service模块官档

[root@salt-master ~]# cat /srv/salt/base/service_httpd.sls httpd: service.running:

  • name: httpd #服务名称
  • enable: True #启动自启动
  • reload: True #允许重新加载配置文件,而不是写入restart

或者像这样写 [root@salt-master ~]# cat /srv/salt/base/service_httpd.sls httpd: #即表示ID,它还表示服务名称 service.running:

  • enable: True
  • reload: True

高级状态模块 #

当我们希望不同的主机应用不同的配置时,我们可以使用高级状态管理。 top file
去管理。可以通过常规的、 grain 模块或组名进行匹配,然后执行下一级。 state 文件

可以改变我们的配置要求 YAML 并在 Top file 文件指出:

Top file 示例

base: *: #按常规进行全部匹配minion

  • app.nginx

    webserver: #已定义的组名

  • match: nodegroup
  • app.cron

    os:centos: #通过grains模块匹配

  • match: grains
  • nginx

Top file 执行高级状态

[root@salt-master ~]# salt * state.highstate

LAMP架构案例 #

说明 :案子在里面 prod 环境配置

1)环境准备、定义 file_roots 环境

[root@salt-master ~]# vim /etc/salt/master file_roots: base:

  • /srv/salt/base dev:
  • /srv/salt/dev prod:
  • /srv/salt/prod

2)创建相应的环境目录

[root@salt-master ~]# mkdir -p /srv/salt/{base,dev,prod} [root@salt-master ~]# mkdir /srv/salt/prod/{httpd,php,mysql,files}

3配置文件准备和测试文件准备。

[root@salt-master ~]# cp /etc/my.cnf /srv/salt/prod/files/ [root@salt-master ~]# cp /etc/httpd/conf/httpd.conf /srv/salt/prod/files/ [root@salt-master ~]# cp /etc/php.ini /srv/salt/prod/files/ [root@salt-master ~]# echo "

LAMP html

" >>/srv/salt/prod/files/index.html [root@salt-master ~]# echo "<?php phpinfo(); ?>" >> /srv/salt/prod/files/index.php

4)编写 state sls 状态文件

httpd

[root@salt-master ~]# cat /srv/salt/prod/httpd/init.sls apache-install: pkg.installed:

  • pkgs:
    • httpd
    • httpd-tools

apache-config: file.managed:

  • name: /etc/httpd/conf/httpd.conf
  • source: salt://files/httpd.conf
  • user: root
  • group: root
  • mode: 644

apache-service: service.running:

  • name: httpd
  • enable: True

php

[root@salt-master ~]# cat /srv/salt/prod/php/init.sls php-install: pkg.installed:

  • pkgs:
    • php
    • php-mysql
    • php-pdo
    • php-cli

php-config: file.managed:

  • name: /etc/php.ini
  • source: salt://files/php.ini
  • user: root
  • group: root
  • mode: 644

mysql

[root@salt-master ~]# cat /srv/salt/prod/mysql/init.sls mariadb-install: pkg.installed:

  • pkgs:
    • mariadb-server
    • mariadb

mariadb-config: file.managed:

  • name: /etc/my.cnf
  • source: salt://files/my.cnf
  • user: root
  • group: root
  • mode: 644

mariadb-service: service.running:

  • name: mariadb
  • enable: True

测试文件

[root@salt-master ~]# cat /srv/salt/prod/testfile.sls /var/www/html/index.html: file.managed:

  • source: salt://files/index.html

/var/www/html/index.php: file.managed:

  • source: salt://files/index.php

6) topfile 文件编写

[root@salt-master ~]# cat /srv/salt/base/top.sls prod: salt-minion*:

  • httpd.init
  • php.init
  • mysql.init
  • testfile

7)部署 LAMP 整体 state 文件查看

[root@salt-master ~]# tree /srv/salt/ /srv/salt/ ├── base │   └── top.sls ├── dev └── prod ├── files │   ├── httpd.conf │   ├── index.html │   ├── index.php │   ├── my.cnf │   └── php.ini ├── httpd │   └── init.sls ├── mysql │   └── init.sls ├── php │   └── init.sls └── testfile.sls

8)执行 topfile

[root@salt-master ~]# salt * state.highstate

States状态依赖 #

通过以上几点 lamp 可以看出,它已经可以使用了。 state 要定义的模块 minion 但是,如果主机涉及多个状态,并且这些状态彼此相关,则存在执行顺序,则必须引用它。 requisites 去控制

关系描述:
1、 require 我依赖于某个国家,我依赖于谁
2、 require_in 我依赖于某种状态,谁依赖于我
3、 watch 我专注于某个状态,当状态发生变化时,继续进行。 restart 或者 reload 操作
4、 watch_in 我担心的是某个州
5、 include 我引用谁

1)修改上述内容 lamp 州际附属地

httpd

[root@salt-master ~]# cat /srv/salt/prod/httpd/init.sls apache-install: pkg.installed:

  • pkgs:
    • httpd
    • httpd-tools

apache-config: file.managed:

  • name: /etc/httpd/conf/httpd.conf
  • source: salt://files/httpd.conf
  • user: root
  • group: root
  • mode: 644
  • require:
    • pkg: apache-install #表示上面apache-install先执行成功后执行apache-config

apache-service: service.running:

  • name: httpd
  • enable: True
  • require:
    • file: apache-config
  • watch:
    • file: apache-config

php

[root@salt-master ~]# cat /srv/salt/prod/php/init.sls php-install: pkg.installed:

  • pkgs:
    • php
    • php-mysql
    • php-pdo
    • php-cli
  • reqiure_in:
    • file: php-config

php-config: file.managed:

  • name: /etc/php.ini
  • source: salt://files/php.ini
  • user: root
  • group: root
  • mode: 644

mysql

[root@salt-master ~]# cat /srv/salt/prod/mysql/init.sls mariadb-install: pkg.installed:

  • pkgs:
    • mariadb-server
    • mariadb

mariadb-config: file.managed:

  • name: /etc/my.cnf
  • source: salt://files/my.cnf
  • user: root
  • group: root
  • mode: 644
  • require:
    • pkg: mariadb-install

mariadb-service: service.running:

  • name: mariadb
  • enable: True
  • reload: True
  • require:
    • file: mariadb-config
  • watch:
    • file: mariadb-config

2)修改参照关系后 include

[root@salt-master ~]# tree /srv/salt/ /srv/salt/ ├── base │   └── top.sls ├── dev └── prod ├── files │   ├── httpd.conf │   ├── index.html │   ├── index.php │   ├── my.cnf │   └── php.ini ├── httpd │   └── init.sls ├── lamp.sls ├── mysql │   └── init.sls ├── php │   └── init.sls └── testfile.sls

[root@salt-master ~]# cat /srv/salt/prod/lamp.sls include:

  • httpd.init
  • php.init
  • mysql.init
  • testfile

[root@salt-master ~]# cat /srv/salt/base/top.sls prod: salt-minion*:

  • lamp

3)编写 SLS 技巧

1,根据状态分类,如果单独使用,则清除 2根据服务分类,可以是其他。SLS引用

Jinja模板使用 #

配置文件通常是灵活的,例如配置。 apacheIP 地址或端口 PORT 依此类推,您可以动态传递该值。

Jinja官档
salt jinja官档

Jinja2 该模板包含使用的变量和表达式。 { { … }} 请附上,表达式。 {% … %} 被包围了。变量用法示例:

[root@salt-master ~]# cat /srv/salt/base/var.sls {% set var= hello world! %} test_var: cmd.run:

  • name: echo "测试变量 {{ var }}"

[root@salt-master ~]# salt salt-minion01 state.sls var salt-minion01:

      ID: test\_var
Function: cmd.run
    Name: echo "测试变量 hello world!"
  Result: True
 Comment: Command "echo "测试变量 hello world!"" run
 Started: 14:50:58.302424
Duration: 12.358 ms
 Changes:   
          ----------
          pid:
              22510
          retcode:
              0
          stderr:
          stdout:
              测试变量 hello world!

Summary for salt-minion01

Succeeded: 1 (changed=1) Failed: 0

Total states run: 1 Total run time: 12.358 ms

jinja2 常用变量

1,字符串类型

{% set var = test %} #定义变量 {{ var }} #调用变量

2,列表类型

{% set list = [one, two, three] %} {{ list[1] }} #获取变量的第一个值

3,词典类型

{% set dict = {key1:value1, key2:value2} %} {{ dict[key1] }} #获取key1的值

示例1: Saltstack 使用 jinja 模块配置 apache 监听端口

1.告诉fileStatus模块,需要使用jinja

- template: jinja

2.参数列表

- defaults:
  PORT: 8000

3.纵断面参照jinja模板

{{ PORT }}

配置示例

apache-config: file.managed:

  • name: /etc/httpd/conf/httpd.conf
  • source: salt://files/httpd.conf
  • user: root
  • group: root
  • mode: 644
  • template: jinja
  • defaults: PORT: 8000

修改httpd.conf纵断面参照变量

Listen {{ PORT }}

示例2: 使用 grinas 赋值方式

配置示例

apache-config: file.managed:

  • name: /etc/httpd/conf/httpd.conf
  • source: salt://files/httpd.conf
  • user: root
  • group: root
  • mode: 644
  • template: jinja
  • defaults: PORT: 8000 IPADDR: {{ grains[fqdn_ip4][0] }}

修改httpd.conf纵断面参照变量

Listen {{ IPADDR }}:{{ PORT }}

示例3 :通过 jinja+grains 取决于系统安装 apache

[root@salt-master ~]# cat /srv/salt/base/httpd.sls

根据grains获得价值辨别系统后,安装软件

httpd-install: pkg.installed: {% if grains[os] == CentOS %}

  • name: httpd {% elif grains[OS] == Debin %}
  • name: apache2 {% endif %}

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除