Issue 1:
Issue Type:

Bug Report

Ansible Version:

ansible 1.7.1

Environment:

N/A

Summary:

There is a problem when invoking apt with variables.

When the variables are inside an argument, it gives an error:

- name: Install chromium browser
apt: deb=/root/{{item}}.deb
when: ansible_architecture in ['armv7l']
with_items:
- chromium-inspector
- chromium-browser

Fails:

TASK: [gui | Install chromium browser] ****************************************
fatal: [7c669d537a3e] => failed to parse: Traceback (most recent call last):
File "/root/.ansible/tmp/ansible-tmp-1409662082.8-144889871942361/apt", line 1907, in <module>
main()
File "/root/.ansible/tmp/ansible-tmp-1409662082.8-144889871942361/apt", line 523, in main
force=force_yes, dpkg_options=p['dpkg_options'])
File "/root/.ansible/tmp/ansible-tmp-1409662082.8-144889871942361/apt", line 299, in install_deb
pkg = apt.debfile.DebPackage(deb_file)
File "/usr/lib/python2.7/dist-packages/apt/debfile.py", line 57, in __init__
self.open(filename)
File "/usr/lib/python2.7/dist-packages/apt/debfile.py", line 66, in open
self._debfile = apt_inst.DebFile(self.filename)
SystemError: E:Could not open file /root/chromium-inspector - open (2: No such file or directory), E:Unable to determine the file size - fstat (9: Bad file descriptor), E:Read error - read (9: Bad file descriptor)

FATAL: all hosts have already failed -- aborting

(note the missing .deb at the end of the filename)

Whereas:

- name: Install chromium browser
apt: deb=/root/{{item}}
when: ansible_architecture in ['armv7l']
with_items:
- chromium-inspector.deb
- chromium-browser.deb

(note moving the .deb filenames inside the array rather than after the variable on the deb argument)

Succeeds.

There should NOT be any difference between the runs.

When trying to find out if it is caused by whitespace I did:

- name: Install chromium browser
shell: echo deb=/root/{{item}}.deb
when: ansible_architecture in ['armv7l']
with_items:
- chromium-inspector
- chromium-browser

Which resulted in:

changed: [7c669d537a3e] => (item=chromium-inspector) => {"changed": true, "cmd": "echo deb=/root/chromium-inspector.deb", "delta": "0:00:00.035228", "end": "2014-09-02 12:48:54.123722", "item": "chromium-inspector", "rc": 0, "start": "2014-09-02 12:48:54.088494", "stderr": "", "stdout": "deb=/root/chromium-inspector.deb"}
changed: [7c669d537a3e] => (item=chromium-browser) => {"changed": true, "cmd": "echo deb=/root/chromium-browser.deb", "delta": "0:00:00.017942", "end": "2014-09-02 12:48:56.467385", "item": "chromium-browser", "rc": 0, "start": "2014-09-02 12:48:56.449443", "stderr": "", "stdout": "deb=/root/chromium-browser.deb"}

Steps To Reproduce:

See above.

Expected Results:

No difference between the runs

Actual Results:

Fails when .deb is in the argument line, Succeeds when inside the array.

Issue 2:
From @jsnshrmn on 2016-06-17T15:03:20Z

ISSUE TYPE

Bug Report

COMPONENT NAME

lineinfile

ANSIBLE VERSION

ansible 2.1.0.0
config file = /etc/ansible/ansible.cfg
configured module search path = Default w/o overrides

CONFIGURATION

Bone stock

OS / ENVIRONMENT

CentOS 7

SUMMARY

When lineinfile with regexp finds a match, it substitutes properly. When it doesn't find a match (say, on subsequent runs), it just dumps the specified line at the bottom of the file as if you hadn't specified a regexp. Needless to say, this breaks idempotence.

STEPS TO REPRODUCE

Take a look at a file.

Run lineinfile with regexp that matches a line

See that your line was in fact replaced.

Run lineinfile again.

See that the specified replacement line is now duplicated at the bottom of the file.

- name: Add ops scripts to sudo secure_path
lineinfile:
dest: /etc/sudoers
regexp: >
^Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin$
line: 'Defaults secure_path = /opt/d7/bin:/sbin:/bin:/usr/sbin:/usr/bin'
validate: visudo -cf %s

EXPECTED RESULTS

Idempotent line replacement after a second run

# Refuse to run if unable to disable echo on the tty.
Defaults !visiblepw

#
# Preserving HOME has security implications since many programs
# use it when searching for configuration files. Note that HOME
# is already set when the the env_reset option is enabled, so
# this option is only effective for configurations where either
# env_reset is disabled or HOME is present in the env_keep list.
#
Defaults always_set_home

Defaults env_reset
Defaults env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS"
Defaults env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
Defaults env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
Defaults env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
Defaults env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"

#
# Adding HOME to env_keep may enable a user to run unrestricted
# commands via sudo.
#
# Defaults env_keep += "HOME"

Defaults secure_path = /opt/d7/bin:/sbin:/bin:/usr/sbin:/usr/bin

## Next comes the main part: which users can run what software on
## which machines (the sudoers file can be shared between multiple
## systems).
## Syntax:
##
## user MACHINE=COMMANDS
##
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root ALL=(ALL) ALL

## Allows people in group wheel to run all commands without a password
%wheel ALL=(ALL) NOPASSWD: ALL

ACTUAL RESULTS

Potentially show-stopping garbage at the bottom of a file

# Refuse to run if unable to disable echo on the tty.
Defaults !visiblepw

#
# Preserving HOME has security implications since many programs
# use it when searching for configuration files. Note that HOME
# is already set when the the env_reset option is enabled, so
# this option is only effective for configurations where either
# env_reset is disabled or HOME is present in the env_keep list.
#
Defaults always_set_home

Defaults env_reset
Defaults env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS"
Defaults env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
Defaults env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
Defaults env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
Defaults env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"

#
# Adding HOME to env_keep may enable a user to run unrestricted
# commands via sudo.
#
# Defaults env_keep += "HOME"

Defaults secure_path = /opt/d7/bin:/sbin:/bin:/usr/sbin:/usr/bin

## Next comes the main part: which users can run what software on
## which machines (the sudoers file can be shared between multiple
## systems).
## Syntax:
##
## user MACHINE=COMMANDS
##
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root ALL=(ALL) ALL

## Allows people in group wheel to run all commands without a password
%wheel ALL=(ALL) NOPASSWD: ALL
Defaults secure_path = /opt/d7/bin:/sbin:/bin:/usr/sbin:/usr/bin

Copied from original issue: ansible/ansible-modules-core#3975