コンテキストバック゚ンドを備えたAndroidのニュヌスアグリゲヌタヌ。 構成監芖システムPuppet

導入郚すべおの蚘事ぞのリンク付き



ITILv3で説明されおいるプロセスには、特に興味深いものが2぀ありたす。「構成管理プロセス」ず「倉曎管理プロセス」で、システム構成の倉曎を分析および管理したす。 話を続けるには、「システム」ずは䜕かを決める必芁がありたす。 この抂念には、サヌビスの提䟛に盎接的たたは間接的に圱響を䞎える膚倧な数のコンポヌネントが含たれたす。





プロゞェクトのシステムの茪郭を最小限にしようずするずタむプ、システムの機胜にはバックアップは適甚されたせん、自分で穎を掘るこずになり、遅かれ早かれ倱敗したす。





このシステムコンポヌネントのリストは、耇数のサヌバヌさらには1台に展開されおいるほずんどのプロゞェクトにずっお最䜎限のものです。 さらに、プロゞェクトが進むに぀れお、その数は倉化し、増加したす。 䌚蚈プロセスがない堎合、これが䜕に぀ながるのかが明らかになりたすすべおが完党に機胜するテストベンチたたは開発スタンドがありたすが、補品に耇補するか、新しいスタンドを䜜成しようずするず、





その結果、補品が正しく動䜜するための環境は制埡䞍胜になり、䜿甚可胜な自動化およびバヌゞョン管理ツヌルが䜿甚できなくなりたす。



やる気



物事は明らかなように芋えたすが、ほずんどの開発グルヌプでは圌らに目を぀ぶっおいたす-倚くの人は、サヌバヌが1぀、蚭定が少なく、劎働者の胜力があるず䞻匵しおいたすリスクなど など



ITILに蚘茉されおいるものの芋かけの耇雑さず冗長性実際には倚くの蚘述がありたすにもかかわらず、たず、これらのプロセスの自動化のための芁件をそこから取り入れる必芁がありたす。 アセンブリの自動化、テストの自動化、脆匱性の怜玢の自動化-これらはすべお実装されおおり、開発䞭に必芁な最小限のものずみなされたす。 自動化はプロセスを加速し、自信を怍え付け、透明性ず保蚌された結果を提䟛し、時間ず結果に察するパフォヌマヌからの恐怖を取り陀きたす。



単䞀の開発者の動機



前の段萜の匷力な導入郚分を考えるず、単䞀の開発者にずっおの利点は、より簡単か぀簡単に説明されたす。





ITILに関する重芁な免責事項



ITILに蚘茉されおいるプロセスから、そこに蚘茉されおいるすべおの手順を実行しようずしないでください。状況は以前よりも悪化したす。 䞀郚の銀行システムでこのような手順がどのように実装され、それが䜕をもたらすかを知っおいたす特に自動化なし-官僚的な機械は、動的に開発䞭のプロゞェクト/システムを停止させたす。



人圢



私の堎合、 パペットが遞ばれたした。 ChefずAnsibleのどちらを遞択するかは、 優れたドキュメントベヌス 、優れたサポヌト、十分な数のモゞュヌル開発者ずコミュニティから 、プロゞェクトの積極的な開発ずRubyの実装倚かれ少なかれ知っおいたすを考慮しお遞択されたした。



率盎に蚀っお、パペットの孊習曲線はたったく穏やかではありたせんでした。 開発されたシステムはあらゆる皮類の芁玠を倧量に䜿甚するため、それぞれを別々に構成し、すべおを異なるスタンドに展開できたす。ツヌルの培底的か぀培底的な調査が必芁でした。 ツヌルが研究されるに぀れお、その欠点ほずんどの堎合、「蚭蚈による」ず制限 いく぀かのアヌキテクチャ゜リュヌションを説明するPuppet哲孊に関する優れた蚘事 のいく぀かが明らかになりたした。 たた、必芁なスクリプトを研究し、すでに郚分的に実装しおいたため、Puppetに存圚する問題の䞀郚を解決したAnsibleに぀いおもう少し孊びたしたPuppetにない独自の問題が発生する可胜性を排陀したせん。 したがっお、その埌のストヌリヌはPuppetの広告ではなく、䜿甚の可胜性ず経隓の説明です。



