aboutsummaryrefslogtreecommitdiff
path: root/sysutils/ansible2
diff options
context:
space:
mode:
authorMateusz Piotrowski <0mp@FreeBSD.org>2021-05-12 18:44:57 +0000
committerMateusz Piotrowski <0mp@FreeBSD.org>2021-05-12 18:45:51 +0000
commitefbcca36ecd1a10560535b2700e541794cbfb404 (patch)
treeb6c08a6dc5817b4186da79f8cf0399c99a81be46 /sysutils/ansible2
parentd8d1a628f6adcdf106e06d0a8e9fcd55a59b5ec4 (diff)
downloadports-efbcca36ecd1a10560535b2700e541794cbfb404.tar.gz
ports-efbcca36ecd1a10560535b2700e541794cbfb404.zip
Diffstat (limited to 'sysutils/ansible2')
-rw-r--r--sysutils/ansible2/Makefile96
-rw-r--r--sysutils/ansible2/distinfo3
-rw-r--r--sysutils/ansible2/files/extra-patch-2784
-rw-r--r--sysutils/ansible2/files/extra-patch-sesu59
-rw-r--r--sysutils/ansible2/files/pkg-message.in30
-rw-r--r--sysutils/ansible2/pkg-descr4
6 files changed, 276 insertions, 0 deletions
diff --git a/sysutils/ansible2/Makefile b/sysutils/ansible2/Makefile
new file mode 100644
index 000000000000..6ad2fe6e3ccc
--- /dev/null
+++ b/sysutils/ansible2/Makefile
@@ -0,0 +1,96 @@
+PORTNAME= ansible
+PORTVERSION?= 2.9.21
+PORTREVISION?= 0
+CATEGORIES= sysutils python
+MASTER_SITES= http://releases.ansible.com/ansible/
+PKGNAMEPREFIX= ${PYTHON_PKGNAMEPREFIX}
+PKGNAMESUFFIX= 2
+
+MAINTAINER= 0mp@FreeBSD.org
+COMMENT= Radically simple IT automation
+
+LICENSE= GPLv3+
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+RUN_DEPENDS?= ${PYTHON_PKGNAMEPREFIX}cryptography>0:security/py-cryptography@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}Jinja2>0:devel/py-Jinja2@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}jmespath>0:devel/py-jmespath@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}netaddr>0:net/py-netaddr@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}paramiko>0:security/py-paramiko@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}yaml>0:devel/py-yaml@${PY_FLAVOR}
+TEST_DEPENDS?= ${PYTHON_PKGNAMEPREFIX}boto3>0:www/py-boto3@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}mock>0:devel/py-mock@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}nose>0:devel/py-nose@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}packaging>=0:devel/py-packaging@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}passlib>0:security/py-passlib@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}pycrypto>=0:security/py-pycrypto@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}pytest-mock>0:devel/py-pytest-mock@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}pytest-xdist>0:devel/py-pytest-xdist@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}pytest>0:devel/py-pytest@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}requests>0:www/py-requests@${PY_FLAVOR}
+
+USES?= cpe gmake python:3.6+ shebangfix
+CPE_VENDOR= ansibleworks
+USE_PYTHON= autoplist concurrent distutils
+
+SHEBANG_REGEX?= [.]/test/.*[.]py
+
+TEST_ARGS= VERSION=${PORTVERSION} \
+ PYTHON=${PYTHON_CMD} \
+ DATE=
+TEST_ENV= PYTHON_VERSION=${PYTHON_VER}
+TEST_TARGET= tests
+
+CONFLICTS_INSTALL= ${_ANSIBLE_PACKAGES:N${PKGBASE}-*}
+
+EXTRA_PATCHES?=
+NO_ARCH= yes
+SUB_FILES= pkg-message
+SUB_LIST= MAJMINVER=${PORTVERSION:R} \
+ PYTHON_PKGNAMEPREFIX=${PYTHON_PKGNAMEPREFIX} \
+ PKGBASE=${PKGBASE}
+
+PLIST_FILES?= man/man1/ansible-config.1.gz \
+ man/man1/ansible-console.1.gz \
+ man/man1/ansible-doc.1.gz \
+ man/man1/ansible-galaxy.1.gz \
+ man/man1/ansible-inventory.1.gz \
+ man/man1/ansible-playbook.1.gz \
+ man/man1/ansible-pull.1.gz \
+ man/man1/ansible-vault.1.gz \
+ man/man1/ansible.1.gz
+PORTEXAMPLES= ansible.cfg hosts
+
+_ANSIBLE_VERSIONS= 1 2 23 24 25 26 27 28
+_ANSIBLE_PACKAGES= ${PYTHON_PKGNAMEPREFIX}ansible-*
+.for version in ${_ANSIBLE_VERSIONS}
+_ANSIBLE_PACKAGES+= ${PYTHON_PKGNAMEPREFIX}ansible${version}-*
+.endfor
+
+OPTIONS_DEFINE= DOCS EXAMPLES
+
+post-patch:
+ ${FIND} ${WRKSRC} -type f -print0 | ${XARGS} -0 ${REINPLACE_CMD} \
+ -e 's|/etc/ansible|${ETCDIR:S/${PY_FLAVOR}-//}|g' \
+ -e 's|/usr/share/ansible|${DATADIR}|g'
+ ${FIND} ${WRKSRC} -type f -name "*.bak" -delete
+
+ ${REINPLACE_CMD} 's|"/etc"|"${PREFIX}/etc/"|g' ${WRKSRC}/test/units/playbook/test_helpers.py
+
+post-install:
+ @${MKDIR} ${STAGEDIR}${MAN1PREFIX}/man/man1
+ ${INSTALL_MAN} ${WRKSRC}/docs/man/man1/*.1 \
+ ${STAGEDIR}${MAN1PREFIX}/man/man1
+
+post-install-EXAMPLES-on:
+ @${MKDIR} ${STAGEDIR}${EXAMPLESDIR}
+ ${INSTALL_DATA} ${WRKSRC}/examples/ansible.cfg ${STAGEDIR}${EXAMPLESDIR}
+ ${INSTALL_DATA} ${WRKSRC}/examples/hosts ${STAGEDIR}${EXAMPLESDIR}
+
+post-stage:
+ ${FIND} ${STAGEDIR}${PREFIX}/bin -type l -name ansible-\* -lname ansible \
+ -execdir ${RLN} ansible-${PYTHON_VER} {} \;
+# python autoplist doesn't add this file in plist
+ ${RM} ${STAGEDIR}${PYTHONPREFIX_SITELIBDIR}/ansible_test/_data/injector/ansible-inventory
+
+.include <bsd.port.mk>
diff --git a/sysutils/ansible2/distinfo b/sysutils/ansible2/distinfo
new file mode 100644
index 000000000000..7a1b3c1a7f07
--- /dev/null
+++ b/sysutils/ansible2/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1620220411
+SHA256 (ansible-2.9.21.tar.gz) = 4098246b67aa143e1e3af79d99346419e0545d5405d1cdf6e7fd389beab6de5a
+SIZE (ansible-2.9.21.tar.gz) = 14277062
diff --git a/sysutils/ansible2/files/extra-patch-27 b/sysutils/ansible2/files/extra-patch-27
new file mode 100644
index 000000000000..bd077f558e36
--- /dev/null
+++ b/sysutils/ansible2/files/extra-patch-27
@@ -0,0 +1,84 @@
+--- lib/ansible/module_utils/facts/virtual/freebsd.py.orig 2020-04-17 14:07:09 UTC
++++ lib/ansible/module_utils/facts/virtual/freebsd.py
+@@ -19,9 +19,11 @@ __metaclass__ = type
+ import os
+
+ from ansible.module_utils.facts.virtual.base import Virtual, VirtualCollector
++# Rudimentary detection of the virtual platforms, more through version is coming. Catches VMWare at minimum.
++from ansible.module_utils.facts.virtual.sysctl import VirtualSysctlDetectionMixin
+
+
+-class FreeBSDVirtual(Virtual):
++class FreeBSDVirtual(Virtual, VirtualSysctlDetectionMixin):
+ """
+ This is a FreeBSD-specific subclass of Virtual. It defines
+ - virtualization_type
+@@ -34,6 +36,9 @@ class FreeBSDVirtual(Virtual):
+ # Set empty values as default
+ virtual_facts['virtualization_type'] = ''
+ virtual_facts['virtualization_role'] = ''
++
++ virtual_product_facts = self.detect_virt_product('hw.hv_vendor')
++ virtual_facts.update(virtual_product_facts)
+
+ if os.path.exists('/dev/xen/xenstore'):
+ virtual_facts['virtualization_type'] = 'xen'
+--- lib/ansible/modules/packaging/os/pkgng.py.orig 2020-04-17 14:07:10 UTC
++++ lib/ansible/modules/packaging/os/pkgng.py
+@@ -201,13 +201,17 @@ def install_packages(module, pkgng_path, packages, cac
+
+ # This environment variable skips mid-install prompts,
+ # setting them to their default values.
+- batch_var = 'env BATCH=yes'
++ # There is at least one case, when upgrading from 11.1 to 11.2 when pkg asks extra
++ # question about OS version mismatch in the repository. As this isn't handled, playbook
++ # hangs forever. Adding ASSUME_ALWAYS_YES to the environment addresses that, and
++ # possibly other potential issues.
++ batch_var = 'env BATCH=yes ASSUME_ALWAYS_YES=yes'
+
+ if not module.check_mode and not cached:
+ if old_pkgng:
+- rc, out, err = module.run_command("%s %s update" % (pkgsite, pkgng_path))
++ rc, out, err = module.run_command("%s %s %s update" % (batch_var, pkgsite, pkgng_path))
+ else:
+- rc, out, err = module.run_command("%s %s update" % (pkgng_path, dir_arg))
++ rc, out, err = module.run_command("%s %s %s update" % (batch_var, pkgng_path, dir_arg))
+ if rc != 0:
+ module.fail_json(msg="Could not update catalogue")
+
+--- lib/ansible/modules/storage/zfs/zfs.py.orig 2020-04-17 14:07:11 UTC
++++ lib/ansible/modules/storage/zfs/zfs.py
+@@ -102,7 +102,15 @@ class Zfs(object):
+ self.changed = False
+ self.zfs_cmd = module.get_bin_path('zfs', True)
+ self.zpool_cmd = module.get_bin_path('zpool', True)
+- self.pool = name.split('/')[0]
++ # - name: Create a new file system by cloning a snapshot
++ # zfs:
++ # name: rpool/cloned_fs
++ # state: present
++ # origin: rpool@mysnapshot
++ #
++ # doesn't work properly, as code assumes that there is at least one level of hierarchy
++ # in zpool. But that's not always the case - pool may be dataset as well and have a snapshot.
++ self.pool = name.split('@')[0].split('/')[0]
+ self.is_solaris = os.uname()[0] == 'SunOS'
+ self.is_openzfs = self.check_openzfs()
+ self.enhanced_sharing = self.check_enhanced_sharing()
+--- lib/ansible/playbook/play_context.py.orig 2020-04-17 14:07:10 UTC
++++ lib/ansible/playbook/play_context.py
+@@ -528,8 +528,13 @@ class PlayContext(Base):
+ becomecmd = cmd
+
+ elif self.become_method == 'doas':
++ # `doas` support in ansible is broken ATM, doesn't handle password
++ # authentication properly, cause assumes only challenge-respond auth.
++ # This patch should handle both ways properly.
++ def detect_doas_prompt(b_data):
++ return re.match(b"[Pp]assword:", b_data)
+
+- prompt = 'doas (%s@' % self.remote_user
++ prompt = detect_doas_prompt
+ exe = self.become_exe or 'doas'
+
+ if not self.become_pass:
diff --git a/sysutils/ansible2/files/extra-patch-sesu b/sysutils/ansible2/files/extra-patch-sesu
new file mode 100644
index 000000000000..845594ee16bc
--- /dev/null
+++ b/sysutils/ansible2/files/extra-patch-sesu
@@ -0,0 +1,59 @@
+--- lib/ansible/constants.py.orig 2018-06-28 23:30:34 UTC
++++ lib/ansible/constants.py
+@@ -59,8 +59,9 @@ def set_constant(name, value, export=var
+
+
+ # CONSTANTS ### yes, actual ones
+-BECOME_METHODS = ['sudo', 'su', 'pbrun', 'pfexec', 'doas', 'dzdo', 'ksu', 'runas', 'pmrun', 'enable', 'machinectl']
++BECOME_METHODS = ['sesu', 'sudo', 'su', 'pbrun', 'pfexec', 'doas', 'dzdo', 'ksu', 'runas', 'pmrun', 'enable', 'machinectl']
+ BECOME_ERROR_STRINGS = {
++ 'sesu': '',
+ 'sudo': 'Sorry, try again.',
+ 'su': 'Authentication failure',
+ 'pbrun': '',
+@@ -73,6 +74,7 @@ BECOME_ERROR_STRINGS = {
+ 'machinectl': '',
+ } # FIXME: deal with i18n
+ BECOME_MISSING_STRINGS = {
++ 'sesu': '',
+ 'sudo': 'sorry, a password is required to run sudo',
+ 'su': '',
+ 'pbrun': '',
+--- lib/ansible/modules/commands/command.py.orig 2018-06-28 23:30:34 UTC
++++ lib/ansible/modules/commands/command.py
+@@ -142,7 +142,7 @@ def check_command(module, commandline):
+ 'mount': 'mount', 'rpm': 'yum, dnf or zypper', 'yum': 'yum', 'apt-get': 'apt',
+ 'tar': 'unarchive', 'unzip': 'unarchive', 'sed': 'replace, lineinfile or template',
+ 'dnf': 'dnf', 'zypper': 'zypper'}
+- become = ['sudo', 'su', 'pbrun', 'pfexec', 'runas', 'pmrun', 'machinectl']
++ become = ['sesu', 'sudo', 'su', 'pbrun', 'pfexec', 'runas', 'pmrun', 'machinectl']
+ if isinstance(commandline, list):
+ command = commandline[0]
+ else:
+--- lib/ansible/modules/web_infrastructure/ansible_tower/tower_credential.py.orig 2018-06-28 23:30:34 UTC
++++ lib/ansible/modules/web_infrastructure/ansible_tower/tower_credential.py
+@@ -96,7 +96,7 @@ options:
+ become_method:
+ description:
+ - Become method to Use for privledge escalation.
+- choices: ["None", "sudo", "su", "pbrun", "pfexec", "pmrun"]
++ choices: ["None", "sesu", "sudo", "su", "pbrun", "pfexec", "pmrun"]
+ become_username:
+ description:
+ - Become username. Use ASK for prompting.
+--- lib/ansible/playbook/play_context.py.orig 2018-06-28 23:30:34 UTC
++++ lib/ansible/playbook/play_context.py
+@@ -562,6 +562,13 @@ class PlayContext(Base):
+ exe = self.become_exe or 'machinectl'
+ becomecmd = '%s shell -q %s %s@ %s' % (exe, flags, self.become_user, command)
+
++ elif self.become_method == 'sesu':
++
++ exe = self.become_exe or 'sesu'
++
++ prompt = 'Please enter your password:'
++ becomecmd = '%s %s %s -c %s' % (exe, flags, self.become_user, shlex_quote(command))
++
+ else:
+ raise AnsibleError("Privilege escalation method not found: %s" % self.become_method)
+
diff --git a/sysutils/ansible2/files/pkg-message.in b/sysutils/ansible2/files/pkg-message.in
new file mode 100644
index 000000000000..e8606df34687
--- /dev/null
+++ b/sysutils/ansible2/files/pkg-message.in
@@ -0,0 +1,30 @@
+[
+{
+message: <<EOD
+To use Ansible, you need at least a host database.
+If you installed examples, you will have a sample
+inventory and a sample configuration file:
+
+ %%EXAMPLESDIR%%/hosts
+ %%EXAMPLESDIR%%/ansible.cfg
+
+EOD
+type: install
+}
+{
+message: <<EOD
+Ansible has been updated to %%MAJMINVER%%. Please follow the porting guide
+to update the rulesets:
+
+ https://docs.ansible.com/ansible/devel/porting_guides/porting_guide_%%MAJMINVER%%.html
+
+In order to stay with an older version instead, e.g., 2.7, use pkg-set(8).
+For example:
+
+ # pkg set -n %%PKGBASE%%:%%PYTHON_PKGNAMEPREFIX%%ansible27
+
+EOD
+maximum_version: "%%MAJMINVER%%"
+type: upgrade
+}
+]
diff --git a/sysutils/ansible2/pkg-descr b/sysutils/ansible2/pkg-descr
new file mode 100644
index 000000000000..1ecc93bba0cf
--- /dev/null
+++ b/sysutils/ansible2/pkg-descr
@@ -0,0 +1,4 @@
+Ansible is a radically simple configuration-management, deployment,
+task-execution, and multinode orchestration framework.
+
+WWW: https://www.ansible.com/