updated guides to avoid connection: local (#44227)

- want they really need is `delegate_to: localhost`
 - also reduced 'local_action' usage in favor of same
pull/44778/head
Brian Coca 6 years ago committed by GitHub
parent ed22efb2a6
commit 893d59fabe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -234,7 +234,6 @@ Ansible playbook.
- Add the following to the new playbook file:: - Add the following to the new playbook file::
- name: test my new module - name: test my new module
connection: local
hosts: localhost hosts: localhost
tasks: tasks:
- name: run the new module - name: run the new module

@ -74,9 +74,9 @@ and fulfill the missing data by either setting ENV variables or tasks params:
--- ---
- name: provision our VMs - name: provision our VMs
hosts: cloud-vm hosts: cloud-vm
connection: local
tasks: tasks:
- name: ensure VMs are created and running - name: ensure VMs are created and running
delegate_to: localhost
cs_instance: cs_instance:
api_key: your api key api_key: your api key
api_secret: your api secret api_secret: your api secret
@ -111,10 +111,11 @@ By passing the argument ``api_region`` with the CloudStack modules, the region w
.. code-block:: yaml .. code-block:: yaml
- name: ensure my ssh public key exists on Exoscale - name: ensure my ssh public key exists on Exoscale
local_action: cs_sshkeypair cs_sshkeypair:
name: my-ssh-key name: my-ssh-key
public_key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}" public_key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
api_region: exoscale api_region: exoscale
delegate_to: localhost
Or by looping over a regions list if you want to do the task in every region: Or by looping over a regions list if you want to do the task in every region:
@ -144,20 +145,19 @@ Below you see an example how it can be used in combination with Ansible's block
tasks: tasks:
- block: - block:
- name: ensure my ssh public key - name: ensure my ssh public key
local_action: cs_sshkeypair:
module: cs_sshkeypair
name: my-ssh-key name: my-ssh-key
public_key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}" public_key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
- name: ensure my ssh public key - name: ensure my ssh public key
local_action: cs_instance:
module: cs_instance:
display_name: "{{ inventory_hostname_short }}" display_name: "{{ inventory_hostname_short }}"
template: Linux Debian 7 64-bit 20GB Disk template: Linux Debian 7 64-bit 20GB Disk
service_offering: "{{ cs_offering }}" service_offering: "{{ cs_offering }}"
ssh_key: my-ssh-key ssh_key: my-ssh-key
state: running state: running
delegate_to: localhost
environment: environment:
CLOUDSTACK_DOMAIN: root/customers CLOUDSTACK_DOMAIN: root/customers
CLOUDSTACK_PROJECT: web-app CLOUDSTACK_PROJECT: web-app
@ -241,28 +241,30 @@ Now to the fun part. We create a playbook to create our infrastructure we call i
--- ---
- name: provision our VMs - name: provision our VMs
hosts: cloud-vm hosts: cloud-vm
connection: local
tasks: tasks:
- name: ensure VMs are created and running - name: run all enclosed tasks from localhost
cs_instance: delegate_to: localhost
name: "{{ inventory_hostname_short }}" block:
template: Linux Debian 7 64-bit 20GB Disk - name: ensure VMs are created and running
service_offering: "{{ cs_offering }}" cs_instance:
state: running name: "{{ inventory_hostname_short }}"
template: Linux Debian 7 64-bit 20GB Disk
- name: ensure firewall ports opened service_offering: "{{ cs_offering }}"
cs_firewall: state: running
ip_address: "{{ public_ip }}"
port: "{{ item.port }}" - name: ensure firewall ports opened
cidr: "{{ item.cidr | default('0.0.0.0/0') }}" cs_firewall:
loop: "{{ cs_firewall }}" ip_address: "{{ public_ip }}"
when: public_ip is defined port: "{{ item.port }}"
cidr: "{{ item.cidr | default('0.0.0.0/0') }}"
- name: ensure static NATs loop: "{{ cs_firewall }}"
cs_staticnat: vm="{{ inventory_hostname_short }}" ip_address="{{ public_ip }}" when: public_ip is defined
when: public_ip is defined
- name: ensure static NATs
In the above play we defined 3 tasks and use the group ``cloud-vm`` as target to handle all VMs in the cloud but instead SSH to these VMs, we use ``connection=local`` to execute the API calls locally from our workstation. cs_staticnat: vm="{{ inventory_hostname_short }}" ip_address="{{ public_ip }}"
when: public_ip is defined
In the above play we defined 3 tasks and use the group ``cloud-vm`` as target to handle all VMs in the cloud but instead SSH to these VMs, we use ``delegate_to: localhost`` to execute the API calls locally from our workstation.
In the first task, we ensure we have a running VM created with the Debian template. If the VM is already created but stopped, it would just start it. If you like to change the offering on an existing VM, you must add ``force: yes`` to the task, which would stop the VM, change the offering and start the VM again. In the first task, we ensure we have a running VM created with the Debian template. If the VM is already created but stopped, it would just start it. If you like to change the offering on an existing VM, you must add ``force: yes`` to the task, which would stop the VM, change the offering and start the VM again.
@ -316,7 +318,6 @@ The playbook looks like the following:
--- ---
- name: cloud base setup - name: cloud base setup
hosts: localhost hosts: localhost
connection: local
tasks: tasks:
- name: upload ssh public key - name: upload ssh public key
cs_sshkeypair: cs_sshkeypair:
@ -349,26 +350,27 @@ The playbook looks like the following:
- name: install VMs in the cloud - name: install VMs in the cloud
hosts: cloud-vm hosts: cloud-vm
connection: local
tasks: tasks:
- name: create and run VMs on CloudStack - delegate_to: localhost
cs_instance: block:
name: "{{ inventory_hostname_short }}" - name: create and run VMs on CloudStack
template: Linux Debian 7 64-bit 20GB Disk cs_instance:
service_offering: "{{ cs_offering }}" name: "{{ inventory_hostname_short }}"
security_groups: "{{ cs_securitygroups }}" template: Linux Debian 7 64-bit 20GB Disk
ssh_key: defaultkey service_offering: "{{ cs_offering }}"
state: Running security_groups: "{{ cs_securitygroups }}"
register: vm ssh_key: defaultkey
state: Running
- name: show VM IP register: vm
debug: msg="VM {{ inventory_hostname }} {{ vm.default_ip }}"
- name: show VM IP
- name: assign IP to the inventory debug: msg="VM {{ inventory_hostname }} {{ vm.default_ip }}"
set_fact: ansible_ssh_host={{ vm.default_ip }}
- name: assign IP to the inventory
- name: waiting for SSH to come up set_fact: ansible_ssh_host={{ vm.default_ip }}
wait_for: port=22 host={{ vm.default_ip }} delay=5
- name: waiting for SSH to come up
wait_for: port=22 host={{ vm.default_ip }} delay=5
In the first play we setup the security groups, in the second play the VMs will created be assigned to these groups. Further you see, that we assign the public IP returned from the modules to the host inventory. This is needed as we do not know the IPs we will get in advance. In a next step you would configure the DNS servers with these IPs for accessing the VMs with their DNS name. In the first play we setup the security groups, in the second play the VMs will created be assigned to these groups. Further you see, that we assign the public IP returned from the modules to the host inventory. This is needed as we do not know the IPs we will get in advance. In a next step you would configure the DNS servers with these IPs for accessing the VMs with their DNS name.