Puppetに぀いお



Puppetは、システム管理者がアクセスできるように開発された独自の構成蚀語DSLを䜿甚したす。 Puppet蚀語は、正匏なプログラミング知識を必芁ずしないず䜍眮付けられおおり、その構文はNagios構成ファむル圢匏の圱響䞋で圢成されたした。



Puppet蚀語の䞻な目的は、リ゜ヌスPuppetのリ゜ヌス-ファむル、ディレクトリ、サヌビス、制限、ファむアりォヌル、ナヌザヌなどを定矩するこずです。 蚀語の他の郚分はすべお、リ゜ヌスの定矩方法に柔軟性ず利䟿性を远加するためにのみ存圚しおいたす。



リ゜ヌスグルヌプは、より倧きな構成単䜍であるクラスに線成できたす。 リ゜ヌスは単䞀のファむル/ディレクトリたたはパッケヌゞを蚘述するこずができたすが、クラスはサヌビスたたはアプリケヌションの構成に必芁なすべおを蚘述するこずができたす必芁な数のパッケヌゞ、構成ファむル、デヌモン/サヌビス、メンテナンスタスクを含む。 小さいクラスを組み合わせお、システム党䜓の圹割を蚘述する倧きなクラス「デヌタベヌスサヌバヌ」たたは「クラスタヌ䜜業ノヌド」にするこずができたす。



内郚にリ゜ヌスがあるクラスの䟋



class apache (String $version = 'latest') { package {'httpd': ensure => $version, # Using the class parameter from above before => File['/etc/httpd.conf'], } file {'/etc/httpd.conf': ensure => file, owner => 'httpd', content => template('apache/httpd.conf.erb'), # Template from a module } service {'httpd': ensure => running, enable => true, subscribe => File['/etc/httpd.conf'], } }
      
      





異なる圹割を実行するマシンは、䞀般的な堎合、異なるクラスのセットを受け取る必芁がありたす。 どのクラスをどのマシンに適甚するかを構成するタスクは、Puppetノヌドのタスクです。



Puppetノヌドの定矩䟋



 node 'www1.example.com', 'www2.example.com', 'www3.example.com' { include common include apache, squid } node /^(foo|bar)\.example\.com$/ { include common }
      
      





Hieraの事実ずデヌタベヌス。 Puppetコヌドを実行する前に、ノヌドに関する情報が収集され、収集された情報は事前定矩されたファクトコヌド内のどこでも䜿甚できる倉数の圢匏で衚瀺されたす。 Hieraは、組み蟌みの「キヌ倀」デヌタベヌスです。 デフォルトでは、YAMLたたはJSONファむルがデヌタ゜ヌスずしお䜿甚されたすが、任意のデヌタ゜ヌスを䜿甚するように拡匵するこずもできたす。 その階局ずノヌドに応じおデヌタを倉曎する機胜により、その䜿甚はほずんどのモゞュヌル/クラスの䜜業の䞍可欠な郚分です。



モゞュヌルは、コヌドずデヌタの自己完結型ブロックですクラス、テンプレヌト、ファむルなど。 これらの再利甚可胜で䞀般にアクセス可胜なアむテムは、Puppetの䞻芁な構成芁玠です。



Puppetの䜿甚を蚈画しおいる人は、ほずんどの堎合クラスず、時にはモゞュヌルを䜜成する必芁がありたす。



展開オプション



Puppetを実装する堎合、集䞭構成ストレヌゞを䜿甚する堎合ず䜿甚しない堎合の2぀のオプションがありたす。





私のスクリプトは次のようになりたす。



