NOTE: As of Ansible 2.3, modules are now in the main Ansible repository.
See the repo merge guide for more information.
This repo still exists to allow bug fixes for stable-2.2
and older releases.
Ansible modules - these modules ship with ansible
NOTE: As of Ansible 2.3, modules are now in the main Ansible repository.
See the repo merge guide for more information.
This repo still exists to allow bug fixes for stable-2.2
and older releases.
Bug report
ansible 1.7.2
CentOS release 5.9 (Final)
When using the pause module together with a when: conditional, it's not always executed when it should. Looks like the condition is only evaluated against the first host in the host list. This makes it impossible to use pause e.g. after a conditional restart of some service to allow the service to come back up before continuing.
Inventory:
[testhosts]
hosta
hostb
hostc
hostd
Playbook:
---
- name: Test pause
hosts: testhosts
gather_facts: no
tasks:
- name: Pause for hosta
local_action: pause seconds=5
when: inventory_hostname == 'hosta'
- name: Pause for hostb
local_action: pause seconds=5
when: inventory_hostname == 'hostb'
- name: Pause for hostd
local_action: pause seconds=5
when: inventory_hostname == 'hostd'
Three 5 second pauses, one for hosta, one for hostb and one for hostd.
Only one pause for hosta. The hostb and hostd pauses are skipped.
PLAY [Test pause] *************************************************************
TASK: [Pause for hosta] *******************************************************
(^C-c = continue early, ^C-a = abort)
[hosta, hostb, hostc, hostd]
Pausing for 5 seconds
ok: [hosta -> 127.0.0.1]
TASK: [Pause for hostb] *******************************************************
skipping: [hosta -> 127.0.0.1]
TASK: [Pause for hostd] *******************************************************
skipping: [hosta -> 127.0.0.1]
PLAY RECAP ********************************************************************
hosta : ok=1 changed=0 unreachable=0 failed=0
hostb : ok=1 changed=0 unreachable=0 failed=0
hostc : ok=1 changed=0 unreachable=0 failed=0
hostd : ok=1 changed=0 unreachable=0 failed=0
I just found fetch does not work very well with filenames has spaces in them. so I wrote a test script.
name: report | fetch auditusage report from server
fetch: src="{{ item }}"
dest=/tmp/fetched
with_items:
- /tmp/test test.txt
basically "test.txt" works, "test test.txt" does not.
and here is the error message, looks like it just failed to create the file in local folder, therefore md5sum mismatched. (the whole folder structure on remote server was created locally)
failed: [_.__.com] => (item=/tmp/test test.txt) => {"dest": "/tmp/fetched/__.*_*.com/tmp/test test.txt", "failed": true, "file": "/tmp/test test.txt", "item": "/tmp/test test.txt", "md5sum": null, "remote_md5sum": "6fa871334b2e8715ef897730f8460553"}
msg: md5 mismatch
~
~
Issue Type:
Bug Report
Ansible Version:
ansible 1.7.2
Environment:
Ubuntu 14.04 amd64
Summary:
I made a list of package that I would like to be upgraded if needed.
So, I retrieve the list of every packages needed to be upgraded on my server,
and it install the package when the result is matched
The problem appears only when I add the when condition.
Steps To Reproduce:
Generate a list of file to be upgraded
vars:
Expected Results:
Packages must be installed.
TASK: [Upgrade] ***************************************************************
<127.0.0.1> REMOTE_MODULE apt name=apache2-mpm-worker,apache2.2-bin,apache2.2-common state=latest
changed: [127.0.0.1] => (item=apache2-mpm-worker,apache2.2-bin,apache2.2-common,bash) => {"changed": true,
[...]
PLAY RECAP ********************************************************************
127.0.0.1 : ok=4 changed=2 unreachable=0 failed=0
Actual Results:
TASK: [Upgrade] ***************************************************************
skipping: [127.0.0.1] => (item=apache2-mpm-worker,apache2.2-bin,apache2.2-common)
[...]
PLAY RECAP
127.0.0.1 : ok=3 changed=1 unreachable=0 failed=0
Bug Report
ansible 1.7.2
Ubuntu 12.04
When the ini_file
encounters tabs in a file the task fails.
Create a global ~/.gitconfig
file by calling gitconfig --global user.name 'Test User'
and try to change the name using
ansible testhost -m ini_file -a "dest=~/.gitconfig section=user option=email value='[email protected]'"
Task should run succesfully and final ~/.gitconfig
file should be something like this:
[user]
name = Test User
email = [email protected]
Task fails and final ~/.gitconfig
file is:
[user]
name = Test User
Bug Report
ansible 1.5.4
Ansible is running from OS/X Mavericks 10.9.2
I am managing an Ubuntu 12.04 instance
When using the mount module and specifying an option of "bind", the filesystem is mounted over and over. This has been tracked down to what appears to be Python's os.path.ismount(path) returning false for any mounts with the bind option applied.
Create a mount using the mount module with the following options:
I expect to see the mount point show up in /etc/fstab, the mount point to show when the command "mount" is ran in the terminal, and for the Ansible task to not show as "changed" for each run when no change has occurred.
The mount point shows up properly in /etc/fstab, but the mount point is mounted each time the Ansible task is ran, causing it to be mounted over and over on the system as well as for the Ansible task to show the status of "changed".
Originally reported by @Debilski as ansible #7229 and closed without resolution:
Issue Type:
Bug Report
Ansible Version:
ansible 1.6 (devel d287179
) last updated 2014/04/30 10:47:45 (GMT +200)
Environment:
Debian 7
Summary:
aptitude
unfortunately says the following on its man page:
-y, --assume-yes
When a yes/no prompt would be presented, assume that the user entered “yes”. In
particular, suppresses the prompt that appears when installing, upgrading, or removing
packages. Prompts for “dangerous” actions, such as removing essential packages, will still
be displayed. This option overrides -P.
This is contrary to apt-get -y
, which will simply abort after having found a ‘“dangerous” action’.
So, in short using -y
is not enough to make aptitude
fully non-interactive and may regularly (e.g. it also chokes on non-authenticated packages) cause ansible to freeze without further notice.
Steps To Reproduce:
Example task apt: upgrade=safe update_cache=yes
to be executed on a machine with e.g. unauthenticated packages.
Real output of aptitude safe-upgrade -y
on that machine would be:
# aptitude safe-upgrade -y
The following packages will be upgraded:
iceweasel libmms0 libmozjs24d mcollective-puppet-agent mcollective-puppet-common xulrunner-24.0
6 packages upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 22.5 MB/22.5 MB of archives. After unpacking 127 kB will be freed.
WARNING: untrusted versions of the following packages will be installed!
Untrusted packages could compromise your system's security.
You should only proceed with the installation if you are certain that
this is what you want to do.
xulrunner-24.0 iceweasel libmozjs24d
Do you want to ignore this warning and proceed anyway?
To continue, enter "Yes"; to abort, enter "No":
… and there it waits for user input.
Expected Results:
Ansible should simply fail the apt task.
Actual Results:
Ansible hangs and gives no information whatsoever.
Like many others, I have a recently closed Ansible pull request that I'd like to resubmit here (ansible/ansible#6303).
My original pull request has an integration test for the added functionality, and I'd like to submit that. Unfortunately, the module tests didn't come along with the module code in the repository split.
Given this, what's the best way to submit tests in one repository for functionality that's yet to be merged in another repository?
The win_msi
module always installs the MSI, regardless of whether the creates
parameter is set or not.
From https://groups.google.com/forum/#!topic/ansible-project/NigaWzDHvg4
Feature Idea
ansible 1.4.3
N/A
Want to use gce module to create an instance with any permissions to access any other Google cloud resources like storage. Apparently I need to pass in the service_account_scopes flag as is seen done in the unit test when calling gcutil
directly. How can I pass this flag using the module?
N/A
N/A
N/A
cc @erjohnso
Many thanks!
NOTE: this issue was ported over from the old ansible repo where it was ansible/ansible#6003
Issue type:
Bug report
Ansible Version:
1.6.2
Environment:
Mac OS X 10.9.3
Summary:
ec2_vol module fails to create a new volume from a snapshot and attach to an image, returning an error message that doesn't make sense given the arguments.
Steps to reproduce:
Start an instance on EC2, record the instance id
Create a new snapshot on EC2, record the snapshot id
Use the ec2_vol module to attach:
ansible localhost -m ec2_vol -a "instance=i-123456 snapshot=snap-abcdef"
Expected results:
Creates a new EBS volume from the snapshot, attaches volume to the instance.
Actual results:
$ ansible localhost -m ec2_vol -a "instance=i-123456 snapshot=snap-abcdef"
localhost | FAILED >> {
"failed": true,
"msg": "Cannot specify volume_size and either one of name or id"
}
The error makes no sense, given that neither volume_size, name, nor id are arguments.
Note that the documentation for ec2_vol has an example with this exact combination of arguments, so I assume this is legal. From the docs:
# Example using snapshot id
- local_action:
module: ec2_vol
instance: XXXXXX
snapshot: "{{ snapshot }}"
Feature Idea
group
ansible 1.7.2
Any
Module "user" has a nice "non_unique" parameter similar to bash command usermod with "--non-unique".
Unfortunately module "group" hasn't parameter "non_unique" (bash command groupmod however has --non-unique).
So it would be nice to have "non_unique" parameter in "group" module.
Issue originally from ansible/ansible#7358
Issue Type:
“Feature Idea”
Ansible Version:
1.5.3
Environment:
Ubuntu 12.04
Summary:
We should be able to specify a timeout for get_url for downloading larger files (or for hitting longer running endpoints).
Right now, it looks like it's fixed at 10 seconds, the default for the timeout param of fetch_url.
Steps To Reproduce:
name: warmup cache get_url: url=http://foo:[email protected]/warmup dest=/warmup-done force=yes timeout=300
Expected Results:
TASK: [warmup cache] **********************************************************
changed: [12.34.12.34]
Actual Results:
TASK: [warmup cache] **********************************************************
fatal: [12.34.12.34] => failed to parse: SUDO-SUCCESS-auisjvazbmvdmhizbletefqldvuexvtd
Traceback (most recent call last):
File "/home/ubuntu/.ansible/tmp/ansible-tmp-1396050193.29-76687999901185/get_url", line 1664, in
main()
File "/home/ubuntu/.ansible/tmp/ansible-tmp-1396050193.29-76687999901185/get_url", line 209, in main
tmpsrc, info = url_get(module, url, dest, use_proxy, last_mod_time, force)
File "/home/ubuntu/.ansible/tmp/ansible-tmp-1396050193.29-76687999901185/get_url", line 134, in url_get
rsp, info = fetch_url(module, url, use_proxy=use_proxy, force=force, last_mod_time=last_mod_time)
File "/home/ubuntu/.ansible/tmp/ansible-tmp-1396050193.29-76687999901185/get_url", line 1652, in fetch_url
r = urllib2.urlopen(request, None, timeout)
File "/usr/lib/python2.7/urllib2.py", line 126, in urlopen
return _opener.open(url, data, timeout)
File "/usr/lib/python2.7/urllib2.py", line 406, in open
response = meth(req, response)
File "/usr/lib/python2.7/urllib2.py", line 519, in http_response
'http', request, response, code, msg, hdrs)
File "/usr/lib/python2.7/urllib2.py", line 438, in error
result = self._call_chain(*args)
File "/usr/lib/python2.7/urllib2.py", line 378, in _call_chain
result = func(*args)
File "/usr/lib/python2.7/urllib2.py", line 890, in http_error_401
url, req, headers)
File "/usr/lib/python2.7/urllib2.py", line 865, in http_error_auth_reqed
response = self.retry_http_basic_auth(host, req, realm)
File "/usr/lib/python2.7/urllib2.py", line 878, in retry_http_basic_auth
return self.parent.open(req, timeout=req.timeout)
File "/usr/lib/python2.7/urllib2.py", line 400, in open
response = self._open(req, data)
File "/usr/lib/python2.7/urllib2.py", line 418, in _open
'_open', req)
File "/usr/lib/python2.7/urllib2.py", line 378, in _call_chain
result = func(*args)
File "/usr/lib/python2.7/urllib2.py", line 1207, in http_open
return self.do_open(httplib.HTTPConnection, req)
File "/usr/lib/python2.7/urllib2.py", line 1180, in do_open
r = h.getresponse(buffering=True)
File "/usr/lib/python2.7/httplib.py", line 1030, in getresponse
response.begin()
File "/usr/lib/python2.7/httplib.py", line 407, in begin
version, status, reason = self._read_status()
File "/usr/lib/python2.7/httplib.py", line 365, in _read_status
line = self.fp.readline()
File "/usr/lib/python2.7/socket.py", line 447, in readline
data = self._sock.recv(self._rbufsize)
socket.timeout: timed out
The old repo had a PR that was upvoted quote a bit but not merged yet. It was referenced in two tickets;
1.[]This one has the code ; X.Adding env to allow cron jobs with environment variables by djatlantic · Pull Request #4584 · ansible/ansible ;; ansible/ansible#4584
2.[]This one is a subset of [1] and was not accepted. ; X.cron module: Add mailto parameter by RSpiertz · Pull Request #5466 · ansible/ansible ;; ansible/ansible#5466
Bug Report
ansible 1.8 (devel 402d0c37b8) last updated 2014/10/03 12:17:06 (GMT -400)
lib/ansible/modules/core: (detached HEAD cb69744bce) last updated 2014/10/03 12:18:36 (GMT -400)
lib/ansible/modules/extras: (detached HEAD 8a4f07eecd) last updated 2014/10/03 12:18:37 (GMT -400)
configured module search path = /usr/share/ansible
Centos 7 server
ansible -m service -a "name=mailman state=started enabled=yes" fail on EL7. I spent time to diagnose it, and the cause is the presence of '\n' in the unit file.
# grep '\\n' /usr/lib/systemd/system/mailman.service
ExecStop=/bin/sh -c 'echo -e "# DO NOT EDIT THIS FILE!\n#\n# Contents of this file managed by /etc/init.d/mailman\n# Master copy is /usr/lib/mailman/cron/crontab.in" > /etc/cron.d/mailman'
This greatly confuse the module, since self.execute_command return stdout as 1 single string, whose lines are separated by \n. So if there is already \n in one of the line, this break on this line ( in get_systemd_status_dict, in system/service.py ):
return dict(line.split('=', 1) for line in out.splitlines())
Since this return a uneven number of item for dict, a exception is raised.
Run the command ansible -m service -a "name=mailman state=started enabled=yes" on a EL7, with mailman installed.
No failure
failed: [mail.example.org] => {"failed": true, "parsed": false}
Traceback (most recent call last):
File "/root/.ansible/tmp/ansible-tmp-1412360673.33-152814301059563/service", line 2836, in <module>
main()
File "/root/.ansible/tmp/ansible-tmp-1412360673.33-152814301059563/service", line 1274, in main
service.service_enable()
File "/root/.ansible/tmp/ansible-tmp-1412360673.33-152814301059563/service", line 695, in service_enable
d = self.get_systemd_status_dict()
File "/root/.ansible/tmp/ansible-tmp-1412360673.33-152814301059563/service", line 507, in get_systemd_status_dict
return dict(line.split('=', 1) for line in out.splitlines())
ValueError: dictionary update sequence element #56 has length 1; 2 is required
Bug report (originally reported ansible/ansible#8732)
$ ansible --version
ansible 1.8
Archlinux host
ansible_os_family no longer returns "Archlinux" for my Arch machines. It now returns "NA"
ansible -m setup |grep ansible_os_family
"ansible_os_family": "Archlinux",
"ansible_os_family": "NA",
(This is cloned from ansible/ansible#6757)
Bug report
gce_net
ansible 1.6 (devel 8c7828d) last updated 2014/03/25 10:21:15 (GMT -700)
Ubuntu 12.04.1
gce_net tasks "succeed" even when the underlying firewall creation request fails.
$ ansible localhost -i inventory -m gce_net -a "name=network-a ipv4_range=10.0.0.0/8"
$ ansible localhost -i inventory -m gce_net -a "name=network-a fwname=my-fw allowed=tcp:22"
$ ansible localhost -i inventory -m gce_net -a "name=network-b ipv4_range=10.0.0.0/8"
$ ansible localhost -i inventory -m gce_net -a "name=network-b fwname=my-fw allowed=tcp:22"
Failure. The resource already exists with different attributes. E.g.,
$ gcutil addfirewall my-fw --network=network-b --allowed=tcp:22
INFO: Waiting for insert of firewall my-fw. Sleeping for 3s.
ERROR: RESOURCE_ALREADY_EXISTS: The resource 'projects/eastern-verbena-523/global/firewalls/my-fw' already exists
$ ansible localhost -i inventory -m gce_net -a "name=network-b fwname=my-fw allowed=tcp:22"
localhost | success >> {
"allowed": "tcp:22",
"changed": false,
"fwname": "my-fw",
"ipv4_range": "10.0.0.0/8",
"name": "network-b",
"src_range": null,
"src_tags": null,
"state": "present"
}
But the firewall doesn't have the requested attributes:
$ gcutil getfirewall my-fw
+---------------+-------------------------------+
| name | my-fw |
| description | |
| creation-time | 2014-03-29T14:11:42.499-07:00 |
| network | network-a |
| source-ips | 0.0.0.0/0 |
| source-tags | |
| target-tags | |
| allowed | tcp: 22 |
+---------------+-------------------------------+
The firewall rule is applied to the wrong network! gce_net treats fwname as an incidental attribute of the network such that "network-b exists with no firewall rule my-fw" is considered a success condition of "gce_net name=network-b fwname=my-fw ...". (I can assure you that creating a network with port 22 blocked is very much a failure state for my playbook!)
Bug Report
ansible-playbook 1.8 (devel 3bd1e4f) last updated 2014/08/28 21:51:11 (GMT -400)
boto 2.3.2.1
Running the same VPC creation tasks always results in status changed. This seems to be triggered by line 492 of ec2_vpc, but that is an indicator that something is happening that shouldn't be.
- hosts: localhost
gather_facts: no
tasks:
- name: create vpc
ec2_vpc:
state: present
cidr_block: 172.22.0.0/16
resource_tags: { "Name": "TEST" }
subnets:
- cidr: 172.22.1.0/24
resource_tags: { "Name":"TEST-1" }
az: us-east-1b
- cidr: 172.22.2.0/24
resource_tags: { "Name":"TEST-2" }
az: us-east-1c
route_tables:
- subnets:
- 172.22.1.0/24
- 172.22.2.0/24
routes:
- dest: 0.0.0.0/0
gw: igw
internet_gateway: True
region: "{{ region }}"
wait: yes
register: vpc
Creation would happen on the first time, but subsequent times changed should be = False.
first run
$: ansible-playbook -i inventory/hosts test.yml -v
PLAY [localhost] **************************************************************
TASK: [create vpc] ************************************************************
changed: [localhost] => {"changed": true, "subnets": [{"az": "us-east-1c", "cidr": "172.22.2.0/24", "id": "subnet-45f92c32", "resource_tags": {"Name": "TEST-2"}}, {"az": "us-east-1b", "cidr": "172.22.1.0/24", "id": "subnet-0b2f3823", "resource_tags": {"Name": "TEST-1"}}], "vpc": {"cidr_block": "172.22.0.0/16", "dhcp_options_id": "dopt-d2cadfb0", "id": "vpc-0c5fea69", "region": "us-east-1", "state": "available"}, "vpc_id": "vpc-0c5fea69"}
PLAY RECAP ********************************************************************
localhost : ok=1 changed=1 unreachable=0 failed=0
second run
$: ansible-playbook -i inventory/hosts test.yml -v
PLAY [localhost] **************************************************************
TASK: [create vpc] ************************************************************
changed: [localhost] => {"changed": true, "subnets": [{"az": "us-east-1c", "cidr": "172.22.2.0/24", "id": "subnet-45f92c32", "resource_tags": {"Name": "TEST-2"}}, {"az": "us-east-1b", "cidr": "172.22.1.0/24", "id": "subnet-0b2f3823", "resource_tags": {"Name": "TEST-1"}}], "vpc": {"cidr_block": "172.22.0.0/16", "dhcp_options_id": "dopt-d2cadfb0", "id": "vpc-0c5fea69", "region": "us-east-1", "state": "available"}, "vpc_id": "vpc-0c5fea69"}
PLAY RECAP ********************************************************************
localhost : ok=1 changed=1 unreachable=0 failed=0
Template time!
Bug Report
deploy@mail2:/home/josh$ ansible --version
ansible 1.7.2
Ubuntu 14.04
The apt module hangs when upgrading packages.
Playbook:
- name: update cache
apt: "update_cache=yes"
The issue also occurs when running upgrade=yes, and when running via ansible directly:
ansible all -s -m apt -a "update_cache=yes upgrade=yes"
Packages are upgraded and the playbook continues, or the ansible command terminates
Playbook never moves to the next step, or the ansible module never terminates. This occurs even when there are no packages to upgrade, so it should not be going interactive.
Bug Report
ansible 1.6.10
N/A
I was bit by the bug mentioned here: https://www.mail-archive.com/[email protected]/msg07937.html
Basically, there doesn't seem to be a requirement for count_tag when using exact_count. I don't see a bug report for this, thus adding it here.
What appears to happen currently is that if count_tag isn't specified, all (or many) ec2 instances match and it starts making api calls to terminate those instances. This was unexpected.
Use ec2 and have an exact_count but no count_tag
Failure because count_tag is required for exact_count
Random termination of instances.
Issue Type: Feature Idea
Ansible Version: ansible 1.7.1
Environment: Ubuntu 14.04
Summary:
I request a feature to allow me to specify what filename the apt_repository creates
apt_repository: repo='deb http://archive.canonical.com/ubuntu hardy partner' state=present filename=hardy-partner.list
Steps To Reproduce:
When I add a repo such as:
deb http://dl.google.com/linux/talkplugin/deb/ stable main
A file is created named:
dl_google_com_linux_chrome_deb.list
When I install the package google-chrome-stable, which comes from this repo, it creates:
google-chrome.list
With the same repo content, so apt-get complains about duplicate entries
Expected Results:
Clean repository
Actual Results:
Duplicated repo entries
It should be possible to pass environment settings through the raw module, but the raw module does not appear to respect environment: dict settings, e.g. minimal play:
# bootstraps FreeBSD 10 to respect ansible's authority
---
- hosts: bootstrap
user: root
gather_facts: no
tasks:
- raw: /usr/sbin/pkg -N
register: pkg
ignore_errors: True
- raw: /usr/sbin/pkg bootstrap -f
environment:
ASSUME_ALWAYS_YES: 1
when: pkg|failed
Using env
instead of the pkg
command shows that ASSUME_ALWAYS_YES is not visible.
FWIW a simple work-around in this case was:
- raw: env ASSUME_ALWAYS_YES=1 /usr/sbin/pkg bootstrap -f -y
when: pkg|failed
Either this could be documented (I can do this) or the modules should play well together.
(duplicated from ansible/ansible#7692)
@jimi-c commented:
I can reproduce this with this minimal playbook as well:
---
- hosts: localhost
connection: local
gather_facts: no
tasks:
- raw: echo $FOO
environment:
FOO: "this is foo"
Bug Report
ansible 1.7.1
Ubuntu 14.04.1
If an EC2 instance already has an EIP associated to it, I would expect the ec2_eip module to do nothing/reuse the existing IP. Instead, it creates a new IP and associates this.
Note that I am not asking for the functionality provided by reuse_existing_ip_allowed
.
- ec2_eip: instance_id=i-1212f003
An instance without an EIP gets a new one allocated.
An instance with an EIP gets the same one allocated (idempotent),
An instance with an EIP gets the another new EIP allocated (no idempotent, every new run creates and allocated a new EIP)
Here's the playbook that creates an instance and associates an EIP.
(vpc and security group exist already)
- name: EIP module bug
hosts: 127.0.0.1
connection: local
gather_facts: no
tasks:
- include_vars: "aws/eip-bug/vpc_info"
- name: Creating instance
local_action:
module: ec2
key_name: "keyname"
region: us-east-1
group_id:
- "{{ sg_default.group_id }}"
instance_type: t2.micro
image: "ami-0619bf6e"
wait: yes
vpc_subnet_id: "{{ subnet_test_id }}"
assign_public_ip: yes
exact_count: 1
count_tag:
Environment: "eip-bug"
Class: eip-bug
instance_tags:
Environment: "eip-bug"
Class: eip-bug
Name: eip-bug
register: instance
- name: Allocating elastic IP to instance
ec2_eip:
in_vpc: yes
reuse_existing_ip_allowed: yes
state: present
region: us-east-1
instance_id: "{{ instance.tagged_instances[0].id }}"
register: instance_eip
- debug: var=instance_eip.public_ip
The instance task is idempotent thanks to exact_count/count_tag. The EIP task creates and associates a new EIP on every invocation. Accordingly, the number of EIPs increases; after 4 invocations the task fails due to Amazon's restriction to 3 unallocated EIPs.
EIP module output with -vvv:
TASK: [Allocating elastic IP to instance] *************************************
<127.0.0.1> REMOTE_MODULE ec2_eip region=us-east-1 state=present instance_id=i-xxx
<127.0.0.1> EXEC ['/bin/sh', '-c', 'mkdir -p $HOME/.ansible/tmp/ansible-tmp-1411248496.02-82225394781211 && chmod a+rx $HOME/.ansible/tmp/ansible-tmp-1411248496.02-82225394781211 && echo $HOME/.ansible/tmp/ansible-tmp-1411248496.02-82225394781211']
<127.0.0.1> PUT /tmp/tmpvxur9q TO /home/user/.ansible/tmp/ansible-tmp-1411248496.02-82225394781211/ec2_eip
<127.0.0.1> EXEC ['/bin/sh', '-c', u'LANG=en_US.UTF-8 LC_CTYPE=en_US.UTF-8 /home/user/.pvenvs/ansible/bin/python /home/user/.ansible/tmp/ansible-tmp-1411248496.02-82225394781211/ec2_eip; rm -rf /home/user/.ansible/tmp/ansible-tmp-1411248496.02-82225394781211/ >/dev/null 2>&1']
changed: [127.0.0.1] => {"changed": true, "public_ip": "xx.xx.xx.xx"}
Issue Type:
Bug Report
Ansible Version:
1.7.2
Environment:
OS X 10.9 / RHEL 6/7
Summary:
When adding a child channel to rhn sat server rhn_channel fails with 500 error.
Steps To Reproduce:
attempt to subscribe to a child channel with rhn_channel to sat server 5.4+
Expected Results:
Server gets subscribed to child channel.
Actual Results:
xmlrpclib.ProtocolError: <ProtocolError for redhat.example.com/rpc/api: 500 Internal Server Error>
channel.software.setSystemChannels is depreciated.
https://access.redhat.com/documentation/en-US/Red_Hat_Network_Satellite/5.5/html/API_Overview/files/html/handlers/ChannelSoftwareHandler.html#setSystemChannels
PR to follow
Bug Report
ansible 1.7.1
OSX
When providing a relative path to ssh key, synchronize can't find it.
Create a playbook with a synchronize task and use a relative path when defining your ssh key (either with --private-key
at the cli, or with ansible_ssh_private_key_file
assigned somewhere).
rsync works.
rsync errors with
msg: Warning: Identity file relative/path/to/file.pem not accessible: No such file or directory.
ansible_ssh_private_key_file: "{{ lookup('env', 'PWD') }}/relative/path/to/file.pem"
This is a copy of ansible/ansible#9073 created by @itarchmerc and is fixed by #22
Issue Type:
When using the ec2_elb_lb module to create an ELB with a HTTPS listener with a SSL certificate, the module always reports the status as changed even when no changes are made.
Ansible Version:
1.7.1
Environment:
Management Machine: Mac OS X 10.9.4, ansible 1.7.1 installed via homebrew
Target Machine: EC2 ELB
Summary:
When using the ec2_elb_lb module to create an ELB with a HTTPS listener with a SSL certificate, the module always reports the status as changed even when no changes are made. If I remove the HTTPS listener and only specify HTTP, the status is reported correctly.
Steps To Reproduce:
Create an ELB with the ec2_elb_lb module with a HTTP and HTTPS (with SSL certificate) listener. The ELB will be provisioned.
Rerun the same task. The status will report as changed even though no changes were made.
Expected Results:
Status should be ok on subsequent runs of the same task
Actual Results:
Status always shows as changed.
From the old ticketbase, I was watching a few items. These are ok to close and not port. I documented my findings there. (FYI the list of all modules is here; http://docs.ansible.com/list_of_all_modules.html )
1.Crontab Jobs may be scheduled at random minutes/hours and Jobs are ID'd by name not time.
ansible/ansible#6896
2.Crontab be able to write to a Crontab path begining with '/' as an an absolute path.
ansible/ansible#4881
@mm0 - re-opening your ticket here. Applying the ticket to try and assist with the process.
This was originally created as 'P2' 'bug_report' 'module' at ansible/ansible#8989
Bug Report
V 1.8 (beta). Works as expected on 1.7.1
N/A
Extraneous newlines are added to multi-line yaml content when using the 'copy' module.
Please see notes from original ticket below.
No blank lines should be added - the behaviour should be as per version 1.7
Please see notes from original ticket below.
hosts: localhost
connection: local
vars:
outfilefail1: ./outcertfail1
working_outfile1: ./outcert_working
working_outfile2: ./outcert_working2
certificate: |
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEApj8FWvKE5k4HfnZPHEM4b39LxmYiHyfUnemg4ywT4ydeyr2I
l0EiNQt9yMLr3jAuWFZE/+KTD2GPONIuOCEMwWrF0sBSP5cdndjwQqwIcL7YXNE+
4C1IT/GaNNGwolQXxSRzSSnBIAG9XplvAvdu+NjEVaha46L7XAiYWCU19UkwVITg
6hvfRkN6iVXzn5UolHbcMqHJB6/O7ItVZl/TEW5Ehc0+06q5BLHNvUaVX3ujy1sO
xxr9XZpTcYesTFcQUyI4KSphcYzJa0oRJrM8b0mLuAKGh4RBbxiMT65AYJz9wv5R
l4KnR6WZgwgU0oajdebJ5hayUIt46sCPP4jCvwIDAQABAoIBAGe1oO2fpXDW9K3b
uHZ1KNvFmcvnIxo0itsISCnv8Wgfw27O1kslguV8ibeYgfRWMlNBXkITYpKR1fso
g1TYqVBv/4D+IVEyQHOcRiYRlCJhrDAbCRJorVfR7NVOitZ5h2qg1pqpxaTl8PD2
3t4G5d+vuquFH04q+ovrgL5cWFDvmgyMz/hRFChwTDWpiP4dQUQXJkqf1gzGIAb9
cfu/kuyc2M6iPPAuFdWgVaG2V52ZHP7eVTZibEj3uu2BKA03fQtaaGz1Js10dVDP
LQYAHjGNiYtJOvT6N6En38XXykDDQ/3LLwRJ+S0r7y7F6XD5BfZsYu+yFFAGN/XY
I1IJa8ECgYEA1BlI4rHvkKgGWka5Hs2A1I+GW2Fbh/9WeKXOy/Klvcx6VqTerzGu
qVViREvITaMTXaV+aN1ZHaw9aQjtRtaIv3Q+QgG0iz8xdeyCAdB3Nz+sEreSK/nt
Z4W/uBsqL7EX+Ft52qJ3AFM9VEyE0sN81m4PDgbCbSRyy63nVNNNvkcCgYEAyKgX
7EEIcAVG8K9HQYZGUyjHQwRH4LmgdseXYwxgGXNwxujaQEU39baivvRvuEuRgmKA
7WqS2EhrCuLauyEaBGk5v0GZVD1Br67xWZ4JGXz8QRFaWU/eDfZGKdpzlYDsdVSW
ZJOO9i6bvRfsk74Fxmv9JREqUTtCOpl+rYw8O8kCgYB0GYseHEyIoJEppYD77X3R
3Oas6rQR06Ff1VNHrIExTdbByunieI2lP4nU3K6+YL/fCRITEOcRKRFMh4hquFCO
jHDv7MMJXgQTCu13VMeNRJtKe5XV4K8ldb8mZihHhucaGeiv1zLQyL/PfztNq5iQ
QBqZkPWojMUR3RW+BxSNTQKBgQDCemENY46o/ARgvJGEiX7ZlLlkU97SiTdkSFiK
8HCn2kJhF0iJaE0vgn9EMqehaOS0CYLKGTQQGkhdObgkDJYp1k7Y9tyEUAa9HwLf
CBPrtz7KVeZKj+U5hQtF/2ttaJJFueE1w+qY4l2hrXFnVJJGWV32MifgqV2sbB7i
V/v9OQKBgQC/khRqBF78r+c+IBD8qwFsul1q/1+GjHGniJVT11n0TaFA7uG8X5PM
P5TsBigLmNGk/44Tg3fe9iCZXVB09CMqJNdaxqhCvwjj8WJ+wkEY5yhv+lHehHUh
Njyac1N+crBFEd2Suww9Md9H9Sg/5AJW/lY5Ek9CRAG1LvAengbGdQ==
-----END RSA PRIVATE KEY-----
tasks:
name: fails
copy: content="{{ certificate }}" dest="{{ outfilefail1 }}"
name: fails
lineinfile: line="{{ certificate }}" dest="{{ outfilefail1 }}" create=yes
name: works
copy:
content: |
{{ certificate }}
dest: "{{ working_outfile1 }}"
name: works
copy:
content: >
{{ certificate }}
dest: "{{ working_outfile2 }}"
As per @mm0
Please assume that all the indentation is correct, I wasn't sure how to do that here. I just created a
key using ssh-keygen for the certificate variable. I noticed that the first fail example (using the copy
module) adds two newlines between each line, and lineinfile only adds one extra, both of which are
wrong. I also included two working methods of doing this. All 4 examples work correctly in 1.7.1, but
on 1.8 only the last 2 work.
What kind of ticket is this? “Documentation Report”
1.7.2 development
What OS are you running Ansible from and what OS are you managing? Ubuntu 12.04
The stat module exposes many attributes available via the stat function in the Python os module, and some additional attributes. These attributes should be mentioned in the documentation of the stat module. The attributes pw_name and isdir were used in the examples. I had to go to the source for the stat module to find the other attributes.
Here is what I would like to see added to the end of ansible/library/files/stat's DOCUMENTATION string. The only ones that I'm unsure about are pw_name, isgid and isuid.
returns: a stat object with the following attributes:
atime - last access time
ctime - last creation time
dev - path's device
exists - true if the file exists
gid - path's group id
inode - path's inode
isblk - true if path is a block device
ischr - true if path is a character device
isdir - true if path is a directory
isfifo - true if path is a fifo (a.k.a. named pipe)
isgid - invoking group's id matches path's group id
islnk - true if path is a symbolic link
isreg - true if path is a regular file
issock - true if path is a socket (a.k.a. UNIX Domain Socket)
isuid - invoking user's id matches path's user id
lnk_source - where path links to
md5 - md5 checksum for path
mode - the mode of path in 4 octal digits
mtime - last modification time
nlink - number of hard links to this path
pw_name - owner of path
rgrp - path mode: group read
roth - path mode: other read
rusr - path mode: user read
size - size of path
uid - path's user id
wgrp - path mode: group write
woth - path mode: other write
wusr - path mode: user write
xgrp - path mode: group execute
xoth - path mode: other execute
xusr - path mode: user execute
Look at the stat module's documentation.
More detail in the documentation without having to look at the stat module's source code.
N/A
“Bug Report”
ansible 1.8
Ubuntu 13.10/14.04
Fix or remove the faulty change detection for update-rc.d based service enabling.
sudo apt-get install rrdcached
Correctly enabled after installation:
find /etc -iname '*rrdcached*' | sort
/etc/default/rrdcached
/etc/init.d/rrdcached
/etc/rc0.d/K20rrdcached
/etc/rc1.d/K20rrdcached
/etc/rc2.d/S20rrdcached
/etc/rc3.d/S20rrdcached
/etc/rc4.d/S20rrdcached
/etc/rc5.d/S20rrdcached
/etc/rc6.d/K20rrdcached
Disable:
ansible localhost -s -m service -a "name=rrdcached enabled=no"
localhost | success >> {
"changed": true,
"enabled": false,
"name": "rrdcached"
}
Correctly disabled:
find /etc -iname '*rrdcached*' | sort
/etc/default/rrdcached
/etc/init.d/rrdcached
/etc/rc0.d/K20rrdcached
/etc/rc1.d/K20rrdcached
/etc/rc2.d/K80rrdcached
/etc/rc3.d/K80rrdcached
/etc/rc4.d/K80rrdcached
/etc/rc5.d/K80rrdcached
/etc/rc6.d/K20rrdcached
Re-enable:
ansible localhost -s -m service -a "name=rrdcached enabled=yes"
localhost | success >> {
"changed": false,
"enabled": true,
"name": "rrdcached"
}
Note: Changed is false, which is incorrect.
Incorrect results on disk too:
find /etc -iname '*rrdcached*' | sort
/etc/default/rrdcached
/etc/init.d/rrdcached
/etc/rc0.d/K20rrdcached
/etc/rc1.d/K20rrdcached
/etc/rc2.d/K80rrdcached
/etc/rc3.d/K80rrdcached
/etc/rc4.d/K80rrdcached
/etc/rc5.d/K80rrdcached
/etc/rc6.d/K20rrdcached
find /etc -iname '*rrdcached*' | sort
/etc/default/rrdcached
/etc/init.d/rrdcached
/etc/rc0.d/K20rrdcached
/etc/rc1.d/K20rrdcached
/etc/rc2.d/S20rrdcached
/etc/rc3.d/S20rrdcached
/etc/rc4.d/S20rrdcached
/etc/rc5.d/S20rrdcached
/etc/rc6.d/K20rrdcached
find /etc -iname '*rrdcached*' | sort
/etc/default/rrdcached
/etc/init.d/rrdcached
/etc/rc0.d/K20rrdcached
/etc/rc1.d/K20rrdcached
/etc/rc2.d/K80rrdcached
/etc/rc3.d/K80rrdcached
/etc/rc4.d/K80rrdcached
/etc/rc5.d/K80rrdcached
/etc/rc6.d/K20rrdcached
[re-posting module issue from ansible/ansible#6672]
Bug Report
1.5.3
OS X 10.9.2
get_head_branch()
fails to correctly compute the HEAD branch if the branch name contains a slash. This is caused by splitting on '/' and indexing [-1] here.
Run this playbook:
- name: checkout llvm
git: repo=https://github.com/thpani/llvm.git
dest=/home/vagrant/llvm/
Checkout fails because branch is computed as
release_33_nullsucc
instead of
patches/release_33_nullsucc
.
get_head_branch()
computes the correct branch name.
I.e. behave as if the above example were
- name: checkout llvm
git: repo=https://github.com/thpani/llvm.git
dest=/home/vagrant/llvm/
version=patches/release_33_nullsucc
TASK: [checkout llvm] *********************************************************
failed: [default] => {"failed": true}
msg: Failed to checkout branch release_33_nullsucc
[This is a clone of ansible/ansible#7533 of which I am not the author]
Bug Report
ansible 1.6.2
Ubuntu 12.04
git module key_file= option doesn't interpret the ~/ as $HOME
git: repo=ssh://[email protected]/xxx/yyyy.git dest=~/compile key_file=~/.ssh/bitbucket_app -vvvv
read the keyfile and checkout from git :)
<localhost> REMOTE_MODULE git repo=ssh:********@bitbucket.org/xxx/yyy.git dest=~/compile key_file=~/.ssh/bitbucket_app
failed: [localhost] => {"cmd": "/usr/bin/git ls-remote origin -h refs/heads/master", "failed": true, "item": "", "rc": 128}
stderr: Warning: Identity file ~/.ssh/bitbucket_app not accessible: No such file or directory.
Bug Report
1.7.2
Centos 6
If you try to install zabbix-server
and zabbix-server-pgsql
package from the official zabbix repository with yum:
yum -y install zabbix-server zabbix-server-pgsql
It works without a problem, but if you do the same thing with Ansible:
- hosts: zabbix
tasks:
- yum: name=http://repo.zabbix.com/zabbix/2.4/rhel/6/x86_64/zabbix-release-2.4-1.el6.noarch.rpm state=present
- yum: name={{ item }} state=present
with_items:
- zabbix-server
- zabbix-server-pgsql
The task fails and reports:
Error: zabbix-server-mysql conflicts with zabbix-server-pgsql-2.4.0-1.el6.x86_64
Error: zabbix-server-pgsql conflicts with zabbix-server-mysql-2.4.0-1.el6.x86_64
I guess the reason for this is because zabbix-server depends on either zabbix-server-mysql
or zabbix-server-pgsql
and yum module tries to install one package at a time, so if it first installs zabbix-server
, that package automatically installs zabbix-server-mysql
, which later conflicts with zabbix-server-pgsql
.
The workaround is very easy, you just have to only pass zabbix-server-pgsql
to the yum module, since it will install zabbix-server
as a dependency. The problem is that running a yum command with a list of packages doesn't work the same as the Ansible yum
module with a list of packages passed using with_items
. This means you will never know what will the module install, compared to the yum command, which is bad in my opinion.
You can reproduce the bug, by just running the above playbook.
It should install both packages.
Only installs zabbix-server
and the second package reports a conflict with zabbix-server-mysql
, which was installed as a dependency for zabbix-server-mysql
.
If you're familiar with the apt module, you can specify state=latest to get ansible to upgrade.
I want to do the same with docker. I want to run an image, and when that image has been updated I want the old container stopped and the new version of the container started.
Does the docker module support this? I've tried and it doesn't work as I hoped.
Example playbook which I hoped to re-use over and over to ensure my target is at the latest.
hosts: localhost
sudo: yes
tasks:
name: ensure redis container is running
docker: image=dockerfile/redis name=redis command=" bash -c 'redis-server /etc/redis/redis.conf'"
name: ensure latest version of the web container is running
docker: image=snazzy/cyweb ports=5000:5000 links=redis:redis name=cyweb
Thanks
Feature Idea
authorized_key module
N/A
The authorized_keys.py module uses the "os.mkdir()" function to create the .ssh directory if it doesn't exist.
It's possible that the users home directory hasn't been created.
So using the "os.mkdirs()" function would recursively create the directory if the users home directory didn't exist.
Here is an error I came across when deploying ssh keys
File "//.ansible/tmp/ansible-tmp-1412053423.23-52811687695291/authorized_key", line 175, in keyfile
os.mkdir(sshdir, 0700)
OSError: [Errno 2] No such file or directory: '/users/lincolns/.ssh'
Originally opened as ansible/ansible#8314
Issue Type:
Bug Report
Ansible Version:
ansible 1.7 (devel 226dacc) last updated 2014/07/28 21:56:28 (GMT +300)
Environment:
managing host: Ubuntu 14.04 64bit
managed host: Ubuntu 10.04 32bit (python 2.6.5 + python-apt 0.7.94)
Summary:
Getting an error message while using with_items with the apt module.
Steps To Reproduce:
According to feature request #7863 and fix #8292, with_items should be used like this:
- name: install debs
apt: deb=/tmp/{{ item }} state=installed
with_items:
- linux-headers-3.11.6-031106_3.11.6-031106.201310181453_all.deb
- linux-headers-3.11.6-031106-generic_3.11.6-031106.201310181453_i386.deb
- linux-image-3.11.6-031106-generic_3.11.6-031106.201310181453_i386.deb
Expected Results:
deb packages getting installed
Actual Results:
error message:
TASK: [install debs] **********************************************************
failed: [host1] => (item=linux-headers-3.11.6-031106_3.11.6-031106.201310181453_all.deb,linux-headers-3.11.6-031106-generic_3.11.6-031106.201310181453_i386.deb,linux-image-3.11.6-031106-generic_3.11.6-031106.201310181453_i386.deb) => {"failed": true, "item": "linux-headers-3.11.6-031106_3.11.6-031106.201310181453_all.deb,linux-headers-3.11.6-031106-generic_3.11.6-031106.201310181453_i386.deb,linux-image-3.11.6-031106-generic_3.11.6-031106.201310181453_i386.deb", "parsed": false}
invalid output was: SUDO-SUCCESS-mwctpznrbdkgnukozzhwfjskdskanudn
Traceback (most recent call last):
File "<stdin>", line 1865, in <module>
File "<stdin>", line 523, in main
File "<stdin>", line 302, in install_deb
File "/usr/lib/python2.6/dist-packages/apt/debfile.py", line 285, in compare_to_version_in_cache
if pkgname in self._cache:
TypeError: argument of type 'NoneType' is not iterable
FATAL: all hosts have already failed -- aborting
Original issue: ansible/ansible#8596
Feature Idea
ansible 1.7.1
N/A
I had a wrong permission in one of the files inside my .git folder but the git submodule didn't show the error message, only a very generic "msg: Failed to download remote objects and refs". I believe that the git submodule should show the error message that git is showing, so you do not have to log in and execute the command by yourself to check the error and see what happened.
Just change the permissions of some files inside the .git to some that the ansible user cannot read/write
The actual error
"msg: Failed to download remote objects and refs"
When using the ec2_elb module to remove an instance from a load balancer, if the instance was not in the load balancer before running the task, Ansible incorrectly reports the state has changed.
Invoke the ec2_elb module to remove an instance that's not in a load balancer (or just run it twice)
---
- name: remove instance from a load balancer
hosts: localhost
vars:
instances:
- i-123456ab
lb: my-load-balancer
tasks:
- name: take the instances out of the load balancer
local_action: ec2_elb
args:
instance_id: "{{ item }}"
ec2_elbs: "{{ lb }}"
state: absent
with_items: instances
TASK: [take the instances out of the load balancer] ***************************
ok: [localhost -> 127.0.0.1] => (item=i-123456ab)
PLAY RECAP ********************************************************************
localhost : ok=1 changed=1 unreachable=0 failed=0
TASK: [take the instances out of the load balancer] ***************************
changed: [localhost -> 127.0.0.1] => (item=i-123456ab)
PLAY RECAP ********************************************************************
localhost : ok=1 changed=1 unreachable=0 failed=0
Bug Report
ansible 1.7.2
N/A
'rax state=absent' doesn't delete anything. As a side note, 'image' and 'flavor' are required regardless of requested state.
Example playbook to "spot remove" a single machine by name
The server {{ srv_name }} should no longer exist.
The server {{ srv_name }} still exists, in ACTIVE status.
This is still an issue (ansible 1.7.2 on OS X), original conversation here: ansible/ansible#8779
Feature Idea
All versions.
Ubuntu 14.04, and all other.
The module "lineinfile" should have an option to remove duplicate lines matched by regexp.
Currently it changes only the last line.
Let's say that we have the following lines in sshd_config (don't ask me how I got this):
PasswordAuthentication yes
# some stuff
PasswordAuthentication yes
We run ansible as:
$ansible -c local -m lineinfile -a 'dest=./sshd_config regexp="^[#\s]*PasswordAuthentication.*" line="PasswordAuthentication no"' localhost
With an option like "remove_dups=yes" we would have:
# some stuff
PasswordAuthentication no
PasswordAuthentication yes
# some stuff
PasswordAuthentication no
Bug Report
ansible 1.7 (devel 75e5b64) last updated 2014/07/22 14:37:30 (GMT -400)
RHEL 6 managing AIX
Ansible fails when using copy module on AIX
Attempt to copy file to AIX with Python 2.7.8 using copy module
The file copies successfully
<fdb> ESTABLISH CONNECTION FOR USER: root on PORT 22 TO fdb
<fdb> EXEC /bin/sh -c 'rc=0; [ -r "/testfile" ] || rc=2; [ -f "/testfile" ] || rc=1; [ -d "/testfile" ] && echo 3 && exit 0; (/usr/bin/md5sum /testfile 2>/dev/null) || (/sbin/md5sum -q /testfile 2>/dev/null) || (/usr/bin/digest -a md5 /testfile 2>/dev/null) || (/sbin/md5 -q /testfile 2>/dev/null) || (/usr/bin/md5 -n /testfile 2>/dev/null) || (/bin/md5 -q /testfile 2>/dev/null) || (/usr/bin/csum -h MD5 /testfile 2>/dev/null) || (/bin/csum -h MD5 /testfile 2>/dev/null) || (echo "${rc} /testfile")'
<fdb> EXEC /bin/sh -c 'mkdir -p $HOME/.ansible/tmp/ansible-tmp-1406560163.65-86612973678860 && echo $HOME/.ansible/tmp/ansible-tmp-1406560163.65-86612973678860'
<fdb> PUT /testfile TO /home/root/.ansible/tmp/ansible-tmp-1406560163.65-86612973678860/source
<fdb> PUT /tmp/tmpcKn29o TO /home/root/.ansible/tmp/ansible-tmp-1406560163.65-86612973678860/copy
<fdb> EXEC /bin/sh -c 'LANG=en_US.UTF-8 LC_CTYPE=en_US.UTF-8 /usr/local/python/python /home/root/.ansible/tmp/ansible-tmp-1406560163.65-86612973678860/copy; rm -rf /home/root/.ansible/tmp/ansible-tmp-1406560163.65-86612973678860/ >/dev/null 2>&1'
fdb | FAILED >> {
"failed": true,
"md5sum": "d41d8cd98f00b204e9800998ecf8427e",
"msg": "/bin/sh: 5046336 Illegal instruction(coredump)\n",
"parsed": false
}
Copied from here
Bug Report
1.6.3 and 1.7.1
Ubuntu 14.04
When inside a template, the tilde expansion doesn't seem to work correctly.
Before the migration, this was ansible/ansible#8949.
Here's the contents of the playbook:
romain:~/workspace/it_ansible_check_issue $ tree
.
├── copy.yml
└── roles
└── copy
├── tasks
│ └── main.yml
└── templates
└── template.j2
4 directories, 3 files
romain:~/workspace/it_ansible_check_issue $ cat copy.yml
---
- name: copy template to servers
hosts: all
roles:
- copy
romain:~/workspace/it_ansible_check_issue $ cat roles/copy/tasks/main.yml
# copy/tasks/main.yml
---
- name: copy template to host (tilde)
template: >
src=template.j2
dest=~romain/template_tilde
- name: copy template to host (slash)
template: >
src=template.j2
dest=/home/romain/template_slash
romain:~/workspace/it_ansible_check_issue $ cat roles/copy/templates/template.j2
test
Here's what happens when running the playbook without --check
:
romain:~/workspace/it_ansible_check_issue $ ansible-playbook copy.yml -i localhost,
PLAY [copy template to servers] ***********************************************
GATHERING FACTS ***************************************************************
ok: [localhost]
TASK: [copy | copy template to host (tilde)] **********************************
ok: [localhost]
TASK: [copy | copy template to host (slash)] **********************************
ok: [localhost]
PLAY RECAP ********************************************************************
localhost : ok=3 changed=0 unreachable=0 failed=0
Here's what happens when running the playbook with --check
:
romain:~/workspace/it_ansible_check_issue $ ansible-playbook copy.yml -i localhost, --check
PLAY [copy template to servers] ***********************************************
GATHERING FACTS ***************************************************************
ok: [localhost]
TASK: [copy | copy template to host (tilde)] **********************************
changed: [localhost]
TASK: [copy | copy template to host (slash)] **********************************
ok: [localhost]
PLAY RECAP ********************************************************************
localhost : ok=3 changed=1 unreachable=0 failed=0
Running the playbook with or without the --check
option shows the same number of changes.
Running the playbook with --check
option shows changes that don't happen when the playbook is run without it.
Hi There,
I was advised here: ansible/ansible#8123 to open a separate issue on newly separated repos.
Summary:
AWS IAM policy enables us to restrict users to specific file or folder in a bucket. While S3 get object operation is successful from other tools, ansible s3 module fails and returns an error Target bucket not found.
The operation succeeds when list bucket rights are provided to that IAM user.
Thanks!
Feature Idea
ansible 1.7.2
N/A
Allow user to start all stopped EC2 instances associated with a particular tag.
Extend the ec2 module to enable, say, starting all stopped instances tagged with key=Name, Value=ExtraPower
- local_action:
module: ec2
instance_tags:
Name: ExtraPower
state: running
Any stopped instance with the associated tag will be started (any instance already running with the tag would be unaffected).
N/A
Feature Idea
apt
N/A
This issue had reasonable interest, and all the apt
-related modules are Core Modules, so opening a bug here. Here's the original issue: ansible/ansible#8060
Bug Report
ansible 1.7.2
Ubuntu 12.04
When trying to insert multiple lines by adding \n
to the line
argument of the lineinfile the line gets inserted every time the task is executed.
Run the following ansible call two times
ansible testhost -m lineinfile -a "dest=/tmp/testfile line='first line\nsecond line' create=yes"
tongpu@localhost:~$ ansible testhost -m lineinfile -a "dest=/tmp/testfile line='first line\nsecond line' create=yes"
localhost | success >> {
"backup": "",
"changed": true,
"msg": "line added"
}
tongpu@localhost:~$ ansible testhost -m lineinfile -a "dest=/tmp/testfile line='first line\nsecond line' create=yes"
localhost | success >> {
"backup": "",
"changed": false,
"msg": ""
}
/tmp/testfile
first line
second line
tongpu@localhost:~$ ansible testhost -m lineinfile -a "dest=/tmp/testfile line='first line\nsecond line' create=yes"
localhost | success >> {
"backup": "",
"changed": true,
"msg": "line added"
}
tongpu@localhost:~$ ansible testhost -m lineinfile -a "dest=/tmp/testfile line='first line\nsecond line' create=yes"
localhost | success >> {
"backup": "",
"changed": true,
"msg": "line added"
}
/tmp/testfile
first line
second line
first line
second line
Bug Report
ansible 1.7.1
CentOS 7 (ansible), Windows Server 2012 R2 (managed machine)
win_feature module does not properly set the 'message' field in its results.
The win_feature module returns a 'feature_result' list.
Each entry in the list contains:
display_name (descriptive name)
id (integer)
restart_needed (boolean)
skip_reason
success (boolean)
message
The message field returned appears to always be "Microsoft.Windows.ServerManager.Commands.FeatureMessage[]", instead of an actual message string.
Run the windows/enable-iis.yml playbook from ansible-examples.
changed: [ip.address.goes.here] => {"changed": true, "feature_exitcode": "SuccessRestartRequired", "feature_restart_needed": "Yes", "feature_result": [{"display_name": "Application Development", "id": "147", "message": "some actual descriptive message", "restart_needed": "True", "skip_reason": "NotSkipped", "success": "True"}, {"display_name": "Application Initialization", "id": "445", "message": "some actual descriptive message", "restart_needed": "True", "skip_reason": "NotSkipped", "success": "True"}, {"display_name": "ASP", "id": "150", "message": "some actual descriptive message", "restart_needed": "True", "skip_reason": "NotSkipped", "success": "True"},
changed: [ip.address.goes.here] => {"changed": true, "feature_exitcode": "SuccessRestartRequired", "feature_restart_needed": "Yes", "feature_result": [{"display_name": "Application Development", "id": "147", "message": "Microsoft.Windows.ServerManager.Commands.FeatureMessage[]", "restart_needed": "True", "skip_reason": "NotSkipped", "success": "True"}, {"display_name": "Application Initialization", "id": "445", "message": "Microsoft.Windows.ServerManager.Commands.FeatureMessage[]", "restart_needed": "True", "skip_reason": "NotSkipped", "success": "True"}, {"display_name": "ASP", "id": "150", "message": "Microsoft.Windows.ServerManager.Commands.FeatureMessage[]", "restart_needed": "True", "skip_reason": "NotSkipped", "success": "True"},
Feature Idea
ansible 1.7.2
Centos 6.5
When the 'unarchive module' unpacks to a disk that is almost full it will display the "check_results" first, instead of the actual results for the unpacking "extract_results".
With lots of output this may mean missing the original error.
A disk that is almost full and contains a zip file to be unpacked:
[root@t01 tmp]# df -h | grep /tmp
/dev/mapper/VG0-tmp 1008M 914M 43M 96% /tmp
[root@t01 tmp]$ ls -lah OpenConext-engineblock-*
-rw-r--r-- 1 boy users 34M Sep 29 11:42 OpenConext-engineblock-4.2.7.tar.gz
Unpacking with latest Ansible 1.7.2:
[root@t01 tmp]# ansible -i localhost, -c local -m unarchive -a "src=/tmp/OpenConext-engineblock-4.2.7.tar.gz dest=/tmp/ copy=no" -v localhost
localhost | FAILED >> {
"check_results": {
"cmd": "/bin/tar -v -C \"/tmp/\" --diff -zf \"/tmp/OpenConext-engineblock-4.2.7.tar.gz\"",
"err": "/bin/tar: OpenConext-engineblock-4.2.7: Warning: Cannot stat: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/database: Warning: Cannot stat: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/database/patch: Warning: Cannot stat: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/database/patch/patch-0011.sql: Warning: Cannot stat: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/database/patch/patch-0016.php: Warning: Cannot stat: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/database/patch/patch-0006.sql: Warning: Cannot stat: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/database/patch/patch-0007.sql: Warning: Cannot stat: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/database/patch/patch-0017.sql: Warning: Cannot stat: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/database/patch/patch-0001.php: Warning: Cannot stat: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/database/patch/patch-0008.php: Warning: Cannot stat: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/database/patch/patch-0003.sql: Warning: Cannot stat: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/database/patch/patch-0014.sql: Warning: Cannot stat: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/database/patch/patch-0009.sql: Warning: Cannot stat: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/database/patch/patch-0015.sql: Warning: Cannot stat: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/database/patch/patch-0002.sql: Warning: Cannot stat: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/database/patch/patch-0012.sql: Warning: Cannot stat: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/database/patch/patch-0010.php: Warning: Cannot stat: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/database/patch/patch-0004.sql: Warning: Cannot stat: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/database/patch/patch-0018.sql: Warning: Cannot stat: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/database/patch/patch-0005.sql: Warning: Cannot stat: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/database/patch/patch-0013.sql: Warning: Cannot stat: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/database/patch-template.php: Warning: Cannot stat: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/database/patch-template.sql: Warning: Cannot stat: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/NOTICE.txt: Warning: Cannot stat: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/bin: Warning: Cannot stat: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/bin/makeRelease.sh: Warning: Cannot stat: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/bin/ldaptest.php: Warning: Cannot stat: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/bin/formatLog.sh: Warning: Cannot stat: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/bin/composer: Warning: Cannot stat: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/bin/composer/simplesamlphp-post-install.sh: Warning: Cannot stat: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/bin/composer/zend-framework-post-install.sh: Warning: Cannot stat: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/bin/composer/dbpatch-post-install.sh: Warning: Cannot stat:
... SNIP PAGES AND PAGES OF OUTPUT ...
/www/authentication/css/ext/jqueryui/1.8.16/custom-theme/images/ui-icons_2e83ff_256x240.png\nOpenConext-engineblock-4.2.7/www/authentication/css/ext/jqueryui/1.8.16/custom-theme/images/ui-bg_glass_75_dadada_1x400.png\nOpenConext-engineblock-4.2.7/www/authentication/css/ext/jqueryui/1.8.16/custom-theme/images/ui-icons_222222_256x240.png\nOpenConext-engineblock-4.2.7/www/authentication/css/ext/jqueryui/1.8.16/custom-theme/images/ui-icons_454545_256x240.png\nOpenConext-engineblock-4.2.7/www/authentication/css/ext/jqueryui/1.8.16/custom-theme/images/ui-bg_glass_75_e6e6e6_1x400.png\nOpenConext-engineblock-4.2.7/www/authentication/css/ext/jqueryui/1.8.16/custom-theme/images/ui-bg_glass_55_fbf9ee_1x400.png\nOpenConext-engineblock-4.2.7/www/authentication/css/ext/jqueryui/1.8.16/custom-theme/images/ui-bg_flat_75_ffffff_40x100.png\nOpenConext-engineblock-4.2.7/www/authentication/css/ext/jqueryui/1.8.16/custom-theme/images/ui-bg_highlight-soft_75_cccccc_1x100.png\nOpenConext-engineblock-4.2.7/www/authentication/css/ext/jqueryui/1.8.16/custom-theme/images/ui-bg_glass_95_fef1ec_1x400.png\nOpenConext-engineblock-4.2.7/www/authentication/css/ext/jqueryui/1.8.16/custom-theme/images/ui-icons_cd0a0a_256x240.png\nOpenConext-engineblock-4.2.7/www/authentication/css/error.css\nOpenConext-engineblock-4.2.7/www/authentication/css/wide/\nOpenConext-engineblock-4.2.7/www/authentication/css/wide/screen_ie.css\nOpenConext-engineblock-4.2.7/www/authentication/css/wide/screen.css\nOpenConext-engineblock-4.2.7/www/authentication/index.php\nOpenConext-engineblock-4.2.7/www/authentication/generated/\nOpenConext-engineblock-4.2.7/www/authentication/generated/js/\nOpenConext-engineblock-4.2.7/www/authentication/generated/js/1411979426/\nOpenConext-engineblock-4.2.7/www/authentication/generated/js/1411979426/js.min.js\nOpenConext-engineblock-4.2.7/www/authentication/generated/css/\nOpenConext-engineblock-4.2.7/www/authentication/generated/css/1411979426/\nOpenConext-engineblock-4.2.7/www/authentication/generated/css/1411979426/css.min.css\nOpenConext-engineblock-4.2.7/www/authentication/robots.txt\nOpenConext-engineblock-4.2.7/www/profile/\nOpenConext-engineblock-4.2.7/www/profile/media\nOpenConext-engineblock-4.2.7/www/profile/favicon.ico\nOpenConext-engineblock-4.2.7/www/profile/javascript\nOpenConext-engineblock-4.2.7/www/profile/css\nOpenConext-engineblock-4.2.7/www/profile/index.php\nOpenConext-engineblock-4.2.7/www/profile/robots.txt\n",
"rc": 1,
"unarchived": false
},
"dest": "/tmp/",
"extract_results": {
"cmd": "/bin/tar -xzf \"/tmp/OpenConext-engineblock-4.2.7.tar.gz\"",
"err": "/bin/tar: OpenConext-engineblock-4.2.7/vendor/zendframework/zendframework1/tests/Zend/OpenId/ProviderTest.php: Wrote only 6144 of 10240 bytes\n/bin/tar: OpenConext-engineblock-4.2.7/vendor/zendframework/zendframework1/tests/Zend/OpenId/Consumer: Cannot mkdir: No space left on device\n/bin/tar: OpenConext-engineblock-4.2.7/vendor/zendframework/zendframework1/tests/Zend/OpenId/Consumer/Storage: Cannot mkdir: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/vendor/zendframework/zendframework1/tests/Zend/OpenId/Consumer/Storage/FileTest.php: Cannot open: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/vendor/zendframework/zendframework1/tests/Zend/OpenId/Extension: Cannot mkdir: No space left on device\n/bin/tar: OpenConext-engineblock-4.2.7/vendor/zendframework/zendframework1/tests/Zend/OpenId/Extension/SregTest.php: Cannot open: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/vendor/zendframework/zendframework1/tests/Zend/OpenId/Provider: Cannot mkdir: No space left on device\n/bin/tar: OpenConext-engineblock-4.2.7/vendor/zendframework/zendframework1/tests/Zend/OpenId/Provider/Storage: Cannot mkdir: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/vendor/zendframework/zendframework1/tests/Zend/OpenId/Provider/Storage/FileTest.php: Cannot open: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/vendor/zendframework/zendframework1/tests/Zend/OpenId/Provider/User: Cannot mkdir: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/vendor/zendframework/zendframework1/tests/Zend/OpenId/Provider/User/SessionTest.php: Cannot open: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/vendor/zendframework/zendframework1/tests/Zend/OpenId/AllTests.php: Cannot write: No space left on device\n/bin/tar: OpenConext-engineblock-4.2.7/vendor/zendframework/zendframework1/tests/Zend/File: Cannot mkdir: No space left on device\n/bin/tar: OpenConext-engineblock-4.2.7/vendor/zendframework/zendframework1/tests/Zend/File/TestAsset: Cannot mkdir: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/vendor/zendframework/zendframework1/tests/Zend/File/TestAsset/MultipleClassesInMultipleNamespaces.php: Cannot open: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/vendor/zendframework/zendframework1/tests/Zend/File/TestAsset/LocatorShouldFindThis.php: Cannot open: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/vendor/zendframework/zendframework1/tests/Zend/File/_files: Cannot mkdir: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/vendor/zendframework/zendframework1/tests/Zend/File/_files/locator-should-skip-this.php: Cannot open: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/vendor/zendframework/zendframework1/tests/Zend/File/_files/locator-should-skip-this.xml: Cannot open: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/vendor/zendframework/zendframework1/tests/Zend/File/ClassFileLocatorTest.php: Cannot open: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/vendor/zendframework/zendframework1/tests/Zend/File/Transfer: Cannot mkdir: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/vendor/zendframework/zendframework1/tests/Zend/File/Transfer/Adapter: Cannot mkdir: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/vendor/zendframework/zendframework1/tests/Zend/File/Transfer/Adapter/_files: Cannot mkdir: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/vendor/zendframework/zendframework1/tests/Zend/File/Transfer/Adapter/_files/file2
.... SNIP PAGES AND PAGES OF OUTPUT ...
ss: Cannot open: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/www/authentication/css/wide: Cannot mkdir: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/www/authentication/css/wide/screen_ie.css: Cannot open: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/www/authentication/css/wide/screen.css: Cannot open: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/www/authentication/index.php: Cannot open: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/www/authentication/generated: Cannot mkdir: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/www/authentication/generated/js: Cannot mkdir: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/www/authentication/generated/js/1411979426: Cannot mkdir: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/www/authentication/generated/js/1411979426/js.min.js: Cannot open: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/www/authentication/generated/css: Cannot mkdir: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/www/authentication/generated/css/1411979426: Cannot mkdir: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/www/authentication/generated/css/1411979426/css.min.css: Cannot open: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/www/authentication/robots.txt: Cannot open: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/www/profile: Cannot mkdir: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/www/profile/media: Cannot open: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/www/profile/favicon.ico: Cannot open: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/www/profile/javascript: Cannot open: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/www/profile/css: Cannot open: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/www/profile/index.php: Cannot open: No such file or directory\n/bin/tar: OpenConext-engineblock-4.2.7/www/profile/robots.txt: Cannot open: No such file or directory\n/bin/tar: Exiting with failure status due to previous errors\n",
"out": "",
"rc": 2
},
"failed": true,
"gid": 0,
"group": "root",
"handler": "TgzFile",
"mode": "01777",
"msg": "failed to unpack /tmp/OpenConext-engineblock-4.2.7.tar.gz to /tmp/",
"owner": "root",
"size": 270336,
"src": "/tmp/OpenConext-engineblock-4.2.7.tar.gz",
"state": "directory",
"uid": 0
}
I expect to see the failing 'extract' first, the diff second.
Instead I saw the diff first which gave confusing output.
Issue Type:
What kind of ticket is this? “Documentation Report”
Ansible Version:
1.7.2 development
Environment:
What OS are you running Ansible from and what OS are you managing? Ubuntu 12.04
Summary:
The stat module exposes many attributes available via the stat function in the Python os module, and some additional attributes. These attributes should be mentioned in the documentation of the stat module. The attributes pw_name and isdir were used in the examples. I had to go to the source for the stat module to find the other attributes.
Here is what I would like to see added to the end of ansible/library/files/stat's DOCUMENTATION string. The only ones that I'm unsure about are pw_name, isgid and isuid.
returns: a stat object with the following attributes:
atime - last access time
ctime - last creation time
dev - path's device
exists - true if the file exists
gid - path's group id
inode - path's inode
isblk - true if path is a block device
ischr - true if path is a character device
isdir - true if path is a directory
isfifo - true if path is a fifo (a.k.a. named pipe)
isgid - invoking group's id matches path's group id
islnk - true if path is a symbolic link
isreg - true if path is a regular file
issock - true if path is a socket (a.k.a. UNIX Domain Socket)
isuid - invoking user's id matches path's user id
lnk_source - where path links to
md5 - md5 checksum for path
mode - the mode of path in 4 octal digits
mtime - last modification time
nlink - number of hard links to this path
pw_name - owner of path
rgrp - path mode: group read
roth - path mode: other read
rusr - path mode: user read
size - size of path
uid - path's user id
wgrp - path mode: group write
woth - path mode: other write
wusr - path mode: user write
xgrp - path mode: group execute
xoth - path mode: other execute
xusr - path mode: user execute
Steps To Reproduce:
Look at the stat module's documentation.
Expected Results:
More detail in the documentation without having to look at the stat module's source code.
Actual Results:
N/A
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.