Re: class/define execution ordering

285 views
Skip to first unread message

xkrantz

unread,
Aug 28, 2012, 9:57:54 AM8/28/12
to puppet...@googlegroups.com
Hi Tolbkni, 

What version of Puppet do you use ?

In puppet 2.6.x, this is a well known issue which can be solved by using the puppetlabs-stdlib "Anchor" type.

https://groups.google.com/forum/?fromgroups=#!topic/puppet-users/XfinNTV27T4


Hope it helped you !



Le lundi 27 août 2012 11:45:24 UTC+2, Tolbkni Kao a écrit :
I am confused about the puppet class/define execution ordering.
I wrote a module named 'mysql', manifests follow:

mysql/manifests/init.pp
class mysql($base_dir='/usr/local/mysql') {
    class { 'mysql::install':
        base_dir      => $base_dir,
    }
}

mysql/manifests/install.pp
class mysql::install($base_dir) {
    group { 'mysql':
        ensure     => present,
    }
    user { 'mysql':
        ensure     => present,
        gid        => 'mysql',
        shell      => '/sbin/nologin',
        managehome => false,
        require    => Group['mysql'],
    }
    exec { 'download_mariadb_binary':
        path       => '/bin:/usr/bin',
        cwd        => '/tmp',
        timeout    => 0,
        command    => 'curl -OL http://mirror.yongbok.net/mariadb/mariadb-5.2.12/kvm-bintar-hardy-amd64/mariadb-5.2.12-Linux-x86_64.tar.gz',
        logoutput  => on_failure,
        creates    => '/tmp/mariadb-5.2.12-Linux-x86_64.tar.gz',
        require    => User['mysql'],
    }
    exec { 'install_mariadb_binary':
        path       => '/bin:/usr/bin',
        cwd        => '/tmp',
        command    => "tar xzfP mariadb-5.2.12-Linux-x86_64.tar.gz && mv mariadb-5.2.12-Linux-x86_64 $base_dir",
        logoutput  => on_failure,
        creates    => "${base_dir}/bin/mysql",
        require    => Exec['download_mariadb_binary']
    }
    file { $base_dir:
        ensure     => directory,
        require    => Exec['install_mariadb_binary'],
    }
    file { "${base_dir}/scripts/start_db.sh":
        ensure     => present,
        owner      => 'root',
        group      => 'root',
        mode       => '0755',
        source     => 'puppet:///modules/mysql/start_db.sh',
        require    => File[$base_dir],
    }
    file { "${base_dir}/scripts/setup_mariadb.sh":
        ensure     => present,
        owner      => 'root',
        group      => 'root',
        mode       => '0755',
        source     => 'puppet:///modules/mysql/setup_mariadb.sh',
        require    => File[$base_dir],
    }
    file { "/tmp/stub_my.cnf":
        ensure     => present,
        mode       => '0755',
        source     => 'puppet:///modules/mysql/stub_my.cnf',
    }
}

mysql/manifests/instance.pp
define mysql::instance(
    $bind_address='127.0.0.1',
    $port='3306',
    $extra_port='3991',
    $base_dir='/usr/local/mysql',
    $data_dir='/var/lib/mysql',
    $root_password
    ) {
    exec { 'create_mysql_instance':
        path       => "/bin:/sbin:/usr/bin:/usr/sbin",
        cwd        => '/tmp',
        command    => "sh ${base_dir}/scripts/setup_mariadb.sh \
--name=${title} \
--stub=/tmp/stub_my.cnf \
--bind=$bind_address \
--port=$port \
--extra-port=$extra_port \
--basedir=$base_dir \
--datadir=$data_dir \
--root-password=$root_password",
        logoutput  => on_failure,
        creates    => "/etc/mysql/my_${instance}.cnf",
    }
}

now I wrote a smoke test like this:
mysql/tests/init.pp
class { 'mysql':
    base_dir      => '/usr/local/mysql'
}
mysql::instance { 'test':
    root_password => 'rootpassword'
}
Class['mysql'] -> Mysql::Instance['test']

When I run this smoke test using `puppet apply --noop /etc/puppet/modules/mysql/tests/init.pp`, the output log follows:
notice: /Stage[main]/Mysql::Install/Exec[download_mariadb_binary]/returns: executed successfully
notice: /Stage[main]/Mysql::Install/Exec[install_mariadb_binary]/returns: executed successfully
notice: /File[/usr/local/mysql]/owner: owner changed '1001' to 'root'
notice: /File[/usr/local/mysql]/group: group changed '1001' to 'root'
notice: /File[/usr/local/mysql]/seluser: seluser changed 'unconfined_u' to 'system_u'
notice: /File[/usr/local/mysql]/seltype: seltype changed 'user_tmp_t' to 'usr_t'
err: /Stage[main]//Node[localhost.localdomain]/Mysql::Instance[test]/Exec[create_mysql_instance]/returns: change from notrun to 0 failed: sh: /usr/local/mysql/scrip
ts/setup_mariadb.sh: No such file or directory

Why Mysql::Instance['test'] execute before File["${base}/scripts/setup_mariadb.sh"]
As U see, I have wrote Class['mysql'] -> Mysql::Instance['test'],
and when I wrote Class['mysql::install'] -> Class['mysql'] -> Mysql::Instance['test'],
the execution order is right
notice: /Stage[main]/Mysql::Install/Exec[download_mariadb_binary]/returns: current_value notrun, should be 0 (noop)
notice: /Stage[main]/Mysql::Install/Exec[install_mariadb_binary]/returns: current_value notrun, should be 0 (noop)
notice: /File[/usr/local/mysql]/ensure: current_value absent, should be directory (noop)
notice: /File[/usr/local/mysql/scripts/start_db.sh]/ensure: current_value absent, should be file (noop)
notice: /Stage[main]/Mysql::Install/File[/tmp/stub_my.cnf]/ensure: current_value absent, should be file (noop)
notice: /File[/usr/local/mysql/scripts/setup_mariadb.sh]/ensure: current_value absent, should be file (noop)
notice: Class[Mysql::Install]: Would have triggered 'refresh' from 7 events
notice: /Stage[main]//Mysql::Instance[test]/Exec[create_mysql_instance]/returns: current_value notrun, should be 0 (noop)

Sorry my bad English, who can help me!
Reply all
Reply to author
Forward
0 new messages