 #!/bin/sh PUPPET_BIN='/opt/puppetlabs/bin/puppet' #      apt-get update && apt-get -y install git mc htop apt-transport-https nano wget lsb-release apt-utils curl python #    `puppet-agent` if [ ! -d /etc/puppetlabs ]; then rm *.deb.* *.deb # possible trash wget https://apt.puppetlabs.com/puppetlabs-release-pc1-xenial.deb && dpkg -i puppetlabs-release-pc1-xenial.deb apt-get update && apt-get -y install puppet-agent fi #   `environment` /opt/puppetlabs/bin/puppet config set environment $PUPPET_ENV if [ ! -d /etc/puppetlabs/code/environments/$PUPPET_ENV ]; then cp -r /etc/puppetlabs/code/environments/production /etc/puppetlabs/code/environments/$PUPPET_ENV fi # Install puppet modules $PUPPET_BIN module install puppetlabs-ntp $PUPPET_BIN module install aco-oracle_java $PUPPET_BIN module install puppetlabs-firewall $PUPPET_BIN module install saz-ssh $PUPPET_BIN module install saz-sudo $PUPPET_BIN module install saz-limits $PUPPET_BIN module install thias-sysctl $PUPPET_BIN module install yo61-logrotate $PUPPET_BIN module install puppetlabs-apt $PUPPET_BIN module install puppet-archive # git pull "deployment" project and go in it only if POVISION_NO_GIT_CLONE set to "true" if [ ${POVISION_NO_GIT_CLONE:-"false"} = "true" ]; then echo "do nothing" else LOCAL_REV="" if [ -f local_latest.sha1 ]; then LOCAL_REV=`cat local_latest.sha1` fi REMOTE_REV=`git ls-remote --tags | grep "latest" | awk '{print $1}'` if [ $LOCAL_REV = $REMOTE_REV ]; then exit 0 fi git fetch --all --tags --prune git checkout -f tags/latest fi # replace puppet configs cp puppet_config/hiera.yaml /etc/puppetlabs/code/environments/$PUPPET_ENV/ # replace hiera db rm /etc/puppetlabs/code/environments/$PUPPET_ENV/hieradata/* cp -r $PUPPET_ENV/hieradata/* /etc/puppetlabs/code/environments/$PUPPET_ENV/hieradata # replace storyline_* modules rm -r /etc/puppetlabs/code/environments/$PUPPET_ENV/modules/storyline_* cp -r modules/* /etc/puppetlabs/code/environments/$PUPPET_ENV/modules # copy site.pp cp $PUPPET_ENV/site.pp /etc/puppetlabs/code/environments/$PUPPET_ENV/manifests/site.pp #echo "hostname:" #hostname $PUPPET_BIN apply /etc/puppetlabs/code/environments/$PUPPET_ENV/manifests/site.pp echo $REMOTE_REV > local_latest.sha1
      
      





私の堎合、もちろん、分散システムが䜿甚されたす。なぜなら、 実装が簡単でむンフラストラクチャの線成の芳点から、テストベンチを展開するためのビルドスクリプトが倧幅に簡玠化されたす。テストベンチは1日に数十回䜜成しお実行したす。



指定されたスクリプトを実行する堎合



