Saltstack配置管理学习笔记:requisites处理状态之间关系 – 21运维
通知: .-...

Saltstack配置管理学习笔记:requisites处理状态之间关系

saltstack 21运维 3478浏览 0评论

通过上边的笔记《SaltStack配置管理学习笔记-LAMP自动化部署简单案例》,学习了如果借助于Saltstack的强大功能批量部署lamp环境,当然这里也可以用于其他环境的批量部署。今天的笔记出来记录下状态之间的关系,比如我们配置文件的时候,设计到一个依赖包依赖关系。我们知道,如果安装一个包,其依赖如果没有安装,那么会安装失败。 另外我们的配置文件发生变动的时候,需要对应的一些minion服务器也要对应做出变化,今天的这个笔记应该可以解决上边的疑问。

好的, 先记录下处理状态之间关系用到的几个重要的方法:
require: 我依赖某个状态   (长用于包安装)
require_in: 我被某个状态所依赖
watch:  我关注某个状态  (长用于文件改动)
watch_in: 我被某个状态所依赖

下边我针对之前lamp安装的一个实际案例做改动测试。之前安装lamp的时候,我们显示定义了一个ID声明:lamp-pkg-install,一开始我们先进行了一些包安装,比如:

lamp-pkg-install:
  pkg.installed:
    - names:
      - httpd
      - php
      - php-cli
      - php-common
      - mysql
      - mysql-server
      - php-mysql

1,依赖包状态实现。为了学习require和require_in,我将apachemysql-server拿出来,单独放到另外两个声明中,先记录下require和require_in的用法,lamp.sls改动后的内容如下:

lamp-pkg-install:
  pkg.installed:
    - names:
      - php
      - php-cli
      - php-common
      - mysql
      - php-mysql
      - php-pdo
apache-service:
  pkg.installed:
    - name: httpd
  file.managed:
    - name: /etc/httpd/conf/httpd.conf
    - source: salt://files/httpd.conf
    - user: root
    - group: root
    - mode: 644
    - require:
      - pkg: apache-service
  service.running:
    - name: httpd
    - enable: True
    - reload: True
mysql-service:
  pkg.installed:
    - name: mysql-server
    - require_in:
      - file: mysql-service
  file.managed:
    - name: /etc/my.cnf
    - source: salt://files/my.cnf
    - user: root
    - group: root
    - mode: 644
  service.running:
    - name: mysqld
    - enable: True

以apache-service这个ID声明为例,我将pkg.installed这个模块拿出来放到了apache-service声明中安装包,后边的file就加了一个方法项目require。意思是指,file这个操作的时候,文件改动需要依赖于pkg这个包安装完成,如果我这个包没有安装成功,那么后边的执行就会失败。
相反,mysql-service这个ID声明就是,包的安装那里加了一个require_in方法项目,意思是指我的执行状态被file所依赖,如果我执行不成功,后边的file操作就出问题。
注意依赖写法: 针对的模块下边我们进行连续项目书写,通过短横线”-“来标注,后边低一层直接写  -模块: ID声明。可以归纳为:
……上一级

–  require:
– module: 声明ID
或者
……上一级
–  require_in:
– module: 声明ID

2,文件关注状态改动实现。 上边说的,比如我们的配置文件需要做批量改动的时候,需要对应的客户端进行批量更新操作,这样可以减少人为操作,提升效率,同时减少人为故障。比如我们的配置文件发生改动的时候,需要进行批量更新。有些文件改动以后,还可能需要一些服务进行重载reload操作或一些重启操作才可以生效,那么watch和watch_in就可以完美实现了。
还是以刚才的lamp.sls为例,改动后的代码如下:

lamp-pkg-install:
  pkg.installed:
    - names:
      - php
      - php-cli
      - php-common
      - mysql
      - php-mysql
      - php-pdo
