分享好友

×
取消 复制
自动化运维工具puppet详解---资源的特殊属性
2020-03-04 17:29:14

4、资源的特殊属性

  puppet中也提供了beforerequirenotifysubscribe四个参数来定义资源之间的依赖关系和通知关系。

before:表示需要依赖于某个资源
require:表示应该先执行本资源,在执行别的资源
notify:A notify B:B依赖于A,且A发生改变后会通知B;
subscribe:B subscribe A:B依赖于A,且B监控A资源的变化产生的事件;

  同时,依赖关系还可以使用->~>来表示:

-> 表示后资源需要依赖前资源
~> 表示前资源变动通知后资源调用

  举例如下:

vim file.pp
	file{'test.txt':					#定义一个文件
		path   => '/data/test.txt',
		ensure  => file,
		source  => '/etc/fstab',
	}

	file{'test.symlink':				#依赖文件建立超链接
		path   => '/data/test.symlink',
		ensure  => link,
		target  => '/data/test.txt',
		require => File['test.txt'],
	}

	file{'test.dir':					#定义一个目录
		path   => '/data/test.dir',
		ensure  => directory,
		source  => '/etc/yum.repo.d/',
		recurse => true,
	}

  我们还可以使用在最下面统一写依赖关系的方式来定义:

vim redis.pp
	package{'reids':
		ensure  => installed,
	}

	file{'/etc/redis.conf':
		source  => '/root/manifets/files/redis.conf',
		ensure  => file,
		owner   => redis,
		group   => root,
		mode    => '0640',
	}

	service{'redis':
		ensure  => running,
		enable  => true,
		hasrestart => true,
	}

	Package['redis'] -> File['/etc/redis.conf'] -> Service['redis']	#定义依赖关系

tag 标签

  如同 anssible 一样,puppet 也可以定义“标签”——tag,打了标签以后,我们在运行资源的时候就可以只运行某个打过标签的部分,而非全部。这样就更方便于我们的操作。
 一个资源中,可以有一个tag也可以有多个。具体使用语法如下:

type{'title':
	...
    tag => 'TAG1',
}
            
type{'title':
    ...
    tag => ['TAG1','TAG2',...],
}

  调用时的语法如下:

	puppet apply --tags TAG1,TAG2,... FILE.PP

实例
  首先,我们去修改一下redis.pp文件,添加一个标签进去

vim redis.pp
	package{'redis':
		ensure  => installed,
	}

	file{'/etc/redis.conf':
		source  => '/root/manifets/file/redis.conf',
		ensure  => file,
		owner   => redis,
		group   => root,
		mode    => '0640',
		tag    => 'instconf'		#定义标签
	}

	service{'redis':
		ensure  => running,
		enable  => true,
		hasrestart => true,
	}

	Package['redis'] -> File['/etc/redis.conf'] -> Service['redis']

  然后,我们手动先开启redis服务:

	systemctl start redis

  现在,我们去修改一下file目录下的配置文件:

vim file/redis.conf 
	requirepass keerya

  接着,我们就去运行redis.pp,我们的配置文件已经修改过了,现在想要实现的就是重启该服务,实现,需要使用密码keer登录:

	puppet apply -v --tags instconf redis.pp
enter description here
 
redis.pp运行结果

  现在,我们就去登录一下redis看看是否生效:

	redis-cli -a keerya
enter description here
 
redis验证

  验证成功,实验完成。

5、puppet 变量

  puppet 变量以“$”开头,赋值操作符为“=”,语法为$variable_name=value
数据类型:

  字符型:引号可有可无;但单引号为强引用双引号为弱引用;支持转义符;
  数值型:默认均识别为字符串,仅在数值上下文才以数值对待;
  数组:[]中以逗号分隔元素列表;
  布尔型值:true, false;不能加引号
  hash:{}中以逗号分隔k/v数据列表; 键为字符型,值为任意puppet支持的类型;{ ‘mon’ => ‘Monday’, ‘tue’ => ‘Tuesday’, };
  undef:从未被声明的变量的值类型;

正则表达式:

  (?<ENABLED OPTION>:<PATTERN>)
  (?-<DISABLED OPTION>:<PATTERN>)
  OPTIONS:
    i:忽略字符大小写;
    m:把.当换行符;
    x:忽略<PATTERN>中的空白字符;
  (?i-mx:PATTERN)
注意:不能赋值给变量,仅能用在接受=~!~操作符的位置;

1)puppet的变量种类

  puppet 种类有三种,为facts内建变量用户自定义变量
facts:
  由facter提供;top scope;
内建变量:
  master端变量
    $servername, $serverip, $serverversion
  agent端变量
    $clientcert, $clientversion, $environment
  parser变量
    $module_name
用户自定义变量

2)变量的作用域

  不同的变量也有其不同的作用域。我们称之为Scope
  作用域有三种,top scope,node scope,class scope。
  其生效范围排序为:top scope > node scope > class scope