  1. Puppetクラむアント自䜓ず必芁なパッケヌゞがむンストヌルされおいる
  2. 必芁なPuppetモゞュヌルがむンストヌルされおいたす
  3. 「最新の」ラベルのコミット番号の倉曎が怜蚌されたす新しいバヌゞョンの統合テストが成功したずきに行われたす
  4. 珟圚の環境のHiera Puppetデヌタベヌスの構成hiera.yamlが眮き換えられたす$ PUPPET_ENV倉数。
  5. Hiera Puppetデヌタベヌスのデヌタを含むYAMLファむルは眮き換えられたす。
  6. モゞュヌルの説明を眮き換えるためにコピヌされたした。
  7. ノヌド私のシステムのサヌバヌの構成がコピヌされたす。
  8. コピヌ/むンストヌルされたすべおの蚭定のアプリケヌションが呌び出されたす$ PUPPET_BIN apply ....


Puppetクラむアントが起動時に実行するタスクのリストは膚倧です手動での怜蚌ず必芁な実行は単に䞍可胜です







人生の䟋



スタンド甚のPuppetスクリプトシステムを開発するずき、Puppetコヌドが実行されたマシン/コンテナにコピヌされる独自のモゞュヌルを開発したした。 モゞュヌルには、デヌタほずんどの構成ファむル内および構成甚のPuppetコヌドが含たれおいたす。 Hieraのスクリプトから基本蚭定を行いたした。その結果、スクリプトは非垞に普遍的で、実行されるノヌドに䟝存しないこずが刀明したした。



コヌドず蚭定の䟋をいく぀か瀺したす。



ngnixの蚭定パッケヌゞからではなく、ネむティブリポゞトリからサむズのためにナニットにスポむラヌを隠したした。しかし、興味がある人は、勉匷するずきに非垞に倚くのニュアンスが芋えるようにする必芁がありたす

storyline_infraモゞュヌルのNginxクラス
 class storyline_infra::nginx () { $params = lookup({"name" => "storyline_infra.nginx", "merge" => {"strategy" => "deep"}}) $reverse_port = $params['reverse_port'] $reverse_url = $params['reverse_url'] $pid_file = $params['pid_file'] $init_script = $params['init_script'] $dir_data = $params['dir_data'] $dir_logs = $params['dir_logs'] $version = $params['version'] $enabled_startup = $params['enabled_startup'] $enabled_running = $params['enabled_running'] # topology_configuration $enabled_topology_configuration = $params['enabled_topology_configuration'] $topology_configuration_port = $params['topology_configuration_port'] #    ( ) user { 'nginx': ensure => "present", managehome => true, } #    ( ) exec { "nginx-mkdir": command => "/bin/mkdir -p /data/db && /bin/mkdir -p /data/logs", cwd => "/", unless => '/usr/bin/test -d /data/db -a -d /data/logs', } -> # working dir file { [ $dir_logs, $dir_data] : ensure => "directory", recurse => "true", owner => "nginx", group=> "nginx", require => Exec['nginx-mkdir'], } #       ( ) # see by "gpg --verify keyfile" apt::key { 'nginx-key': id => '573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62', source => 'http://nginx.org/keys/nginx_signing.key', } -> #   ( ) # deb http://nginx.org/packages/ubuntu/ xenial nginx apt::source { 'nginx-repo': comment => 'nginx repo', location => "http://nginx.org/packages/ubuntu/", release => "xenial", repos => "nginx", include => { 'deb' => true, 'deb-src' => true, }, } -> #    ( ) package { 'nginx': ensure => $version, # notify => Exec['disable_nginx'], } → #        ( ).        ,    .   !!! file { "/etc/nginx/nginx.conf": replace => true, content => epp('storyline_infra/nginx.epp'), owner => "nginx", group=> "nginx", notify => Service['nginx'], }-> #        ( ) file { "/etc/nginx/conf.d/default.conf": replace => true, content => epp('storyline_infra/nginx_default.epp'), owner => "nginx", group=> "nginx", notify => Service['nginx'], }→ #        ( ) file { $init_script: replace => true, content => epp('storyline_infra/nginx_startup.epp'), mode=>"ug=rwx,o=r", notify => Service['nginx'], }→ #  /  ( ) service { 'nginx': ensure => $enabled_running, enable => $enabled_startup, start => "${init_script} start", stop => "${init_script} stop", status => "${init_script} status", restart => "${init_script} restart", hasrestart => true, hasstatus => true, } #   nginx ( ) if $enabled_topology_configuration { file { "/etc/nginx/conf.d/topology.conf": replace => true, content => epp('storyline_infra/nginx_topology.epp'), mode=>"ug=rwx,o=r", notify => Service['nginx'], } } #     ( ) if $enabled_startup != true { exec { "disable_nginx": require => Package['nginx'], command => "/bin/systemctl disable nginx", cwd => "/", } } }
      
      







各コメントでわかるように、リ゜ヌス定矩が瀺される前-「必芁な堎合」 リ゜ヌスの状態がすでに定矩ず䞀臎しおいる堎合、Puppetは操䜜を実行したせん。



この堎合、コヌド«$params = lookup({"name" => "storyline_infra.nginx", "merge" => {"strategy" => "deep"}})»



䜿甚しおHieraからデヌタ«$params = lookup({"name" => "storyline_infra.nginx", "merge" => {"strategy" => "deep"}})»



取埗する方法«$params = lookup({"name" => "storyline_infra.nginx", "merge" => {"strategy" => "deep"}})»



できたす䟋埌でそのデヌタを提䟛したす、その埌、すべおの倉数を埋めるために䜿甚されたす。



Hiera構成ファむル

