패턴은 변수를 대체할 수 있음: {{foo}}, wildcards: *.example.com,
정규식도 포함됨: ~(web|db).*\.example\.com
'INI-file
' structure, blocks define groups. Hosts alowed in more than one group. Non-standard SSH port can follow hostname seperated by ':'
(but see also ansible_ssh_port below).
Hostname ranges: www[01:50].example.com, db-[a:f].example.com
Per-host variables: foo.example.com foo=bar baz=wibble
[foo:children]
: new group foo contaning all members if included groups[foo:vars]
: variable definitions for all members of group foo
YAML; given inventory file at …/hosts
:
…group_vars/foo
: variable definitions for all members of group foo…host_vars/foo.example.com
: variable definitions for foo.example.comPlaybooks are a YAML list of one or more plays. Plays look like this - most (all?) keys are optional:
--- - include: playbook.yml - name: example hosts: webservers gather_facts: no vars: http_port: 80 vars_file: - "vars.yml" - [ "try-first.yml", "try-second-.yml" ] vars_prompt: - name: "my_password2" prompt: "Enter password2" default: "secret" private: yes encrypt: "md5_crypt" confirm: yes salt_size: 7 remote_user: root sudo: yes sudo_user: postgress pre_tasks: - shell: echo 'pre' - <more tasks> roles: - common - { role: foo, dir: '/opt/a', port: 5000, when: "bar == 'Baz'" } - <more roles> tasks: - include: tasks.yml foo=bar baz=wibble - include: other-tasks.yml - name: example task vars: foo: bar baz: - one - two template: src=template.j2 dest=/etc/foo.conf when: ansible_os_family == "Debian" register: var notify: - restart apache remote_user: apache sudo: yes ignore_errors: True - <more tasks> post_tasks: - shell: echo 'post' - <more tasks> handlers: - include: handlers.yml - name: restart apache service: name=httpd state=restarted - <more handlers> - <more plays>
List all installed modules with
ansible-doc --list
Document a particular module with
ansible-doc <module>
Show playbook snippet for specified module
ansible-doc -i <module>
Names: letters, digits, underscores; starting with a letter.
{{ var }}
{{ var["key1"]["key2"]}}
{{ var.key1.key2 }}
{{ list[0] }}
--extra-vars
on the command linevars
component of a playbookvars_file
in a playbook/etc/ansible/facts.d/filename.fact
on managed machines (sets variables with `ansible_local.filename. prefix)register
: in taskshostvars
(e.g. hostvars[other.example.com][…])group_names
(groups containing current host)groups
(all groups and hosts in the inventory)inventory_hostname
(current host as in inventory)inventory_hostname_short
(first component of inventory_hostname)play_hosts
(hostnames in scope for current play)inventory_dir
(location of the inventory)inventoty_file
(name of the inventory)
Run ansible hostname -m setup
, but in particular:
See also default jinja2 filters. In YAML, values starting {
must be quoted.
when:
var == “Vaue”
, var >= 5
, etc.var
, where var
coreces to boolean (yes, true, True, TRUE)var is defined
, var is not defined
<condition1> and <condition2>
(also or?)
Combined with with_items
, the when statement is processed for each item.
when
can also be applied to includes and roles.
- user: name={{ item }} state=present groups=wheel with_items: - testuser1 - testuser2 with_items: - { name: 'testuser1', groups: 'wheel' } - { name: 'testuser2', groups: 'root' } with_items: somelist
- mysql_user: name={{ item[0] }} priv={{ item[1] }}.*:ALL append_privs=yes password=foo with_nested: - [ 'alice', 'bob', 'eve' ] - [ 'clientdb', 'employeedb', 'providerdb' ]
Given
--- users: alice: name: Alice Appleworth telephone: 123-456-7890 bob: name: Bob Bananarama telephone: 987-654-3210 tasks: - name: Print phone records debug: msg="User {{ item.key }} is {{ item.value.name }} ({{ item.value.telephone }})" with_dict: users
- copy: src={{ item }} dest=/etc/fooapp/ owner=root mode=600 with_fileglob: - /playbooks/files/fooapp/*
(see example for authorized_key module)
- authorized_key: user=deploy key="{{ item }}" with_file: - public_keys/doe-jane - public_keys/doe-john
Given
--- alpha: [ 'a', 'b', 'c', 'd' ] numbers: [ 1, 2, 3, 4 ] - debug: msg="{{ item.0 }} and {{ item.1 }}" with_together: - alpha - numbers
Given
--- users: - name: alice authorized: - /tmp/alice/onekey.pub - /tmp/alice/twokey.pub - name: bob authorized: - /tmp/bob/id_rsa.pub - authorized_key: "user={{ item.0.name }} key='{{ lookup('file', item.1) }}'" with_subelements: - users - authorized
Decimal, hexadecimal (0x3f8) or octal (0600)
- user: name={{ item }} state=present groups=evens with_sequence: start=0 end=32 format=testuser%02x with_sequence: start=4 end=16 stride=2 with_sequence: count=4
- debug: msg={{ item }} with_random_choice: - "go through the door" - "drink from the goblet" - "press the red button" - "do nothing"
- action: shell /usr/bin/foo register: result until: result.stdout.find("all systems go") != -1 retries: 5 delay: 10
- name: Example of looping over a command result shell: /usr/bin/frobnicate {{ item }} with_lines: /usr/bin/frobnications_per_host --param {{ inventory_hostname }}
- name: indexed loop demo debug: msg="at array position {{ item.0 }} there is a value {{ item.1 }}" with_indexed_items: some_list
--- # file: roles/foo/vars/main.yml packages_base: - [ 'foo-package', 'bar-package' ] packages_apps: - [ ['one-package', 'two-package' ]] - [ ['red-package'], ['blue-package']] - name: flattened loop demo yum: name={{ item }} state=installed with_flattened: - packages_base - packages_apps
- name: template a file template: src={{ item }} dest=/etc/myapp/foo.conf with_first_found: - files: - {{ ansible_distribution }}.conf - default.conf paths: - search_location_one/somedir/ - /opt/other_location/somedir/
Directory structure:
playbook.yml roles/ common/ tasks/ main.yml handlers/ main.yml vars/ main.yml meta/ main.yml defaults/ main.yml files/ templates/
See documentation for role dependancies.
Both plays and tasks support a âx128x156tags:âx128x157 attribute.
- template: src=templates/src.j2 dest=/etc/foo.conf tags: - configuration
Tags can be applied to roles and includes (effectivly taggaing all included tasks)
roles: - { role: webserver, port: 5000, tags: [ 'web', 'foo' ] } - include: foo.yml tags=web,foo
To select by tag:
ansible-playbook example.yml --tags "configuration,packages" ansible-playbook example.yml --skip-tags "notification"
Usage: ansible <host-pattern> [options] Options: -a MODULE_ARGS, --args=MODULE_ARGS module arguments -k, --ask-pass ask for SSH password --ask-su-pass ask for su password -K, --ask-sudo-pass ask for sudo password --ask-vault-pass ask for vault password -B SECONDS, --background=SECONDS run asynchronously, failing after X seconds (default=N/A) -C, --check don't make any changes; instead, try to predict some of the changes that may occur -c CONNECTION, --connection=CONNECTION connection type to use (default=smart) -f FORKS, --forks=FORKS specify number of parallel processes to use (default=5) -h, --help show this help message and exit -i INVENTORY, --inventory-file=INVENTORY specify inventory host file (default=/etc/ansible/hosts) -l SUBSET, --limit=SUBSET further limit selected hosts to an additional pattern --list-hosts outputs a list of matching hosts; does not execute anything else -m MODULE_NAME, --module-name=MODULE_NAME module name to execute (default=command) -M MODULE_PATH, --module-path=MODULE_PATH specify path(s) to module library (default=/usr/share/ansible) -o, --one-line condense output -P POLL_INTERVAL, --poll=POLL_INTERVAL set the poll interval if using -B (default=15) --private-key=PRIVATE_KEY_FILE use this file to authenticate the connection -S, --su run operations with su -R SU_USER, --su-user=SU_USER run operations with su as this user (default=root) -s, --sudo run operations with sudo (nopasswd) -U SUDO_USER, --sudo-user=SUDO_USER desired sudo user (default=root) -T TIMEOUT, --timeout=TIMEOUT override the SSH timeout in seconds (default=10) -t TREE, --tree=TREE log output to this directory -u REMOTE_USER, --user=REMOTE_USER connect as this user (default=jw35) --vault-password-file=VAULT_PASSWORD_FILE vault password file -v, --verbose verbose mode (-vvv for more, -vvvv to enable connection debugging) --version show program's version number and exit
Usage: ansible-playbook playbook.yml Options: -k, --ask-pass ask for SSH password --ask-su-pass ask for su password -K, --ask-sudo-pass ask for sudo password --ask-vault-pass ask for vault password -C, --check don't make any changes; instead, try to predict some of the changes that may occur -c CONNECTION, --connection=CONNECTION connection type to use (default=smart) -D, --diff when changing (small) files and templates, show the differences in those files; works great with --check -e EXTRA_VARS, --extra-vars=EXTRA_VARS set additional variables as key=value or YAML/JSON -f FORKS, --forks=FORKS specify number of parallel processes to use (default=5) -h, --help show this help message and exit -i INVENTORY, --inventory-file=INVENTORY specify inventory host file (default=/etc/ansible/hosts) -l SUBSET, --limit=SUBSET further limit selected hosts to an additional pattern --list-hosts outputs a list of matching hosts; does not execute anything else --list-tasks list all tasks that would be executed -M MODULE_PATH, --module-path=MODULE_PATH specify path(s) to module library (default=/usr/share/ansible) --private-key=PRIVATE_KEY_FILE use this file to authenticate the connection --skip-tags=SKIP_TAGS only run plays and tasks whose tags do not match these values --start-at-task=START_AT start the playbook at the task matching this name --step one-step-at-a-time: confirm each task before running -S, --su run operations with su -R SU_USER, --su-user=SU_USER run operations with su as this user (default=root) -s, --sudo run operations with sudo (nopasswd) -U SUDO_USER, --sudo-user=SUDO_USER desired sudo user (default=root) --syntax-check perform a syntax check on the playbook, but do not execute it -t TAGS, --tags=TAGS only run plays and tasks tagged with these values -T TIMEOUT, --timeout=TIMEOUT override the SSH timeout in seconds (default=10) -u REMOTE_USER, --user=REMOTE_USER connect as this user (default=jw35) --vault-password-file=VAULT_PASSWORD_FILE vault password file -v, --verbose verbose mode (-vvv for more, -vvvv to enable connection debugging) --version show program's version number and exit
Usage: ansible-vault [create|decrypt|edit|encrypt|rekey] [--help] [options] file_name Options: -h, --help show this help message and exit See 'ansible-vault <command> --help' for more information on a specific command.
Usage: ansible-doc [options] [module...] Show Ansible module documentation Options: --version show program's version number and exit -h, --help show this help message and exit -M MODULE_PATH, --module-path=MODULE_PATH Ansible modules/ directory -l, --list List available modules -s, --snippet Show playbook snippet for specified module(s) -v Show version number and exit
Usage: ansible-galaxy [init|info|install|list|remove] [--help] [options] ... Options: -h, --help show this help message and exit See 'ansible-galaxy <command> --help' for more information on a specific command
Usage: ansible-pull [options] [playbook.yml] ansible-pull: error: URL for repository not specified, use -h for help