Re: How to best NOT run a command

"'Nick Anderson' via help-cfengine" <[email protected]> Fri, 09 Feb 2024 12:54:10 -0600
Newsgroups gmane.comp.sysutils.cfengine.general
Message-ID <[email protected]>
        Two quick questions:

  I guess I might not be capable of providing "quick" answers ....

        (1) We're using 3.18 and it looks as if it uses `ifelse`
        rather than `if`. Is that correct?

  No, `ifelse()' is a way to set a variable based on a series of
  conditions.

  ,----
  | bundle agent __main__
  | {
  |    vars:
  |
  |     # using ifelse() you can do this:
  |
  |     "X" string => ifelse( "windows", "The 'windows' class is defined",
  |                           strcmp( "$(sys.class)", "linux" ), "The variable 'sys.class' expands to 'linux'",
  |                           "None of the prior conditions are true");
  |
  |     # Instead of this:
  |
  |   windows::
  |     "Y" string => "windows";
  |
  |   any::
  |     "Y"
  |       string => "The variable 'sys.class' expands to 'linux'",
  |       if =>  strcmp( "$(sys.class)", "linux" ); # Look, here is if constraining this single promise
  |
  |     "Y"
  |       string => "None of the prior conditions are true, Y hasn't been defined yet",
  |       if => not( isvariable( "Y" ));
  |
  | reports:
  |
  |     "X = $(X)";
  |     "Y = $(Y)";
  | }
  `----
  Listing 1: Example Policy

  ,----
  | R: X = The variable 'sys.class' expands to 'linux'
  | R: Y = The variable 'sys.class' expands to 'linux'
  `----


        (2) In the "Agent is In", you and Craig usually do a test
                 run of the bundles from the command line. Can you
                 do that just by $ cf-agent name-of-bundle

  There are a few ways, one might fit you better than the other.

  I don't know if you have heard of Emacs org-mode, but that is where I
  spend most of my time and I usually prototype policy there where I can
  simply execute the block and see the result. Now, `ob-cfengine3'
  doesn't know how to work with tramp (for executing on remote hosts),
  so I mostly use it for simple prototypes and examples. Someday maybe I
  will be able to run the policy from a block of code on a remote host.

  I talked about that a bit in Episode 12 of The Agent is In, Spacemacs
  for CFEngine. <https://www.youtube.com/watch?v=rlJiIdhHYUY>

  To your question, if you want to run a specific bundle name you use
  the `-b' or `--bundlesequence' parameter.

  For example, I have `/tmp/my-policy.cf', and it's got a couple of
  bundles in it:

  ,----
  | bundle agent my_bundle
  | {
  |   reports: "Hello from $(this.bundle)";
  | }
  | bundle agent my_other_bundle
  | {
  |   reports: "Goodbye from $(this.bundle)";
  | }
  `----
  Listing 2: /tmp/my-policy.cf

  I can use `-f' or `--file' to select that policy file as the entry
  (overriding the default of `$(sys.inputdir)/promises.cf':

  ,----
  | cf-agent -Kf /tmp/my-policy.cf --bundlesequence my_bundle
  `----

  ,----
  | R: Hello from my_bundle
  `----


  I can specify multiple bundles by separating them with a comma:

  ,----
  | cf-agent -Kf /tmp/my-policy.cf --bundlesequence my_bundle,my_other_bundle
  `----

  ,----
  | R: Hello from my_bundle
  | R: Goodbye from my_other_bundle
  `----


  If I don't specify a policy file, then I am running the default policy
  entry. For example, here I run the `host_info_report' bundle from the
  MPF:

  ,----
  | cf-agent -K --bundlesequence host_info_report
  | cat /var/cfengine/reports/host_info_report.txt
  `----

  ,----
  | R: Host info report generated and available at '/var/cfengine/reports/host_info_report.txt'
  | # Host Information
  | Generated: Fri Feb  9 18:42:56 2024
  |
  | ## Identity
  | Fully Qualified Hostname: hub.example.com
  | Host ID: SHA=d3f7672d6fabbf1d217bc4176bac3d87a3bc8f7fa280b27115f96ca476b36d30
  |
  | ## CFEngine
  | Version: CFEngine Enterprise 3.21.4
  | Last Agent Run: 2024-02-09 18:19:38 UTC
  | Policy Release ID: 824d55f0f260a79987b85f58e04bad9077ac6c85
  | Policy Last Updated: 2024-02-09 17:23:41 UTC
  | Bootstrapped to: 192.168.56.2
  |
  | ## OS
  | Architecture: x86_64
  | Os: linux
  | Release: 3.10.0-1160.105.1.el7.x86_64
  | Flavor: centos_7
  | Version: #1 SMP Thu Dec 7 15:39:45 UTC 2023
  | Uptime: 85 minutes
  |
  | ## Hardware
  | No. CPUs: 2
  | Total Memory: 1837.61 MB
  | Total Swap: 2048.00 MB
  | Free Memory: 228.32 MB
  | Free Swap: 2047.49 MB
  |
  | ## Network
  |
  | ### Interfaces
  |   * eth0: IPv4 10.0.2.15
  |   * eth0: up broadcast running multicast
  |   * eth1: IPv4 10.0.2.15
  |   * eth1: up broadcast running multicast
  |   * lo: IPv4 127.0.0.1
  |   * lo: up loopback running
  |
  | ### IPv4 TCP Ports listening
  |   * 25
  |   * 5432
  |   * 22
  |
  |
  | ## Policy
  |
  | Information about the policy set on this host.
  |
  | ### Inventory
  |
  | #### Variables tagged for inventory
  |
  | {
  |   "default:cfe_autorun_inventory_disk.free": "97.00",
  |   "default:cfe_autorun_inventory_dmidecode.dmi[bios-vendor]": "innotek GmbH",
  |   "default:cfe_autorun_inventory_dmidecode.dmi[bios-version]": "VirtualBox",
  |   "default:cfe_autorun_inventory_dmidecode.dmi[system-manufacturer]": "innotek GmbH",
  |   "default:cfe_autorun_inventory_dmidecode.dmi[system-product-name]": "VirtualBox",
  |   "default:cfe_autorun_inventory_dmidecode.dmi[system-serial-number]": "0",
  |   "default:cfe_autorun_inventory_dmidecode.dmi[system-uuid]": "0EEB2A73-9E20-8946-B4E1-6AF38B7DEEDA",
  |   "default:cfe_autorun_inventory_dmidecode.total_physical_memory_MB": "0",
  |   "default:cfe_autorun_inventory_ip_addresses.ipv4[10.0.2.15]": "10.0.2.15",
  |   "default:cfe_autorun_inventory_ip_addresses.ipv4[192.168.56.2]": "192.168.56.2",
  |   "default:cfe_autorun_inventory_listening_ports.ports": [
  |     "22",
  |     "25",
  |     "80",
  |     "443",
  |     "5308",
  |     "5432"
  |   ],
  |   "default:cfe_autorun_inventory_memory.total": "1837.61",
  |   "default:cfe_autorun_inventory_policy_servers._policy_servers": [
  |     "192.168.56.2"
  |   ],
  |   "default:cfe_autorun_inventory_policy_servers._primary_policy_server": "192.168.56.2",
  |   "default:cfe_autorun_inventory_timezone.gmt_offset": "+0000",
  |   "default:cfe_autorun_inventory_timezone.timezone": "UTC",
  |   "default:def.control_server_allowusers": [],
  |   "default:def.mpf_admit_cf_runagent_shell_selected": [
  |     "192.168.56.2"
  |   ],
  |   "default:inventory_any.id": "824d55f0f260a79987b85f58e04bad9077ac6c85",
  |   "default:inventory_any.policy_version": "CFEngine Promises.cf 3.21.4",
  |   "default:inventory_os.description": "CentOS 7",
  |   "default:sys.arch": "x86_64",
  |   "default:sys.cf_version": "3.21.4",
  |   "default:sys.class": "linux",
  |   "default:sys.cpus": "2",
  |   "default:sys.flavor": "centos_7",
  |   "default:sys.fqhost": "hub.example.com",
  |   "default:sys.hardware_addresses": [
  |     "08:00:27:64:b1:d3",
  |     "08:00:27:7b:b7:66"
  |   ],
  |   "default:sys.host": "hub.example.com",
  |   "default:sys.interfaces": [
  |     "eth0",
  |     "eth1"
  |   ],
  |   "default:sys.ipv4": "10.0.2.15",
  |   "default:sys.key_digest": "SHA=d3f7672d6fabbf1d217bc4176bac3d87a3bc8f7fa280b27115f96ca476b36d30",
  |   "default:sys.os_release": {
  |     "ANSI_COLOR": "0;31",
  |     "BUG_REPORT_URL": "https://bugs.centos.org/",
  |     "CENTOS_MANTISBT_PROJECT": "CentOS-7",
  |     "CENTOS_MANTISBT_PROJECT_VERSION": "7",
  |     "CPE_NAME": "cpe:/o:centos:centos:7",
  |     "HOME_URL": "https://www.centos.org/",
  |     "ID": "centos",
  |     "ID_LIKE": "rhel fedora",
  |     "NAME": "CentOS Linux",
  |     "PRETTY_NAME": "CentOS Linux 7 (Core)",
  |     "REDHAT_SUPPORT_PRODUCT": "centos",
  |     "REDHAT_SUPPORT_PRODUCT_VERSION": "7",
  |     "VERSION": "7 (Core)",
  |     "VERSION_ID": "7"
  |   },
  |   "default:sys.release": "3.10.0-1160.105.1.el7.x86_64",
  |   "default:sys.uptime": "85",
  |   "default:sys.uqhost": "hub"
  | }
  |
  | ### Enterprise maintanance bundles available
  |     cfengine_enterprise_federation:entry
  |     default:cfe_internal_clear_last_seen_hosts_logs
  |     default:cfe_internal_enterprise_policy_analyzer
  |     default:cfe_internal_exported_report_location
  |     default:cfe_internal_refresh_events_table
  |     default:cfe_internal_refresh_hosts_view
  |     default:cfe_internal_refresh_inventory_view
  |     default:cfe_internal_update_health_failures
  `----


  There is also the library `__main__' bundle. If `bundle agent
  __main__' is found in the policy entry
  (`$(sys.policy_entry_filename)') then it is understood as `bundle
  agent main' and `main' is the default bundle sequence. So, this can be
  handy for various things, running partial policy manually or testing.

  So, if I have `/tmp/example-library-main.cf'

  ,----
  | bundle agent __main__
  | {
  |   methods:
  |       "bundle1";
  |
  | }
  | bundle agent bundle1
  | {
  |       reports: "Hello from $(this.bundle)";
  | }
  `----

  When I run it as the policy entry `bundle1' gets run without having to
  specify it.

  ,----
  | cf-agent -Kf /tmp/example-library-main.cf
  `----

  ,----
  | R: Hello from bundle1
  `----


  The nice thing is that you can have one `bundle agent __main__' per
  file and still not get duplicate definition of bundle errors.

  Let's say I also have `/tmp/example-library-main2.cf' which includes
  `/tmp/example-library-main2.cf' as an additional policy file to parse.

  ,----
  | body file control
  | {
  |       inputs => { "example-library-main.cf" };
  | }
  | bundle agent __main__
  | {
  |   methods:
  |       "bundle2";
  | }
  | bundle agent bundle2
  | {
  |       reports: "Hello from $(this.bundle)";
  | }
  `----

  ,----
  | echo "Running with /tmp/example-library-main2.cf as entry"
  | cf-agent -Kf /tmp/example-library-main2.cf
  | echo "Running with /tmp/example-library-main.cf as entry"
  | cf-agent -Kf /tmp/example-library-main.cf
  `----

  ,----
  | Running with /tmp/example-library-main2.cf as entry
  | R: Hello from bundle2
  | Running with /tmp/example-library-main.cf as entry
  | R: Hello from bundle1
  `----

-- 
You received this message because you are subscribed to the Google Groups "help-cfengine" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [email protected].
To view this discussion on the web visit https://groups.google.com/d/msgid/help-cfengine/875xyx79kd.fsf%40northern.tech.