enter description here
 
变量生效范围

  其优先级排序为:top scope < node scope < class scope

6、puppet 流程控制语句

  puppet 支持if 语句case 语句selector 语句

1)if 语句

  if语句支持单分支,双分支和多分支。具体语法如下:

单分支:
	if CONDITION {
		statement
		……
	}

双分支:
	if CONDITION {
		statement
		……
	}
	else{
		statement
		……		
	}

多分支:
	if CONDITION {
		statement
		……
	}
	elsif CONDITION{
		statement
		……
	}
	else{
		statement
		……		
	}

  其中,CONDITION的给定方式有如下三种:

  • 变量
  • 比较表达式
  • 有返回值的函数

举例

vim if.pp
	if $operatingsystemmajrelease == '7' {
		$db_pkg='mariadb-server'
	}else{
		$db_pkg='mysql-server'
	}

	package{"$db_pkg":
		ensure => installed,
	}

2)case 语句

  类似 if 语句,case 语句会从多个代码块中选择一个分支执行,这跟其它编程语言中的 case 语句功能一致。
  case 语句会接受一个控制表达式和一组 case 代码块,并执行第一个匹配到控制表达式的块。
  使用语法如下:

case CONTROL_EXPRESSION {
	case1: { ... }
	case2: { ... }
	case3: { ... }
	……
	default: { ... }
}

  其中,CONTROL_EXPRESSION的给定方式有如下三种:

  • 变量
  • 表达式
  • 有返回值的函数

  各case的给定方式有如下五种:

  • 直接字串;
  • 变量
  • 有返回值的函数
  • 正则表达式模式;
  • default

举例

vim case.pp
	case $osfamily {
		"RedHat": { $webserver='httpd' }
		/(?i-mx:debian)/: { $webserver='apache2' }
		default: { $webserver='httpd' }
	}

	package{"$webserver":
		ensure  => installed,    before  => [ File['httpd.conf'], Service['httpd'] ],
	}

	file{'httpd.conf':
		path    => '/etc/httpd/conf/httpd.conf',
		source  => '/root/manifests/httpd.conf',
		ensure  => file,
	}

	service{'httpd':
		ensure  => running,
		enable  => true,    restart => 'systemctl restart httpd.service',
		subscribe => File['httpd.conf'],
	}

3)selector 语句

  Selector 只能用于期望出现直接值(plain value) 的地方,这包括变量赋值、资源属性、函数参数、资源标题、其它 selector。
  selector 不能用于一个已经嵌套于于selector 的case 中,也不能用于一个已经嵌套于case 的case 语句中。
  具体语法如下:

CONTROL_VARIABLE ? {
	case1 => value1,
	case2 => value2,
	...
	default => valueN,
}

  其中,CONTROL_EXPRESSION的给定方式有如下三种:

  • 变量
  • 表达式
  • 有返回值的函数

  各case的给定方式有如下五种:

  • 直接子串;
  • 变量;
  • 有返回值的函数;
  • 正则表达式模式;
  • default

  selectors 使用要点:

  1. 整个selector 语句会被当作一个单独的值,puppet 会将控制变量按列出的次序与每个case 进行比较,并在遇到一个匹配的 case 后,将其值作为整个语句的值进行返回,并忽略后面的其它 case。
  2. 控制变量与各 case 比较的方式与 case 语句相同,但如果没有任何一个 case 与控制变量匹配时,puppet 在编译时将会返回一个错误,因此,实践中,其必须提供default case。
  3. selector 的控制变量只能是变量或有返回值的函数,切记不能使用表达式。
  4. 其各 case 可以是直接值(需要加引号) 、变量、能调用返回值的函数、正则表达式模式或 default。
  5. 但与 case 语句所不同的是,selector 的各 case 不能使用列表。
  6. selector 的各 case 的值可以是一个除了 hash 以外的直接值、变量、能调用返回值的函数或其它的 selector。

举例

vim selector.pp
	$pkgname = $operatingsystem ? {
		/(?i-mx:(ubuntu|debian))/       => 'apache2',
		/(?i-mx:(redhat|fedora|centos))/        => 'httpd',
		default => 'httpd',
	}
	package{"$pkgname":
		ensure  => installed,
	}
分享好友

分享这个小栈给你的朋友们,一起进步吧。

服务器与存储
创建时间:2020-06-17 17:54:39
服务器是计算机的一种,它比普通计算机运行更快、负载更高、价格更贵。服务器在网络中为其它客户机(如PC机、智能手机、ATM等终端甚至是火车系统等大型设备)提供计算或者应用服务。存储市场将继续经历飞速的变革,这些变革由现正进行的存储资源网络化以及存储虚拟化进程所推动。
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • 栈栈
    专家
猜你喜欢
戳我,来吐槽~