@ -177,9 +177,8 @@ examples to get you started:
# Simple playbook to invoke with the above example: # Simple playbook to invoke with the above example:
- name: Test docker_inventory - name: Test docker_inventory, this will not connect to any hosts
hosts: all hosts: all
connection: local
gather_facts: no gather_facts: no
tasks: tasks:
- debug: msg="Container - {{ inventory_hostname }}" - debug: msg="Container - {{ inventory_hostname }}"

@ -24,20 +24,21 @@ package repositories, so you will likely need to install it via pip:
$ pip install pyrax $ pip install pyrax
The following steps will often execute from the control machine against the Rackspace Cloud API, so it makes sense Ansible creates an implicit localhost that executes in the same context as the ``ansible-playbook`` and the other CLI tools.
to add localhost to the inventory file. (Ansible may not require this manual step in the future): If for any reason you need or want to have it in your inventory you should do something like the following:
.. code-block:: ini .. code-block:: ini
[localhost] [localhost]
localhost ansible_connection=local localhost ansible_connection=local ansilbe_python_interpreter=/usr/local/bin/python2
For more information see :ref:`Implicit Localhost <implicit_localhost>`
In playbook steps, we'll typically be using the following pattern: In playbook steps, we'll typically be using the following pattern:
.. code-block:: yaml .. code-block:: yaml
- hosts: localhost - hosts: localhost
connection: local
gather_facts: False gather_facts: False
tasks: tasks:
@ -103,7 +104,7 @@ Here is a basic example of provisioning an instance in ad-hoc mode:
.. code-block:: bash .. code-block:: bash
$ ansible localhost -m rax -a "name=awx flavor=4 image=ubuntu-1204-lts-precise-pangolin wait=yes" -c local $ ansible localhost -m rax -a "name=awx flavor=4 image=ubuntu-1204-lts-precise-pangolin wait=yes"
Here's what it would look like in a playbook, assuming the parameters were defined in variables: Here's what it would look like in a playbook, assuming the parameters were defined in variables:
@ -111,8 +112,7 @@ Here's what it would look like in a playbook, assuming the parameters were defin
tasks: tasks:
- name: Provision a set of instances - name: Provision a set of instances
local_action: rax:
module: rax
name: "{{ rax_name }}" name: "{{ rax_name }}"
flavor: "{{ rax_flavor }}" flavor: "{{ rax_flavor }}"
image: "{{ rax_image }}" image: "{{ rax_image }}"
@ -120,14 +120,14 @@ Here's what it would look like in a playbook, assuming the parameters were defin
group: "{{ group }}" group: "{{ group }}"
wait: yes wait: yes
register: rax register: rax
delegate_to: localhost
The rax module returns data about the nodes it creates, like IP addresses, hostnames, and login passwords. By registering the return value of the step, it is possible used this data to dynamically add the resulting hosts to inventory (temporarily, in memory). This facilitates performing configuration actions on the hosts in a follow-on task. In the following example, the servers that were successfully created using the above task are dynamically added to a group called "raxhosts", with each nodes hostname, IP address, and root password being added to the inventory. The rax module returns data about the nodes it creates, like IP addresses, hostnames, and login passwords. By registering the return value of the step, it is possible used this data to dynamically add the resulting hosts to inventory (temporarily, in memory). This facilitates performing configuration actions on the hosts in a follow-on task. In the following example, the servers that were successfully created using the above task are dynamically added to a group called "raxhosts", with each nodes hostname, IP address, and root password being added to the inventory.
.. code-block:: yaml .. code-block:: yaml
- name: Add the instances we created (by public IP) to the group 'raxhosts' - name: Add the instances we created (by public IP) to the group 'raxhosts'
local_action: add_host:
module: add_host
hostname: "{{ item.name }}" hostname: "{{ item.name }}"
ansible_host: "{{ item.rax_accessipv4 }}" ansible_host: "{{ item.rax_accessipv4 }}"
ansible_ssh_pass: "{{ item.rax_adminpass }}" ansible_ssh_pass: "{{ item.rax_adminpass }}"
@ -303,11 +303,11 @@ This can be achieved with the ``rax_facts`` module and an inventory file similar
gather_facts: False gather_facts: False
tasks: tasks:
- name: Get facts about servers - name: Get facts about servers
local_action: rax_facts:
module: rax_facts
credentials: ~/.raxpub credentials: ~/.raxpub
name: "{{ inventory_hostname }}" name: "{{ inventory_hostname }}"
region: "{{ rax_region }}" region: "{{ rax_region }}"
delegate_to: localhost
- name: Map some facts - name: Map some facts
set_fact: set_fact:
ansible_host: "{{ rax_accessipv4 }}" ansible_host: "{{ rax_accessipv4 }}"
@ -418,21 +418,19 @@ Create an isolated cloud network and build a server
- name: Build Servers on an Isolated Network - name: Build Servers on an Isolated Network
hosts: localhost hosts: localhost
connection: local
gather_facts: False gather_facts: False
tasks: tasks:
- name: Network create request - name: Network create request
local_action: rax_network:
module: rax_network
credentials: ~/.raxpub credentials: ~/.raxpub
label: my-net label: my-net
cidr: 192.168.3.0/24 cidr: 192.168.3.0/24
region: IAD region: IAD
state: present state: present
delegate_to: localhost
- name: Server create request - name: Server create request
local_action: rax:
module: rax
credentials: ~/.raxpub credentials: ~/.raxpub
name: web%04d.example.org name: web%04d.example.org
flavor: 2 flavor: 2
@ -449,6 +447,7 @@ Create an isolated cloud network and build a server
wait: yes wait: yes
wait_timeout: 360 wait_timeout: 360
register: rax register: rax
delegate_to: localhost
.. _complete_environment: .. _complete_environment:
@ -462,12 +461,10 @@ Build a complete webserver environment with servers, custom networks and load ba
--- ---
- name: Build environment - name: Build environment
hosts: localhost hosts: localhost
connection: local
gather_facts: False gather_facts: False
tasks: tasks:
- name: Load Balancer create request - name: Load Balancer create request
local_action: rax_clb:
module: rax_clb
credentials: ~/.raxpub credentials: ~/.raxpub
name: my-lb name: my-lb
port: 80 port: 80
@ -483,8 +480,7 @@ Build a complete webserver environment with servers, custom networks and load ba
register: clb register: clb
- name: Network create request - name: Network create request
local_action: rax_network:
module: rax_network
credentials: ~/.raxpub credentials: ~/.raxpub
label: my-net label: my-net
cidr: 192.168.3.0/24 cidr: 192.168.3.0/24
@ -493,8 +489,7 @@ Build a complete webserver environment with servers, custom networks and load ba
register: network register: network
- name: Server create request - name: Server create request
local_action: rax:
module: rax
credentials: ~/.raxpub credentials: ~/.raxpub
name: web%04d.example.org name: web%04d.example.org
flavor: performance1-1 flavor: performance1-1
@ -513,8 +508,7 @@ Build a complete webserver environment with servers, custom networks and load ba
register: rax register: rax
- name: Add servers to web host group - name: Add servers to web host group
local_action: add_host:
module: add_host
hostname: "{{ item.name }}" hostname: "{{ item.name }}"
ansible_host: "{{ item.rax_accessipv4 }}" ansible_host: "{{ item.rax_accessipv4 }}"
ansible_ssh_pass: "{{ item.rax_adminpass }}" ansible_ssh_pass: "{{ item.rax_adminpass }}"
@ -524,8 +518,7 @@ Build a complete webserver environment with servers, custom networks and load ba
when: rax.action == 'create' when: rax.action == 'create'
- name: Add servers to Load balancer - name: Add servers to Load balancer
local_action: rax_clb_nodes:
module: rax_clb_nodes
credentials: ~/.raxpub credentials: ~/.raxpub
load_balancer_id: "{{ clb.balancer.id }}" load_balancer_id: "{{ clb.balancer.id }}"
address: "{{ item.rax_networks.private|first }}" address: "{{ item.rax_networks.private|first }}"
@ -578,12 +571,10 @@ Using a Control Machine
- name: Create an exact count of servers - name: Create an exact count of servers
hosts: localhost hosts: localhost
connection: local
gather_facts: False gather_facts: False
tasks: tasks:
- name: Server build requests - name: Server build requests
local_action: rax:
module: rax
credentials: ~/.raxpub credentials: ~/.raxpub
name: web%03d.example.org name: web%03d.example.org
flavor: performance1-1 flavor: performance1-1
@ -598,8 +589,7 @@ Using a Control Machine
register: rax register: rax
- name: Add servers to in memory groups - name: Add servers to in memory groups
local_action: add_host:
module: add_host
hostname: "{{ item.name }}" hostname: "{{ item.name }}"
ansible_host: "{{ item.rax_accessipv4 }}" ansible_host: "{{ item.rax_accessipv4 }}"
ansible_ssh_pass: "{{ item.rax_adminpass }}" ansible_ssh_pass: "{{ item.rax_adminpass }}"
@ -613,37 +603,38 @@ Using a Control Machine
hosts: new_web hosts: new_web
gather_facts: false gather_facts: false
tasks: tasks:
- name: Wait for rackconnnect automation to complete - name: ensure we run all tasks from localhost
local_action: delegate_to: localhost
module: rax_facts block:
credentials: ~/.raxpub - name: Wait for rackconnnect automation to complete
id: "{{ rax_id }}" rax_facts:
region: DFW credentials: ~/.raxpub
register: rax_facts id: "{{ rax_id }}"
until: rax_facts.ansible_facts['rax_metadata']['rackconnect_automation_status']|default('') == 'DEPLOYED' region: DFW
retries: 30 register: rax_facts
delay: 10 until: rax_facts.ansible_facts['rax_metadata']['rackconnect_automation_status']|default('') == 'DEPLOYED'
retries: 30
- name: Wait for managed cloud automation to complete delay: 10
local_action:
module: rax_facts - name: Wait for managed cloud automation to complete
credentials: ~/.raxpub rax_facts:
id: "{{ rax_id }}" credentials: ~/.raxpub
region: DFW id: "{{ rax_id }}"
register: rax_facts region: DFW
until: rax_facts.ansible_facts['rax_metadata']['rax_service_level_automation']|default('') == 'Complete' register: rax_facts
retries: 30 until: rax_facts.ansible_facts['rax_metadata']['rax_service_level_automation']|default('') == 'Complete'
delay: 10 retries: 30
delay: 10
- name: Update new_web hosts with IP that RackConnect assigns - name: Update new_web hosts with IP that RackConnect assigns
hosts: new_web hosts: new_web
gather_facts: false gather_facts: false
tasks: tasks:
- name: Get facts about servers - name: Get facts about servers
local_action: rax_facts:
module: rax_facts
name: "{{ inventory_hostname }}" name: "{{ inventory_hostname }}"
region: DFW region: DFW
delegate_to: localhost
- name: Map some facts - name: Map some facts
set_fact: set_fact:
ansible_host: "{{ rax_accessipv4 }}" ansible_host: "{{ rax_accessipv4 }}"
@ -668,45 +659,46 @@ Using Ansible Pull
--- ---
- name: Ensure Rackconnect and Managed Cloud Automation is complete - name: Ensure Rackconnect and Managed Cloud Automation is complete
hosts: all hosts: all
connection: local
tasks: tasks:
- name: Check for completed bootstrap - name: ensure we run all tasks from localhost
stat: delegate_to: localhost
path: /etc/bootstrap_complete block:
register: bootstrap - name: Check for completed bootstrap
stat:
- name: Get region path: /etc/bootstrap_complete
command: xenstore-read vm-data/provider_data/region register: bootstrap
register: rax_region
when: bootstrap.stat.exists != True - name: Get region
command: xenstore-read vm-data/provider_data/region
- name: Wait for rackconnect automation to complete register: rax_region
uri: when: bootstrap.stat.exists != True
url: "https://{{ rax_region.stdout|trim }}.api.rackconnect.rackspace.com/v1/automation_status?format=json"
return_content: yes - name: Wait for rackconnect automation to complete
register: automation_status uri:
when: bootstrap.stat.exists != True url: "https://{{ rax_region.stdout|trim }}.api.rackconnect.rackspace.com/v1/automation_status?format=json"
until: automation_status['automation_status']|default('') == 'DEPLOYED' return_content: yes
retries: 30 register: automation_status
delay: 10 when: bootstrap.stat.exists != True
until: automation_status['automation_status']|default('') == 'DEPLOYED'
- name: Wait for managed cloud automation to complete retries: 30
wait_for: delay: 10
path: /tmp/rs_managed_cloud_automation_complete
delay: 10 - name: Wait for managed cloud automation to complete
when: bootstrap.stat.exists != True wait_for:
path: /tmp/rs_managed_cloud_automation_complete
- name: Set bootstrap completed delay: 10
file: when: bootstrap.stat.exists != True
path: /etc/bootstrap_complete
state: touch - name: Set bootstrap completed
owner: root file:
group: root path: /etc/bootstrap_complete
mode: 0400 state: touch
owner: root
group: root
mode: 0400
- name: Base Configure Servers - name: Base Configure Servers
hosts: all hosts: all
connection: local
roles: roles:
- role: users - role: users
@ -725,7 +717,6 @@ Using Ansible Pull with XenStore
--- ---
- name: Ensure Rackconnect and Managed Cloud Automation is complete - name: Ensure Rackconnect and Managed Cloud Automation is complete
hosts: all hosts: all
connection: local
tasks: tasks:
- name: Check for completed bootstrap - name: Check for completed bootstrap
stat: stat:
@ -776,7 +767,6 @@ Using Ansible Pull with XenStore
- name: Base Configure Servers - name: Base Configure Servers
hosts: all hosts: all
connection: local
roles: roles:
- role: users - role: users

@ -70,7 +70,6 @@ In this use case / example, we will be selecting a virtual machine template and
--- ---
- name: Create a VM from a template - name: Create a VM from a template
hosts: localhost hosts: localhost
connection: local
gather_facts: no gather_facts: no
tasks: tasks:
- name: Clone the template - name: Clone the template

Loading…
Cancel
Save