apache-service:
  pkg.installed:
    - name: httpd
  file.managed:
    - name: /etc/httpd/conf/httpd.conf
    - source: salt://files/httpd.conf
    - user: root
    - group: root
    - mode: 644
    - require:
      - pkg: apache-service
  service.running:
    - name: httpd
    - enable: True
    - reload: True
    - watch:
      - file: apache-service
mysql-service:
  pkg.installed:
    - name: mysql-server
    - require_in:
      - file: mysql-service
  file.managed:
    - name: /etc/my.cnf
    - source: salt://files/my.cnf
    - user: root
    - group: root
    - mode: 644
    - watch_in:
      - service: mysql-service
  service.running:
    - name: mysqld
    - enable: True

可以看到我加了一个watch和watch_in,我们以apache-service这个ID声明为例,service.running那里多了一个方法项目watch,意思是指我关注file这个模块,如果里边的配置文件发生了变化,我需要进行-reload重载操作(如果没有-reload参数,就是进行的restart重启操作) ; mysql这里设置一个了一个watch_in,意思是之我被service.这个组件所关注,如果我的状态发生了变化,service会进行重启操作。
其组件的写法和上述的require 和require_in 是一样的,都是连续项目下并后边指定了对应操作的组件以及ID声明。
现在我分别改动httpd.conf和my.cnf ,分别添加了注释#21yunweitest,执行state.highstate操作,我们改动上述结果以后可以看到如下执行结果:

----------
          ID: apache-service
    Function: file.managed
        Name: /etc/httpd/conf/httpd.conf
      Result: True
     Comment: File /etc/httpd/conf/httpd.conf updated
     Started: 03:47:42.508502
    Duration: 164.147 ms
     Changes:   
              ----------
              diff:
                  ---  
                  +++  
                  @@ -6,7 +6,7 @@
                   # <URL:http://httpd.apache.org/docs/2.2/mod/directives.html>
                   # for a discussion of each configuration directive.
                   #
                  -#testtest
                  +#21yunweiteset
                   # Do NOT simply read the instructions in here without understanding
                   # what they do.  They're here only as hints or reminders.  If you are unsure
                   # consult the online docs. You have been warned.  
----------
          ID: apache-service
    Function: service.running
        Name: httpd
      Result: True
     Comment: Service reloaded
     Started: 03:47:42.709626
    Duration: 643.341 ms
     Changes:   
              ----------
              httpd:
                  True

由于我改动了httpd.conf文件,上述结果执行显示了客户端已经更新了客户端的httpd.conf文件,并对客户端的服务进行了reload操作生效。

----------
          ID: mysql-service
    Function: file.managed
        Name: /etc/my.cnf
      Result: True
     Comment: File /etc/my.cnf updated
     Started: 03:47:43.359358
    Duration: 151.835 ms
     Changes:   
              ----------
              diff:
                  ---  
                  +++  
                  @@ -4,7 +4,7 @@
                   user=mysql
                   # Disabling symbolic-links is recommended to prevent assorted security risks
                   symbolic-links=0
                  -#testtest
                  +#21yunweitest
                   [mysqld_safe]
                   log-error=/var/log/mysqld.log
                   pid-file=/var/run/mysqld/mysqld.pid
----------
          ID: mysql-service
    Function: service.running
        Name: mysqld
      Result: True
     Comment: Service restarted
     Started: 03:47:43.557556
    Duration: 4327.916 ms
     Changes:   
              ----------
              mysqld:

可以看到,由于我修改了my.cnf,文件进行了更新 添加了#21yunweitest 并对mysqld进行了重启操作。
笔记到此结束。以后剩下的就是多练习多实践了。

转载请注明:21运维 » Saltstack配置管理学习笔记:requisites处理状态之间关系

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (2)

  1. 博主辛苦了。 很好,刚看完saltstack基础,准备实战一下。遇到这块的问题,学习了!
    • 希望你有所收获吧,以后可以相互学习和交流。根据我自己的经验,用salt提升自己最好的办法就是多用多实践,用多了就自然熟了。
      21运维2016-08-01 11:35 回复