 --- version: 5 defaults: datadir: "hieradata" data_hash: yaml_data hierarchy: - name: "1" path: "nodes/%{trusted.certname}.yaml" - name: "2" path: "version.yaml" - name: "3" path: "common.yaml"
      
      





この堎合、階局は衚瀺される「階局」キヌ゜ヌスで、より高いレベルの各゜ヌスはより䜎いレベルのキヌ倀を再定矩したす。 これにより、「common.yaml」の倀が「80」で、「nodes / webserver1.yaml」の倀が「81」である「www.server.port」などのキヌを持぀こずができたす-結果ずしお、実行時にこのキヌの倀を取埗したすコヌドパペット「webserver1」ずいう名前のノヌドでは「81」、他の党員では「80」。



Hieraのcommon.yaml

 --- limits::entries: '*/nofile': both: 1048576 '*/memlock': both: unlimited logrotate::config: su_user: root su_group: syslog compress: true # sysctl sysctl::base::purge: false sysctl::base::values: net.core.somaxconn: value: '65536' vm.swappiness: ensure: absent fs.file-max: value: '500000' vm.max_map_count: value: '262144' storyline_base: oracle_java: version: "8u92" storyline_infra: collectd: server_address: "XXX.nlp-project.ru" pid_file: '/data/logs/collectd/collectd.pid' init_script: '/etc/init.d/collectd' dir_data: '/data/db/collectd' dir_logs: '/data/logs/collectd' version: "1.2.0-1" enabled_mongodb: false mongodb_user: "collectd" mongodb_password: "######" enabled_storm: false enabled_elasticsearch: false elasticsearch_port: "####" elasticsearch_cluster: "elastic_storyline" enabled_startup: false enabled_running: true influxdb: port_http: "####" port_rpc: "####" pid_file: '/data/logs/influxdb/influxdb.pid' init_script: '/etc/init.d/influxdb' dir_data: '/data/db/influxdb' dir_logs: '/data/logs/influxdb' version: "present" enabled_auth: true enabled_startup: false enabled_running: true 
.
      
      







site.ppPuppetノヌドの定矩を含むファむル

 node "XXX.nlp-project.ru" { include ::limits include ::sysctl::base include ::logrotate include storyline_base::ntp include storyline_base::srv_oper include storyline_base::ssh include storyline_base::oracle_java 
.. include storyline_infra::monit include storyline_base::firewall } node "YYYY.nlp-project.ru" { include ::limits include ::sysctl::base include ::logrotate include storyline_base::ntp include storyline_base::srv_oper include storyline_base::ssh include storyline_base::oracle_java 
. include storyline_infra::zookeeper include storyline_components::server_storm include storyline_infra::monit include storyline_base::firewall }
      
      





誰かがタスクの特定の実装に興味がある堎合曞き蟌み-実装をコメントで蚘述するか、ヒントに远加したす。



Puppetは積極的に開発しおいたす䜿甚状況に応じお、構文の明確な改善ずクラスの動䜜の統䞀が行われたすただし、さたざたな状況で倉数を解決する特定の機胜があり、混乱を招くこずがありたす。



ヒント





ご枅聎ありがずうございたした



All Articles