From f559b33f2f12a6bb445d0ba99f4b0128a0fa41d0 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Fri, 9 Jun 2017 14:05:58 +0200 Subject: [PATCH 01/90] template, main topics placed --- ansible.html.markdown | 660 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 660 insertions(+) create mode 100644 ansible.html.markdown diff --git a/ansible.html.markdown b/ansible.html.markdown new file mode 100644 index 0000000000..b03b04fb8d --- /dev/null +++ b/ansible.html.markdown @@ -0,0 +1,660 @@ +--- +category: tool +tool: git +contributors: + - ["Jakub Muszynski" , "http://github.com/sirkubax"] +filename: LearnAnsible.txt +--- + +Ansible is (one of the many) orchestration tools. It allows you to controll your environment (infrastructure and a code) and automate the manual tasks. +Ansible have great integration with multiple operating systems (even Windows using Power Shell) and some hardware (switches, Firewalls, etc). It has multiple tools that integrate with the could providers. Almost every worth-notice cloud provider is present in the ecosystem (AWS, Azure, Google, DigitalOcean, OVH, etc...) + +## Main cons and pros + +### Cons + +It is an agent-less tool - every agent consumes up to 16MB ram - in some environments, it may be noticable amount. +It is agent-less - you have to verify your environment consistency 'on-demand' - there is no built-in mechanism taht would warn you about some change automatically (this can be achieved with reasonable effort - but it must be known) + +### Pros + +It is an agent-less tools :) In most scenarios, it use ssh as a transport layer. +It is very-very-very easy to start. If you are familiar with ssh concept - you already know ansible :) (almost). My personal record is: 'I did show how to install and use ansible (for simple raspberry pi cluster management) and it tool me 30 seconds to deliver a working tool !!!)' +I do provide a training services - I'm able to teach a production-ready person - in 8 hours (1 training day)! It covers all needed to work aspects! No other tool can match this ease of use! +It executes when you do it - other tools (salt, puppet, chef - might execute in different scenario than you would expect) +Documentation is at the world-class standard! +The comunity (github, stackOverflow) would help you very fast. +Writing own modules and extension is fairly easy. + + +### Neutral +Migration Ansible<->Salt is failrly easy - so if you would need an event-driven agent environment - it would be a good choice to start quick with Ansible, and convert to salt when needed. + + +## Ansible naming and basic concept + +### Naming + +### ansible (run module (task)) + +### ansible-playbook (run set of tasks) + +### ansible-roles (a 'template-playbooks in right structure') + +### ansible - variables +lookup's + +### ansible-vault + +### inventory + +### dynamic inventory + +### Jinja2 and templates +jinja filters + +### ansible profiling - callback + +### facts-cache and ansible-cmdb + +### debugging ansible + +### Infrastructure as a code - what about Ansible +virtualenv + +### ansible - dynamic in AWS + +### create instance in AWS + +### create env in AWS + +## Bonus + +### writing own module + +### Python API + +### Web-UI: Ansible Tower, Jenkins, Rundeck + + +### Tips and tricks +AND,XOR +--check --diff +tags +meta +no_logs + +--- +Github template placeholder - to be removed + +### Centralized Versioning VS Distributed Versioning + +* Centralized version control focuses on synchronizing, tracking, and backing +up files. +* Distributed version control focuses on sharing changes. Every change has a +unique id. +* Distributed systems have no defined structure. You could easily have a SVN +style, centralized system, with git. + +[Additional Information](http://git-scm.com/book/en/Getting-Started-About-Version-Control) + +### Why Use Git? + +* Can work offline. +* Collaborating with others is easy! +* Branching is easy! +* Branching is fast! +* Merging is easy! +* Git is fast. +* Git is flexible. + +## Git Architecture + +### Repository + +A set of files, directories, historical records, commits, and heads. Imagine it +as a source code data structure, with the attribute that each source code +"element" gives you access to its revision history, among other things. + +A git repository is comprised of the .git directory & working tree. + +### .git Directory (component of repository) + +The .git directory contains all the configurations, logs, branches, HEAD, and +more. +[Detailed List.](http://gitready.com/advanced/2009/03/23/whats-inside-your-git-directory.html) + +### Working Tree (component of repository) + +This is basically the directories and files in your repository. It is often +referred to as your working directory. + +### Index (component of .git dir) + +The Index is the staging area in git. It's basically a layer that separates +your working tree from the Git repository. This gives developers more power +over what gets sent to the Git repository. + +### Commit + +A git commit is a snapshot of a set of changes, or manipulations to your +Working Tree. For example, if you added 5 files, and removed 2 others, these +changes will be contained in a commit (or snapshot). This commit can then be +pushed to other repositories, or not! + +### Branch + +A branch is essentially a pointer to the last commit you made. As you go on +committing, this pointer will automatically update to point the latest commit. + +### Tag + +A tag is a mark on specific point in history. Typically people use this +functionality to mark release points (v1.0, and so on) + +### HEAD and head (component of .git dir) + +HEAD is a pointer that points to the current branch. A repository only has 1 +*active* HEAD. +head is a pointer that points to any commit. A repository can have any number +of heads. + +### Stages of Git +* Modified - Changes have been made to a file but file has not been committed +to Git Database yet +* Staged - Marks a modified file to go into your next commit snapshot +* Committed - Files have been committed to the Git Database + +### Conceptual Resources + +* [Git For Computer Scientists](http://eagain.net/articles/git-for-computer-scientists/) +* [Git For Designers](http://hoth.entp.com/output/git_for_designers.html) + +## Commands + +### init + +Create an empty Git repository. The Git repository's settings, stored +information, and more is stored in a directory (a folder) named ".git". + +```bash +$ git init +``` + +### config + +To configure settings. Whether it be for the repository, the system itself, +or global configurations ( global config file is `~/.gitconfig` ). + +```bash +# Print & Set Some Basic Config Variables (Global) +$ git config --global user.email "MyEmail@Zoho.com" +$ git config --global user.name "My Name" +``` + +[Learn More About git config.](http://git-scm.com/docs/git-config) + +### help + +To give you quick access to an extremely detailed guide of each command. Or to +just give you a quick reminder of some semantics. + +```bash +# Quickly check available commands +$ git help + +# Check all available commands +$ git help -a + +# Command specific help - user manual +# git help +$ git help add +$ git help commit +$ git help init +# or git --help +$ git add --help +$ git commit --help +$ git init --help +``` + +### ignore files + +To intentionally untrack file(s) & folder(s) from git. Typically meant for +private & temp files which would otherwise be shared in the repository. +```bash +$ echo "temp/" >> .gitignore +$ echo "private_key" >> .gitignore +``` + +### status + +To show differences between the index file (basically your working copy/repo) +and the current HEAD commit. + +```bash +# Will display the branch, untracked files, changes and other differences +$ git status + +# To learn other "tid bits" about git status +$ git help status +``` + +### add + +To add files to the staging area/index. If you do not `git add` new files to +the staging area/index, they will not be included in commits! + +```bash +# add a file in your current working directory +$ git add HelloWorld.java + +# add a file in a nested dir +$ git add /path/to/file/HelloWorld.c + +# Regular Expression support! +$ git add ./*.java +``` + +This only adds a file to the staging area/index, it doesn't commit it to the +working directory/repo. + +### branch + +Manage your branches. You can view, edit, create, delete branches using this +command. + +```bash +# list existing branches & remotes +$ git branch -a + +# create a new branch +$ git branch myNewBranch + +# delete a branch +$ git branch -d myBranch + +# rename a branch +# git branch -m +$ git branch -m myBranchName myNewBranchName + +# edit a branch's description +$ git branch myBranchName --edit-description +``` + +### tag + +Manage your tags + +```bash +# List tags +$ git tag + +# Create a annotated tag +# The -m specifies a tagging message,which is stored with the tag. +# If you don’t specify a message for an annotated tag, +# Git launches your editor so you can type it in. +$ git tag -a v2.0 -m 'my version 2.0' + +# Show info about tag +# That shows the tagger information, the date the commit was tagged, +# and the annotation message before showing the commit information. +$ git show v2.0 + +# Push a single tag to remote +$ git push origin v2.0 + +# Push a lot of tags to remote +$ git push origin --tags +``` + +### checkout + +Updates all files in the working tree to match the version in the index, or +specified tree. + +```bash +# Checkout a repo - defaults to master branch +$ git checkout + +# Checkout a specified branch +$ git checkout branchName + +# Create a new branch & switch to it +# equivalent to "git branch ; git checkout " + +$ git checkout -b newBranch +``` + +### clone + +Clones, or copies, an existing repository into a new directory. It also adds +remote-tracking branches for each branch in the cloned repo, which allows you +to push to a remote branch. + +```bash +# Clone learnxinyminutes-docs +$ git clone https://github.com/adambard/learnxinyminutes-docs.git + +# shallow clone - faster cloning that pulls only latest snapshot +$ git clone --depth 1 https://github.com/adambard/learnxinyminutes-docs.git + +# clone only a specific branch +$ git clone -b master-cn https://github.com/adambard/learnxinyminutes-docs.git --single-branch +``` + +### commit + +Stores the current contents of the index in a new "commit." This commit +contains the changes made and a message created by the user. + +```bash +# commit with a message +$ git commit -m "Added multiplyNumbers() function to HelloWorld.c" + +# automatically stage modified or deleted files, except new files, and then commit +$ git commit -a -m "Modified foo.php and removed bar.php" + +# change last commit (this deletes previous commit with a fresh commit) +$ git commit --amend -m "Correct message" +``` + +### diff + +Shows differences between a file in the working directory, index and commits. + +```bash +# Show difference between your working dir and the index +$ git diff + +# Show differences between the index and the most recent commit. +$ git diff --cached + +# Show differences between your working dir and the most recent commit +$ git diff HEAD +``` + +### grep + +Allows you to quickly search a repository. + +Optional Configurations: + +```bash +# Thanks to Travis Jeffery for these +# Set line numbers to be shown in grep search results +$ git config --global grep.lineNumber true + +# Make search results more readable, including grouping +$ git config --global alias.g "grep --break --heading --line-number" +``` + +```bash +# Search for "variableName" in all java files +$ git grep 'variableName' -- '*.java' + +# Search for a line that contains "arrayListName" and, "add" or "remove" +$ git grep -e 'arrayListName' --and \( -e add -e remove \) +``` + +Google is your friend; for more examples +[Git Grep Ninja](http://travisjeffery.com/b/2012/02/search-a-git-repo-like-a-ninja) + +### log + +Display commits to the repository. + +```bash +# Show all commits +$ git log + +# Show only commit message & ref +$ git log --oneline + +# Show merge commits only +$ git log --merges + +# Show all commits represented by an ASCII graph +$ git log --graph +``` + +### merge + +"Merge" in changes from external commits into the current branch. + +```bash +# Merge the specified branch into the current. +$ git merge branchName + +# Always generate a merge commit when merging +$ git merge --no-ff branchName +``` + +### mv + +Rename or move a file + +```bash +# Renaming a file +$ git mv HelloWorld.c HelloNewWorld.c + +# Moving a file +$ git mv HelloWorld.c ./new/path/HelloWorld.c + +# Force rename or move +# "existingFile" already exists in the directory, will be overwritten +$ git mv -f myFile existingFile +``` + +### pull + +Pulls from a repository and merges it with another branch. + +```bash +# Update your local repo, by merging in new changes +# from the remote "origin" and "master" branch. +# git pull +$ git pull origin master + +# By default, git pull will update your current branch +# by merging in new changes from its remote-tracking branch +$ git pull + +# Merge in changes from remote branch and rebase +# branch commits onto your local repo, like: "git fetch , git +# rebase /" +$ git pull origin master --rebase +``` + +### push + +Push and merge changes from a branch to a remote & branch. + +```bash +# Push and merge changes from a local repo to a +# remote named "origin" and "master" branch. +# git push +$ git push origin master + +# By default, git push will push and merge changes from +# the current branch to its remote-tracking branch +$ git push + +# To link up current local branch with a remote branch, add -u flag: +$ git push -u origin master +# Now, anytime you want to push from that same local branch, use shortcut: +$ git push +``` + +### stash + +Stashing takes the dirty state of your working directory and saves it on a +stack of unfinished changes that you can reapply at any time. + +Let's say you've been doing some work in your git repo, but you want to pull +from the remote. Since you have dirty (uncommited) changes to some files, you +are not able to run `git pull`. Instead, you can run `git stash` to save your +changes onto a stack! + +```bash +$ git stash +Saved working directory and index state \ + "WIP on master: 049d078 added the index file" + HEAD is now at 049d078 added the index file + (To restore them type "git stash apply") +``` + +Now you can pull! + +```bash +git pull +``` +`...changes apply...` + +Now check that everything is OK + +```bash +$ git status +# On branch master +nothing to commit, working directory clean +``` + +You can see what "hunks" you've stashed so far using `git stash list`. +Since the "hunks" are stored in a Last-In-First-Out stack, our most recent +change will be at top. + +```bash +$ git stash list +stash@{0}: WIP on master: 049d078 added the index file +stash@{1}: WIP on master: c264051 Revert "added file_size" +stash@{2}: WIP on master: 21d80a5 added number to log +``` + +Now let's apply our dirty changes back by popping them off the stack. + +```bash +$ git stash pop +# On branch master +# Changes not staged for commit: +# (use "git add ..." to update what will be committed) +# +# modified: index.html +# modified: lib/simplegit.rb +# +``` + +`git stash apply` does the same thing + +Now you're ready to get back to work on your stuff! + +[Additional Reading.](http://git-scm.com/book/en/v1/Git-Tools-Stashing) + +### rebase (caution) + +Take all changes that were committed on one branch, and replay them onto +another branch. +*Do not rebase commits that you have pushed to a public repo*. + +```bash +# Rebase experimentBranch onto master +# git rebase +$ git rebase master experimentBranch +``` + +[Additional Reading.](http://git-scm.com/book/en/Git-Branching-Rebasing) + +### reset (caution) + +Reset the current HEAD to the specified state. This allows you to undo merges, +pulls, commits, adds, and more. It's a great command but also dangerous if you +don't know what you are doing. + +```bash +# Reset the staging area, to match the latest commit (leaves dir unchanged) +$ git reset + +# Reset the staging area, to match the latest commit, and overwrite working dir +$ git reset --hard + +# Moves the current branch tip to the specified commit (leaves dir unchanged) +# all changes still exist in the directory. +$ git reset 31f2bb1 + +# Moves the current branch tip backward to the specified commit +# and makes the working dir match (deletes uncommited changes and all commits +# after the specified commit). +$ git reset --hard 31f2bb1 +``` + +### reflog (caution) + +Reflog will list most of the git commands you have done for a given time period, +default 90 days. + +This give you the a change to reverse any git commands that have gone wrong +for instance if a rebase is has broken your application. + +You can do this: + +1. `git reflog` to list all of the git commands for the rebase +``` +38b323f HEAD@{0}: rebase -i (finish): returning to refs/heads/feature/add_git_reflog +38b323f HEAD@{1}: rebase -i (pick): Clarify inc/dec operators +4fff859 HEAD@{2}: rebase -i (pick): Update java.html.markdown +34ed963 HEAD@{3}: rebase -i (pick): [yaml/en] Add more resources (#1666) +ed8ddf2 HEAD@{4}: rebase -i (pick): pythonstatcomp spanish translation (#1748) +2e6c386 HEAD@{5}: rebase -i (start): checkout 02fb96d +``` +2. Select where to reset to, in our case its `2e6c386`, or `HEAD@{5}` +3. 'git reset --hard HEAD@{5}' this will reset your repo to that head +4. You can start the rebase again or leave it alone. + +[Additional Reading.](https://git-scm.com/docs/git-reflog) + +### revert + +Revert can be used to undo a commit. It should not be confused with reset which +restores the state of a project to a previous point. Revert will add a new +commit which is the inverse of the specified commit, thus reverting it. + +```bash +# Revert a specified commit +$ git revert +``` + +### rm + +The opposite of git add, git rm removes files from the current working tree. + +```bash +# remove HelloWorld.c +$ git rm HelloWorld.c + +# Remove a file from a nested dir +$ git rm /pather/to/the/file/HelloWorld.c +``` + +## Further Information + +* [tryGit - A fun interactive way to learn Git.](http://try.github.io/levels/1/challenges/1) + +* [Learn Git Branching - the most visual and interactive way to learn Git on the web](http://learngitbranching.js.org/) + +* [Udemy Git Tutorial: A Comprehensive Guide](https://blog.udemy.com/git-tutorial-a-comprehensive-guide/) + +* [Git Immersion - A Guided tour that walks through the fundamentals of git](http://gitimmersion.com/) + +* [git-scm - Video Tutorials](http://git-scm.com/videos) + +* [git-scm - Documentation](http://git-scm.com/docs) + +* [Atlassian Git - Tutorials & Workflows](https://www.atlassian.com/git/) + +* [SalesForce Cheat Sheet](http://res.cloudinary.com/hy4kyit2a/image/upload/SF_git_cheatsheet.pdf) + +* [GitGuys](http://www.gitguys.com/) + +* [Git - the simple guide](http://rogerdudler.github.io/git-guide/index.html) + +* [Pro Git](http://www.git-scm.com/book/en/v2) + +* [An introduction to Git and GitHub for Beginners (Tutorial)](http://product.hubspot.com/blog/git-and-github-tutorial-for-beginners) From d6468f27ea7abda52b9ed9fa4afa959c692aea3d Mon Sep 17 00:00:00 2001 From: sirkubax Date: Fri, 9 Jun 2017 14:07:58 +0200 Subject: [PATCH 02/90] tool name :) --- ansible.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index b03b04fb8d..f28abb68bf 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -1,6 +1,6 @@ --- category: tool -tool: git +tool: ansible contributors: - ["Jakub Muszynski" , "http://github.com/sirkubax"] filename: LearnAnsible.txt From cd21e6da04a5f9fcba49093984c03ffe6c0216dd Mon Sep 17 00:00:00 2001 From: sirkubax Date: Tue, 15 Aug 2017 21:44:20 +0200 Subject: [PATCH 03/90] add some lines --- ansible.html.markdown | 60 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index f28abb68bf..e074ed4410 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -7,7 +7,7 @@ filename: LearnAnsible.txt --- Ansible is (one of the many) orchestration tools. It allows you to controll your environment (infrastructure and a code) and automate the manual tasks. -Ansible have great integration with multiple operating systems (even Windows using Power Shell) and some hardware (switches, Firewalls, etc). It has multiple tools that integrate with the could providers. Almost every worth-notice cloud provider is present in the ecosystem (AWS, Azure, Google, DigitalOcean, OVH, etc...) +Ansible have great integration with multiple operating systems (even Windows) and some hardware (switches, Firewalls, etc). It has multiple tools that integrate with the could providers. Almost every worth-notice cloud provider is present in the ecosystem (AWS, Azure, Google, DigitalOcean, OVH, etc...) ## Main cons and pros @@ -15,10 +15,12 @@ Ansible have great integration with multiple operating systems (even Windows usi It is an agent-less tool - every agent consumes up to 16MB ram - in some environments, it may be noticable amount. It is agent-less - you have to verify your environment consistency 'on-demand' - there is no built-in mechanism taht would warn you about some change automatically (this can be achieved with reasonable effort - but it must be known) +Official GUI Tool (web inferface) - Ansible Tower - is more than GUI, but it is expensive. There is no 'small enterprice' payment plan. Easy workaround with Rundeck or Jenkins is possible with reasonable workload. ### Pros It is an agent-less tools :) In most scenarios, it use ssh as a transport layer. +In some way you can use it as 'bash on steroids'. It is very-very-very easy to start. If you are familiar with ssh concept - you already know ansible :) (almost). My personal record is: 'I did show how to install and use ansible (for simple raspberry pi cluster management) and it tool me 30 seconds to deliver a working tool !!!)' I do provide a training services - I'm able to teach a production-ready person - in 8 hours (1 training day)! It covers all needed to work aspects! No other tool can match this ease of use! It executes when you do it - other tools (salt, puppet, chef - might execute in different scenario than you would expect) @@ -30,12 +32,66 @@ Writing own modules and extension is fairly easy. ### Neutral Migration Ansible<->Salt is failrly easy - so if you would need an event-driven agent environment - it would be a good choice to start quick with Ansible, and convert to salt when needed. +## Basics on ansible + +Ansible uses ssh or paramiko as a transport layer. In a way you can imagine that you are using a ssh with API to perform your action. +In the 'low-level' way you can use it to execute remote command in more controlled way (still using ssh). +On the other hand - in advanced scope - you can use python anible code as a library to your own python scrips! This is awesome! (if you know what you are doing). It is a bit like fabric then. ## Ansible naming and basic concept ### Naming -### ansible (run module (task)) +#### Inventory +Inventory is a set of objects/hosts against which we are executing our playbooks +For this few minutes, lets asume that we are using default ansible inventory (which in Debian based system is placed in /etc/ansible/hosts_ + +#### Module - this is name for an logical program (usaly python) that consume proper JSON input and return proper output :) +This program perform certain task/action (like manage Amazon instances, execute shell command, any of your program). +Example: Module:shell - a module that executes shell command on a delegated host(s). +Example: Module:file - performs file operations (stat, link, dir, ...) + +##### Task +Execution of a single module is called a `task` + +Example of a Task run in CLI: +###### Run a ansible module + +ansible -m shell -a 'date; whoami' + +as a contrast - please note a module `command` that allows to execute a single command only + +ansible -m command -a 'date; whoami' # FAILURE + +ansible -m command -a 'date' +ansible -m command -a 'whoami' + +##### Playbook + +A list of tasks written in a file of proper structure is called a `playbook` +Playbook must have a list (or group) of hosts that is executed against, some task(s) or role(s) that are going to be executed, and multiple optional settings. + +Example of the playbook: + +``` +hosts: all + +tasks: + - name: "ping all" + ping: + - name: "execute a shell command" + shell: "date; whoami; df -h;" +``` + +### Basic ansible commands + +There are few binaries you should know + +`ansible` (to run modules in CLI) +`ansible-playbook` (to run playbooks) +`ansible-vault` (to manage secrets) +`ansible-galaxy` (to install roles from github/galaxy) +and other! ### ansible-playbook (run set of tasks) From bd05f751631d71d823a197cc5a506b05a60be849 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Tue, 15 Aug 2017 21:46:45 +0200 Subject: [PATCH 04/90] add some lines --- ansible.html.markdown | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index e074ed4410..24821862b1 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -93,10 +93,15 @@ There are few binaries you should know `ansible-galaxy` (to install roles from github/galaxy) and other! -### ansible-playbook (run set of tasks) +### More on ansible concept ### ansible-roles (a 'template-playbooks in right structure') +There are tasks (modules) that can be run via CLI +The execution plans of multiple tasks (with variables and logic) are called playbooks. + +Fot parts of the code, that is reusable, a concept called `role` was introduced + ### ansible - variables lookup's From 3069c1b9451768369cee30ea22c3e150dafef294 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Tue, 15 Aug 2017 21:48:01 +0200 Subject: [PATCH 05/90] add some lines --- ansible.html.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ansible.html.markdown b/ansible.html.markdown index 24821862b1..37c3e299fe 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -57,14 +57,18 @@ Execution of a single module is called a `task` Example of a Task run in CLI: ###### Run a ansible module +``` ansible -m shell -a 'date; whoami' +``` as a contrast - please note a module `command` that allows to execute a single command only +``` ansible -m command -a 'date; whoami' # FAILURE ansible -m command -a 'date' ansible -m command -a 'whoami' +``` ##### Playbook From dff02575a0a417e3d23802f4d115d52d1503232c Mon Sep 17 00:00:00 2001 From: sirkubax Date: Tue, 15 Aug 2017 21:55:44 +0200 Subject: [PATCH 06/90] add some lines --- ansible.html.markdown | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index 37c3e299fe..c0de7ac0a0 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -38,6 +38,8 @@ Ansible uses ssh or paramiko as a transport layer. In a way you can imagine that In the 'low-level' way you can use it to execute remote command in more controlled way (still using ssh). On the other hand - in advanced scope - you can use python anible code as a library to your own python scrips! This is awesome! (if you know what you are doing). It is a bit like fabric then. +But ansible is way more! It provides an execution plans, an API, library, callbacks, not forget to mention - COMUNITY! and great support by developers! + ## Ansible naming and basic concept ### Naming @@ -104,7 +106,30 @@ and other! There are tasks (modules) that can be run via CLI The execution plans of multiple tasks (with variables and logic) are called playbooks. -Fot parts of the code, that is reusable, a concept called `role` was introduced +For parts of the code, that is reusable, a concept called `role` was introduced + +Role in a way is just a structured way to keep your set of tasks, your variables, handlers, default settings, and way more (meta, files, templates). +Rele allows to reuse the same parts of code in multiple plybooks (usually with some parametisation). +It is a great way to introduce `object oriented` management for your applications. + +Role can be included in your playbook (executed in your playbook). + + +``` +hosts: all + +tasks: + - name: "ping all" + ping: + - name: "execute a shell command" + shell: "date; whoami; df -h;" + +role: + - some_role + +pre_tasks: + - name: some pre-task + shell: echo 'this task is the last, but would be executed before roles, and before tasks' ### ansible - variables lookup's From fa55726a683cf5bdee1d5e262f60df9042db3db6 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Wed, 6 Sep 2017 23:20:52 +0200 Subject: [PATCH 07/90] continue description --- ansible.html.markdown | 136 +++++++++++++++++++++++++++--------------- 1 file changed, 87 insertions(+), 49 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index c0de7ac0a0..3234fe5c70 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -7,38 +7,11 @@ filename: LearnAnsible.txt --- Ansible is (one of the many) orchestration tools. It allows you to controll your environment (infrastructure and a code) and automate the manual tasks. -Ansible have great integration with multiple operating systems (even Windows) and some hardware (switches, Firewalls, etc). It has multiple tools that integrate with the could providers. Almost every worth-notice cloud provider is present in the ecosystem (AWS, Azure, Google, DigitalOcean, OVH, etc...) - -## Main cons and pros - -### Cons - -It is an agent-less tool - every agent consumes up to 16MB ram - in some environments, it may be noticable amount. -It is agent-less - you have to verify your environment consistency 'on-demand' - there is no built-in mechanism taht would warn you about some change automatically (this can be achieved with reasonable effort - but it must be known) -Official GUI Tool (web inferface) - Ansible Tower - is more than GUI, but it is expensive. There is no 'small enterprice' payment plan. Easy workaround with Rundeck or Jenkins is possible with reasonable workload. - -### Pros +'You can think as simple as writing in bash with python API :) +Of course the rabit hole is way deeper.' -It is an agent-less tools :) In most scenarios, it use ssh as a transport layer. -In some way you can use it as 'bash on steroids'. -It is very-very-very easy to start. If you are familiar with ssh concept - you already know ansible :) (almost). My personal record is: 'I did show how to install and use ansible (for simple raspberry pi cluster management) and it tool me 30 seconds to deliver a working tool !!!)' -I do provide a training services - I'm able to teach a production-ready person - in 8 hours (1 training day)! It covers all needed to work aspects! No other tool can match this ease of use! -It executes when you do it - other tools (salt, puppet, chef - might execute in different scenario than you would expect) -Documentation is at the world-class standard! -The comunity (github, stackOverflow) would help you very fast. -Writing own modules and extension is fairly easy. - - -### Neutral -Migration Ansible<->Salt is failrly easy - so if you would need an event-driven agent environment - it would be a good choice to start quick with Ansible, and convert to salt when needed. - -## Basics on ansible - -Ansible uses ssh or paramiko as a transport layer. In a way you can imagine that you are using a ssh with API to perform your action. -In the 'low-level' way you can use it to execute remote command in more controlled way (still using ssh). -On the other hand - in advanced scope - you can use python anible code as a library to your own python scrips! This is awesome! (if you know what you are doing). It is a bit like fabric then. +Ansible have great integration with multiple operating systems (even Windows) and some hardware (switches, Firewalls, etc). It has multiple tools that integrate with the could providers. Almost every worth-notice cloud provider is present in the ecosystem (AWS, Azure, Google, DigitalOcean, OVH, etc...) -But ansible is way more! It provides an execution plans, an API, library, callbacks, not forget to mention - COMUNITY! and great support by developers! ## Ansible naming and basic concept @@ -56,42 +29,54 @@ Example: Module:file - performs file operations (stat, link, dir, ...) ##### Task Execution of a single module is called a `task` +The simplest module is called `ping`. +Another example of the module that allow you to execute command remotly on multiple resources is called shell. It is the same as you would execute command remotely over ssh. + Example of a Task run in CLI: ###### Run a ansible module -``` -ansible -m shell -a 'date; whoami' +```bash +$ ansible -m ping hostname_or_a_group_name +$ ansible -m shell -a 'date; whoami' hostname_or_a_group_name ``` -as a contrast - please note a module `command` that allows to execute a single command only +another module - `command` that allows to execute a single command only with a simple shell #JM +We should also mention a module `raw` -``` -ansible -m command -a 'date; whoami' # FAILURE +```bash +$ ansible -m command -a 'date; whoami' # FAILURE -ansible -m command -a 'date' -ansible -m command -a 'whoami' +$ ansible -m command -a 'date' +$ ansible -m command -a 'whoami' ``` ##### Playbook -A list of tasks written in a file of proper structure is called a `playbook` -Playbook must have a list (or group) of hosts that is executed against, some task(s) or role(s) that are going to be executed, and multiple optional settings. +A common way to execute tasks is called `playbook`. +You have to define a list (or group) of hosts that is executed against, some `task(s)` or `role(s)` that are going to be executed. There are also multiple optional settings (like default variables, and way more). + +You can think that it is very advanced CLI script that you are executing. Example of the playbook: -``` +```yml hosts: all tasks: - - name: "ping all" - ping: - - name: "execute a shell command" - shell: "date; whoami; df -h;" + - name: "ping all" + ping: + - name: "execute a shell command" + shell: "date; whoami; df -h;" +``` + +You can execute a playbook with a command: +```bash +$ ansible-playbook path/name_of_the_playbook.yml ``` ### Basic ansible commands -There are few binaries you should know +There are few commands you should know about `ansible` (to run modules in CLI) `ansible-playbook` (to run playbooks) @@ -106,16 +91,16 @@ and other! There are tasks (modules) that can be run via CLI The execution plans of multiple tasks (with variables and logic) are called playbooks. -For parts of the code, that is reusable, a concept called `role` was introduced +For parts of the code, that should be reusable, a concept called `role` was introduced -Role in a way is just a structured way to keep your set of tasks, your variables, handlers, default settings, and way more (meta, files, templates). -Rele allows to reuse the same parts of code in multiple plybooks (usually with some parametisation). +Role is a structured way to keep your set of tasks, variables, handlers, default settings, and way more (meta, files, templates). +Role allows to reuse the same parts of code in multiple plybooks (you can parametrize this). It is a great way to introduce `object oriented` management for your applications. Role can be included in your playbook (executed in your playbook). -``` +```yml hosts: all tasks: @@ -126,10 +111,28 @@ tasks: role: - some_role + - { role: another_role, some_variable: 'learnxiny', tags: ['my_tag'] } pre_tasks: - name: some pre-task shell: echo 'this task is the last, but would be executed before roles, and before tasks' +``` + +``` +roles/ + some_role/ + defaults/ + files/ + templates/ + tasks/ + handlers/ + vars/ + meta/ +``` + +#### Role Handlers +Handlers are a task that can be triggered (notified) during execution of a playbook, but they itself execute at the very end of a playbook. +It is a best way to restart a service, check if application port is open, etc. ### ansible - variables lookup's @@ -174,6 +177,41 @@ tags meta no_logs + +## Main cons and pros + +### Cons + +It is an agent-less tool - every agent consumes up to 16MB ram - in some environments, it may be noticable amount. +It is agent-less - you have to verify your environment consistency 'on-demand' - there is no built-in mechanism taht would warn you about some change automatically (this can be achieved with reasonable effort - but it must be known) +Official GUI Tool (web inferface) - Ansible Tower - is more than GUI, but it is expensive. There is no 'small enterprice' payment plan. Easy workaround with Rundeck or Jenkins is possible with reasonable workload. + +### Pros + +It is an agent-less tools :) In most scenarios, it use ssh as a transport layer. +In some way you can use it as 'bash on steroids'. +It is very-very-very easy to start. If you are familiar with ssh concept - you already know ansible :) (almost). My personal record is: 'I did show how to install and use ansible (for simple raspberry pi cluster management) and it tool me 30 seconds to deliver a working tool !!!)' +I do provide a training services - I'm able to teach a production-ready person - in 8 hours (1 training day)! It covers all needed to work aspects! No other tool can match this ease of use! +It executes when you do it - other tools (salt, puppet, chef - might execute in different scenario than you would expect) +Documentation is at the world-class standard! +The comunity (github, stackOverflow) would help you very fast. +Writing own modules and extension is fairly easy. + + +### Neutral +Migration Ansible<->Salt is failrly easy - so if you would need an event-driven agent environment - it would be a good choice to start quick with Ansible, and convert to salt when needed. + +## Basics on ansible + +Ansible uses ssh or paramiko as a transport layer. In a way you can imagine that you are using a ssh with API to perform your action. +In the 'low-level' way you can use it to execute remote command in more controlled way (still using ssh). +On the other hand - in advanced scope - you can use python anible code as a library to your own python scrips! This is awesome! (if you know what you are doing). It is a bit like fabric then. + +But ansible is way more! It provides an execution plans, an API, library, callbacks, not forget to mention - COMUNITY! and great support by developers! + + + + --- Github template placeholder - to be removed From 32b2f01d3652274f27dee4cf3d5957ac6aa7e95b Mon Sep 17 00:00:00 2001 From: sirkubax Date: Wed, 6 Sep 2017 23:34:29 +0200 Subject: [PATCH 08/90] continue --- ansible.html.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ansible.html.markdown b/ansible.html.markdown index 3234fe5c70..c1cddd353b 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -54,6 +54,7 @@ $ ansible -m command -a 'whoami' A common way to execute tasks is called `playbook`. You have to define a list (or group) of hosts that is executed against, some `task(s)` or `role(s)` that are going to be executed. There are also multiple optional settings (like default variables, and way more). +Playbook script language is YAML You can think that it is very advanced CLI script that you are executing. @@ -118,6 +119,7 @@ pre_tasks: shell: echo 'this task is the last, but would be executed before roles, and before tasks' ``` +Role directory structure: ``` roles/ some_role/ From 60ae84cf4123473a5685de21d1f1e5b09b52aaa5 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Wed, 6 Sep 2017 23:40:18 +0200 Subject: [PATCH 09/90] continue --- ansible.html.markdown | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index c1cddd353b..cd619cc373 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -15,7 +15,15 @@ Ansible have great integration with multiple operating systems (even Windows) an ## Ansible naming and basic concept -### Naming +### Basic ansible commands + +There are few commands you should know about + +`ansible` (to run modules in CLI) +`ansible-playbook` (to run playbooks) +`ansible-vault` (to manage secrets) +`ansible-galaxy` (to install roles from github/galaxy) +and other! #### Inventory Inventory is a set of objects/hosts against which we are executing our playbooks @@ -23,6 +31,7 @@ For this few minutes, lets asume that we are using default ansible inventory (wh #### Module - this is name for an logical program (usaly python) that consume proper JSON input and return proper output :) This program perform certain task/action (like manage Amazon instances, execute shell command, any of your program). +The simplest module is called `ping` - it just returns a JSON with `pong` message and ansible variables. Example: Module:shell - a module that executes shell command on a delegated host(s). Example: Module:file - performs file operations (stat, link, dir, ...) @@ -75,17 +84,7 @@ You can execute a playbook with a command: $ ansible-playbook path/name_of_the_playbook.yml ``` -### Basic ansible commands - -There are few commands you should know about - -`ansible` (to run modules in CLI) -`ansible-playbook` (to run playbooks) -`ansible-vault` (to manage secrets) -`ansible-galaxy` (to install roles from github/galaxy) -and other! - -### More on ansible concept +## More on ansible concept ### ansible-roles (a 'template-playbooks in right structure') @@ -163,6 +162,8 @@ virtualenv ### create env in AWS +### Naming + ## Bonus ### writing own module From 4076cc53c0fcb1f8b85a71e0e395407ab43a05ab Mon Sep 17 00:00:00 2001 From: sirkubax Date: Fri, 22 Sep 2017 22:21:42 +0200 Subject: [PATCH 10/90] change the concept of paragraphs --- ansible.html.markdown | 109 +++++++++++++++++++++++++++++------------- 1 file changed, 77 insertions(+), 32 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index cd619cc373..2eb6df2e1d 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -6,17 +6,38 @@ contributors: filename: LearnAnsible.txt --- -Ansible is (one of the many) orchestration tools. It allows you to controll your environment (infrastructure and a code) and automate the manual tasks. -'You can think as simple as writing in bash with python API :) -Of course the rabit hole is way deeper.' +```yaml +--- +Ansible - the easiest orchestration tool -Ansible have great integration with multiple operating systems (even Windows) and some hardware (switches, Firewalls, etc). It has multiple tools that integrate with the could providers. Almost every worth-notice cloud provider is present in the ecosystem (AWS, Azure, Google, DigitalOcean, OVH, etc...) +Why Ansible and Intro - in the second part of document +``` -## Ansible naming and basic concept +## Installation +```bash +# Universal way +$ pip install ansible -### Basic ansible commands +# Debian, Ubuntu +$ apt-get install ansible +``` +* Appendix A - How do I install ansible +[Additional Reading.](http://docs.ansible.com/ansible/latest/intro_installation.html) + +### Basic ansible commands (shell execution) +```bash +# This command ping the localhost (defined in default inventory /etc/ansible/hosts) + +$ ansible -m ping localhost +localhost | SUCCESS => { + "changed": false, + "ping": "pong" +} + +``` +### Commands There are few commands you should know about `ansible` (to run modules in CLI) @@ -25,16 +46,37 @@ There are few commands you should know about `ansible-galaxy` (to install roles from github/galaxy) and other! +```bash +$ ansible -m shell -a 'date; whoami' localhost #hostname_or_a_group_name +``` + +The module `command` allows to execute a single command. It will not be processed through the shell, so variables like $HOME and operations like "<", ">", "|", ";" and "&" will not work. Use shell :) +We should also mention a module `raw` that sometimes can save the day. + +```bash +$ ansible -m command -a 'date; whoami' # FAILURE + +$ ansible -m command -a 'date' +$ ansible -m command -a 'whoami' +``` + + +#### Module - program (usaly python) that execute, do some work and return proper output :) +This program perform specialized task/action (like manage instances in the cloud, execute shell command). +The simplest module is called `ping` - it just returns a JSON with `pong` message. + +Example of modules: +Module: `shell` - a module that executes shell command on a specified host(s). +Module: `file` - performs file operations (stat, link, dir, ...) + + +```yaml +``` + #### Inventory Inventory is a set of objects/hosts against which we are executing our playbooks For this few minutes, lets asume that we are using default ansible inventory (which in Debian based system is placed in /etc/ansible/hosts_ -#### Module - this is name for an logical program (usaly python) that consume proper JSON input and return proper output :) -This program perform certain task/action (like manage Amazon instances, execute shell command, any of your program). -The simplest module is called `ping` - it just returns a JSON with `pong` message and ansible variables. -Example: Module:shell - a module that executes shell command on a delegated host(s). -Example: Module:file - performs file operations (stat, link, dir, ...) - ##### Task Execution of a single module is called a `task` @@ -44,30 +86,22 @@ Another example of the module that allow you to execute command remotly on multi Example of a Task run in CLI: ###### Run a ansible module -```bash -$ ansible -m ping hostname_or_a_group_name -$ ansible -m shell -a 'date; whoami' hostname_or_a_group_name -``` - -another module - `command` that allows to execute a single command only with a simple shell #JM -We should also mention a module `raw` - -```bash -$ ansible -m command -a 'date; whoami' # FAILURE - -$ ansible -m command -a 'date' -$ ansible -m command -a 'whoami' -``` ##### Playbook - -A common way to execute tasks is called `playbook`. -You have to define a list (or group) of hosts that is executed against, some `task(s)` or `role(s)` that are going to be executed. There are also multiple optional settings (like default variables, and way more). +Execution plan written in a form of script file(s) is called `playbook`. +Playbook consist of multiple elements +* a list (or group) of hosts that 'the play' is executed against +* `task(s)` or `role(s)` that are going to be executed +* multiple optional settings (like default variables, and way more) Playbook script language is YAML -You can think that it is very advanced CLI script that you are executing. +You can think that playbook is very advanced CLI script that you are executing. + -Example of the playbook: +##### Example of the playbook: +This playbook would execute (on all hosts defined in the inventory) two tasks +*`ping` that would return message *pong* +* `shell` that execute three commands and return the output to our terminal ```yml hosts: all @@ -83,7 +117,7 @@ You can execute a playbook with a command: ```bash $ ansible-playbook path/name_of_the_playbook.yml ``` - +It is also possible to become a user other than root using --become-user: ## More on ansible concept ### ansible-roles (a 'template-playbooks in right structure') @@ -138,6 +172,9 @@ It is a best way to restart a service, check if application port is open, etc. ### ansible - variables lookup's +#### templates +JINJA2 + ### ansible-vault ### inventory @@ -180,6 +217,14 @@ tags meta no_logs +## Introduction +Ansible is (one of the many) orchestration tools. It allows you to controll your environment (infrastructure and a code) and automate the manual tasks. +'You can think as simple as writing in bash with python API :) +Of course the rabit hole is way deeper.' + +Ansible have great integration with multiple operating systems (even Windows) and some hardware (switches, Firewalls, etc). It has multiple tools that integrate with the could providers. Almost every worth-notice cloud provider is present in the ecosystem (AWS, Azure, Google, DigitalOcean, OVH, etc...) + + ## Main cons and pros From c7fbf44dd595d621fb1140d58e53c34be7494a20 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Fri, 22 Sep 2017 22:23:09 +0200 Subject: [PATCH 11/90] test markdown --- ansible.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index 2eb6df2e1d..36d955322e 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -8,7 +8,7 @@ filename: LearnAnsible.txt ```yaml --- -Ansible - the easiest orchestration tool +Ansible: 'the easiest orchestration tool' Why Ansible and Intro - in the second part of document From fdb26e4870ee45f9edb1e9df7abce7bf9edac878 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Fri, 22 Sep 2017 22:24:22 +0200 Subject: [PATCH 12/90] test markdown --- ansible.html.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index 36d955322e..94fa20a066 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -8,9 +8,9 @@ filename: LearnAnsible.txt ```yaml --- -Ansible: 'the easiest orchestration tool' +Ansible: "the easiest orchestration tool" -Why Ansible and Intro - in the second part of document +"{{ Why Ansible and Intro }}" in the second part of document ``` From 6ba6076dea7bf3b6633cdb8e0005362f4619deaa Mon Sep 17 00:00:00 2001 From: sirkubax Date: Fri, 22 Sep 2017 22:25:47 +0200 Subject: [PATCH 13/90] test markdown --- ansible.html.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index 94fa20a066..b8d7eb7057 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -6,10 +6,10 @@ contributors: filename: LearnAnsible.txt --- +## Ansible: the easiest orchestration tool + ```yaml --- -Ansible: "the easiest orchestration tool" - "{{ Why Ansible and Intro }}" in the second part of document ``` From 0601badf4f6557ead604e693a273726c282fce46 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Fri, 22 Sep 2017 22:27:32 +0200 Subject: [PATCH 14/90] test markdown --- ansible.html.markdown | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index b8d7eb7057..12aefe5fd1 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -24,17 +24,16 @@ $ apt-get install ansible ``` * Appendix A - How do I install ansible -[Additional Reading.](http://docs.ansible.com/ansible/latest/intro_installation.html) +* [Additional Reading.](http://docs.ansible.com/ansible/latest/intro_installation.html) ### Basic ansible commands (shell execution) ```bash # This command ping the localhost (defined in default inventory /etc/ansible/hosts) - $ ansible -m ping localhost -localhost | SUCCESS => { +localhost | SUCCESS => { "changed": false, "ping": "pong" -} +} ``` ### Commands From 6ade03b92abfdc30917aa0f5188e7a0ed9a70ca9 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Fri, 22 Sep 2017 22:29:12 +0200 Subject: [PATCH 15/90] test markdown --- ansible.html.markdown | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index 12aefe5fd1..4409422b52 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -39,10 +39,10 @@ localhost | SUCCESS => { ### Commands There are few commands you should know about -`ansible` (to run modules in CLI) -`ansible-playbook` (to run playbooks) -`ansible-vault` (to manage secrets) -`ansible-galaxy` (to install roles from github/galaxy) +* `ansible` (to run modules in CLI) +* `ansible-playbook` (to run playbooks) +* `ansible-vault` (to manage secrets) +* `ansible-galaxy` (to install roles from github/galaxy) and other! ```bash @@ -50,6 +50,7 @@ $ ansible -m shell -a 'date; whoami' localhost #hostname_or_a_group_name ``` The module `command` allows to execute a single command. It will not be processed through the shell, so variables like $HOME and operations like "<", ">", "|", ";" and "&" will not work. Use shell :) + We should also mention a module `raw` that sometimes can save the day. ```bash From e7e43b01e66c158053acfd00d5317743f137abb4 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Fri, 22 Sep 2017 22:30:27 +0200 Subject: [PATCH 16/90] test markdown --- ansible.html.markdown | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index 4409422b52..9408db18c6 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -43,7 +43,9 @@ There are few commands you should know about * `ansible-playbook` (to run playbooks) * `ansible-vault` (to manage secrets) * `ansible-galaxy` (to install roles from github/galaxy) -and other! +* and other! + +Example of usage - `shell` ```bash $ ansible -m shell -a 'date; whoami' localhost #hostname_or_a_group_name From 688f9b686f70c7a0763e7e0e550b18f12bc1b7fb Mon Sep 17 00:00:00 2001 From: sirkubax Date: Fri, 22 Sep 2017 22:41:27 +0200 Subject: [PATCH 17/90] test markdown --- ansible.html.markdown | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index 9408db18c6..fff8556329 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -45,15 +45,24 @@ There are few commands you should know about * `ansible-galaxy` (to install roles from github/galaxy) * and other! -Example of usage - `shell` + +#### Module - program (usaly python) that execute, do some work and return proper output :) +This program perform specialized task/action (like manage instances in the cloud, execute shell command). +The simplest module is called `ping` - it just returns a JSON with `pong` message. + +Example of modules: +* Module: `ping` - the simplest module that is usefull to verify host connectivity +* Module: `shell` - a module that executes shell command on a specified host(s). + +Example of usage - `ping`, `shell` ```bash +$ ansible -m ping $ ansible -m shell -a 'date; whoami' localhost #hostname_or_a_group_name ``` -The module `command` allows to execute a single command. It will not be processed through the shell, so variables like $HOME and operations like "<", ">", "|", ";" and "&" will not work. Use shell :) +* Module: `command` - executes a single command that will not be processed through the shell, so variables like $HOME will not work -We should also mention a module `raw` that sometimes can save the day. ```bash $ ansible -m command -a 'date; whoami' # FAILURE @@ -62,14 +71,8 @@ $ ansible -m command -a 'date' $ ansible -m command -a 'whoami' ``` - -#### Module - program (usaly python) that execute, do some work and return proper output :) -This program perform specialized task/action (like manage instances in the cloud, execute shell command). -The simplest module is called `ping` - it just returns a JSON with `pong` message. - -Example of modules: -Module: `shell` - a module that executes shell command on a specified host(s). -Module: `file` - performs file operations (stat, link, dir, ...) +* Module: `file` - performs file operations (stat, link, dir, ...) +* Module: `raw` - executes a low-down and dirty SSH command, not going through the module subsystem (usefull to install python2.7) ```yaml From 2baed7cd96532f90ec7619e828e58a0115b34f20 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Fri, 22 Sep 2017 22:42:18 +0200 Subject: [PATCH 18/90] test markdown --- ansible.html.markdown | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index fff8556329..389eaaa13c 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -46,7 +46,8 @@ There are few commands you should know about * and other! -#### Module - program (usaly python) that execute, do some work and return proper output :) +#### Module +*program (usaly python) that execute, do some work and return proper output :)* This program perform specialized task/action (like manage instances in the cloud, execute shell command). The simplest module is called `ping` - it just returns a JSON with `pong` message. From 6f0799d6078c117a59da7cc2ada0cee583d6db56 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Fri, 22 Sep 2017 22:42:43 +0200 Subject: [PATCH 19/90] test markdown --- ansible.html.markdown | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index 389eaaa13c..5fc103b7b5 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -47,7 +47,8 @@ There are few commands you should know about #### Module -*program (usaly python) that execute, do some work and return proper output :)* +_*program (usaly python) that execute, do some work and return proper output :)*_ + This program perform specialized task/action (like manage instances in the cloud, execute shell command). The simplest module is called `ping` - it just returns a JSON with `pong` message. From 7ba7ab471e340803e078a6cae0e24c7615dde0a2 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Fri, 22 Sep 2017 22:43:50 +0200 Subject: [PATCH 20/90] test markdown --- ansible.html.markdown | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index 5fc103b7b5..ea7bb47a73 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -47,9 +47,10 @@ There are few commands you should know about #### Module -_*program (usaly python) that execute, do some work and return proper output :)*_ +_*program (usaly python) that execute, do some work and return proper JSON output :)*_ + +This *program* perform specialized task/action (like manage instances in the cloud, execute shell command). -This program perform specialized task/action (like manage instances in the cloud, execute shell command). The simplest module is called `ping` - it just returns a JSON with `pong` message. Example of modules: From 8a1139dee670362ab4186cb9866d746f36d2d7e4 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Fri, 22 Sep 2017 22:48:55 +0200 Subject: [PATCH 21/90] test markdown --- ansible.html.markdown | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index ea7bb47a73..13afeb3bf6 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -26,7 +26,7 @@ $ apt-get install ansible * Appendix A - How do I install ansible * [Additional Reading.](http://docs.ansible.com/ansible/latest/intro_installation.html) -### Basic ansible commands (shell execution) +### Your first ansible command (shell execution) ```bash # This command ping the localhost (defined in default inventory /etc/ansible/hosts) $ ansible -m ping localhost @@ -36,7 +36,7 @@ localhost | SUCCESS => { } ``` -### Commands +### Shell Commands There are few commands you should know about * `ansible` (to run modules in CLI) @@ -45,8 +45,7 @@ There are few commands you should know about * `ansible-galaxy` (to install roles from github/galaxy) * and other! - -#### Module +### Module _*program (usaly python) that execute, do some work and return proper JSON output :)*_ This *program* perform specialized task/action (like manage instances in the cloud, execute shell command). @@ -57,7 +56,7 @@ Example of modules: * Module: `ping` - the simplest module that is usefull to verify host connectivity * Module: `shell` - a module that executes shell command on a specified host(s). -Example of usage - `ping`, `shell` +Example of execution - `ping`, `shell` ```bash $ ansible -m ping From 7abd3b5017df4c698b8bd33a6e472483decf73a2 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Fri, 22 Sep 2017 22:49:43 +0200 Subject: [PATCH 22/90] test markdown --- ansible.html.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/ansible.html.markdown b/ansible.html.markdown index 13afeb3bf6..6ef7bab7bb 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -30,6 +30,7 @@ $ apt-get install ansible ```bash # This command ping the localhost (defined in default inventory /etc/ansible/hosts) $ ansible -m ping localhost +# you should see this output localhost | SUCCESS => { "changed": false, "ping": "pong" From 21fb697b8899ea62bf83f11928d6f91c98c62ad1 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Fri, 22 Sep 2017 23:00:10 +0200 Subject: [PATCH 23/90] test markdown --- ansible.html.markdown | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index 6ef7bab7bb..72a91a5c55 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -47,7 +47,7 @@ There are few commands you should know about * and other! ### Module -_*program (usaly python) that execute, do some work and return proper JSON output :)*_ +_*program (usally python) that execute, do some work and return proper JSON output :)*_ This *program* perform specialized task/action (like manage instances in the cloud, execute shell command). @@ -64,7 +64,7 @@ $ ansible -m ping $ ansible -m shell -a 'date; whoami' localhost #hostname_or_a_group_name ``` -* Module: `command` - executes a single command that will not be processed through the shell, so variables like $HOME will not work +* Module: `command` - executes a single command that will not be processed through the shell, so variables like $HOME or operands like `|` will not work ```bash @@ -72,6 +72,7 @@ $ ansible -m command -a 'date; whoami' # FAILURE $ ansible -m command -a 'date' $ ansible -m command -a 'whoami' +$ ansible -m command -a 'echo $HOME' ``` * Module: `file` - performs file operations (stat, link, dir, ...) From 7b6f0757c23b2339692c9194e4e5c95614b145f1 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Sat, 23 Sep 2017 11:43:25 +0200 Subject: [PATCH 24/90] test markdown --- ansible.html.markdown | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index 72a91a5c55..255715bdb6 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -64,7 +64,7 @@ $ ansible -m ping $ ansible -m shell -a 'date; whoami' localhost #hostname_or_a_group_name ``` -* Module: `command` - executes a single command that will not be processed through the shell, so variables like $HOME or operands like `|` will not work +* Module: `command` - executes a single command that will not be processed through the shell, so variables like $HOME or operands like `|` `;` will not work ```bash @@ -79,17 +79,27 @@ $ ansible -m command -a 'echo $HOME' * Module: `raw` - executes a low-down and dirty SSH command, not going through the module subsystem (usefull to install python2.7) -```yaml -``` +### Ansible - naming and basic concept #### Inventory -Inventory is a set of objects/hosts against which we are executing our playbooks -For this few minutes, lets asume that we are using default ansible inventory (which in Debian based system is placed in /etc/ansible/hosts_ +Inventory is a set of an objects or hosts, against which we are executing our playbooks or single tasks via shell commands +For this few minutes, lets asume that we are using default ansible inventory (which in Debian based system is placed in /etc/ansible/hosts) -##### Task +`/etc/ansible/hosts` +``` +localhost + +[some_group] +hostA.mydomain.com +hostB.localdomain +``` +* [Additional Reading.](http://docs.ansible.com/ansible/latest/intro_inventory.html) + +#### Task Execution of a single module is called a `task` -The simplest module is called `ping`. +The simplest module is called `ping` as you could see above + Another example of the module that allow you to execute command remotly on multiple resources is called shell. It is the same as you would execute command remotely over ssh. Example of a Task run in CLI: @@ -180,6 +190,8 @@ It is a best way to restart a service, check if application port is open, etc. ### ansible - variables lookup's +```yaml +``` #### templates JINJA2 From 69c40ee1a2659ba9f150e04adb2822d66f18570f Mon Sep 17 00:00:00 2001 From: sirkubax Date: Sat, 23 Sep 2017 11:50:05 +0200 Subject: [PATCH 25/90] test markdown --- ansible.html.markdown | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index 255715bdb6..a09c8b3486 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -79,7 +79,7 @@ $ ansible -m command -a 'echo $HOME' * Module: `raw` - executes a low-down and dirty SSH command, not going through the module subsystem (usefull to install python2.7) -### Ansible - naming and basic concept +### Ansible - naming and quick intro #### Inventory Inventory is a set of an objects or hosts, against which we are executing our playbooks or single tasks via shell commands @@ -96,11 +96,10 @@ hostB.localdomain * [Additional Reading.](http://docs.ansible.com/ansible/latest/intro_inventory.html) #### Task -Execution of a single module is called a `task` +Execution of a single Ansible **module** is called a **task** -The simplest module is called `ping` as you could see above - -Another example of the module that allow you to execute command remotly on multiple resources is called shell. It is the same as you would execute command remotely over ssh. + The simplest module is called `ping` as you could see above + Another example of the module that allow you to execute command remotly on multiple resources is called shell. It is the same as you would execute command remotely over ssh. Example of a Task run in CLI: ###### Run a ansible module From e946c383fde705d20aa3342c372cc8ad22793d90 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Sat, 23 Sep 2017 11:52:10 +0200 Subject: [PATCH 26/90] test markdown --- ansible.html.markdown | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index a09c8b3486..02ee8694a7 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -106,12 +106,14 @@ Example of a Task run in CLI: ##### Playbook -Execution plan written in a form of script file(s) is called `playbook`. +Execution plan written in a form of script file(s) is called `playbook`.-- + Playbook consist of multiple elements * a list (or group) of hosts that 'the play' is executed against * `task(s)` or `role(s)` that are going to be executed * multiple optional settings (like default variables, and way more) -Playbook script language is YAML +Playbook script language is YAML-- + You can think that playbook is very advanced CLI script that you are executing. From a6ea9118be2fe266ea89661b360707294b854725 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Sat, 23 Sep 2017 11:53:10 +0200 Subject: [PATCH 27/90] test markdown --- ansible.html.markdown | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index 02ee8694a7..44bce5b060 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -99,6 +99,7 @@ hostB.localdomain Execution of a single Ansible **module** is called a **task** The simplest module is called `ping` as you could see above + Another example of the module that allow you to execute command remotly on multiple resources is called shell. It is the same as you would execute command remotely over ssh. Example of a Task run in CLI: @@ -106,14 +107,12 @@ Example of a Task run in CLI: ##### Playbook -Execution plan written in a form of script file(s) is called `playbook`.-- - +Execution plan written in a form of script file(s) is called `playbook`. Playbook consist of multiple elements * a list (or group) of hosts that 'the play' is executed against * `task(s)` or `role(s)` that are going to be executed * multiple optional settings (like default variables, and way more) -Playbook script language is YAML-- - +Playbook script language is YAML You can think that playbook is very advanced CLI script that you are executing. From a5bec9b8efecbbda3415289325db37c911a0969e Mon Sep 17 00:00:00 2001 From: sirkubax Date: Sat, 23 Sep 2017 11:54:26 +0200 Subject: [PATCH 28/90] test markdown --- ansible.html.markdown | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index 44bce5b060..1e3fc1387f 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -96,10 +96,9 @@ hostB.localdomain * [Additional Reading.](http://docs.ansible.com/ansible/latest/intro_inventory.html) #### Task -Execution of a single Ansible **module** is called a **task** + Execution of a single Ansible **module** is called a **task** The simplest module is called `ping` as you could see above - Another example of the module that allow you to execute command remotly on multiple resources is called shell. It is the same as you would execute command remotely over ssh. Example of a Task run in CLI: From eaf3e9c46154842509e58bdcadb1a863178bb976 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Sat, 23 Sep 2017 11:56:13 +0200 Subject: [PATCH 29/90] test markdown --- ansible.html.markdown | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index 1e3fc1387f..744f63940c 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -98,11 +98,8 @@ hostB.localdomain #### Task Execution of a single Ansible **module** is called a **task** - The simplest module is called `ping` as you could see above - Another example of the module that allow you to execute command remotly on multiple resources is called shell. It is the same as you would execute command remotely over ssh. - -Example of a Task run in CLI: -###### Run a ansible module + The simplest module is called `ping` as you could see above + Another example of the module that allow you to execute command remotly on multiple resources is called shell. It is the same as you would execute command remotely over ssh. ##### Playbook From 656516a2b9c0951779b2450de24f46e8effad81c Mon Sep 17 00:00:00 2001 From: sirkubax Date: Sat, 23 Sep 2017 11:56:50 +0200 Subject: [PATCH 30/90] test markdown --- ansible.html.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/ansible.html.markdown b/ansible.html.markdown index 744f63940c..27a467cc4b 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -99,6 +99,7 @@ hostB.localdomain Execution of a single Ansible **module** is called a **task** The simplest module is called `ping` as you could see above + Another example of the module that allow you to execute command remotly on multiple resources is called shell. It is the same as you would execute command remotely over ssh. From 27c3e82f12f40c75bdd08e97aead14048a080505 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Wed, 27 Sep 2017 16:47:10 +0200 Subject: [PATCH 31/90] test markdown --- ansible.html.markdown | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index 27a467cc4b..1456505709 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -79,9 +79,9 @@ $ ansible -m command -a 'echo $HOME' * Module: `raw` - executes a low-down and dirty SSH command, not going through the module subsystem (usefull to install python2.7) -### Ansible - naming and quick intro +## Ansible - naming and quick intro -#### Inventory +### Inventory Inventory is a set of an objects or hosts, against which we are executing our playbooks or single tasks via shell commands For this few minutes, lets asume that we are using default ansible inventory (which in Debian based system is placed in /etc/ansible/hosts) @@ -95,15 +95,15 @@ hostB.localdomain ``` * [Additional Reading.](http://docs.ansible.com/ansible/latest/intro_inventory.html) -#### Task +### Task Execution of a single Ansible **module** is called a **task** The simplest module is called `ping` as you could see above - Another example of the module that allow you to execute command remotly on multiple resources is called shell. It is the same as you would execute command remotely over ssh. + Another example of the module that allow you to execute command remotly on multiple resources is called `shell`. See above how you were using them already. -##### Playbook +### Playbook Execution plan written in a form of script file(s) is called `playbook`. Playbook consist of multiple elements * a list (or group) of hosts that 'the play' is executed against @@ -114,7 +114,7 @@ Playbook script language is YAML You can think that playbook is very advanced CLI script that you are executing. -##### Example of the playbook: +#### Example of the playbook: This playbook would execute (on all hosts defined in the inventory) two tasks *`ping` that would return message *pong* * `shell` that execute three commands and return the output to our terminal From bb3e71c52957561c425999a542c0fb9f47a3c4f7 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Wed, 27 Sep 2017 17:00:23 +0200 Subject: [PATCH 32/90] test markdown --- ansible.html.markdown | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index 1456505709..b5de971cc4 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -10,7 +10,7 @@ filename: LearnAnsible.txt ```yaml --- -"{{ Why Ansible and Intro }}" in the second part of document +"{{ Why Ansible and detailed Intro }}" written in the second part of document ``` @@ -60,19 +60,19 @@ Example of modules: Example of execution - `ping`, `shell` ```bash -$ ansible -m ping +$ ansible -m ping all $ ansible -m shell -a 'date; whoami' localhost #hostname_or_a_group_name ``` * Module: `command` - executes a single command that will not be processed through the shell, so variables like $HOME or operands like `|` `;` will not work +#JM ```bash $ ansible -m command -a 'date; whoami' # FAILURE -$ ansible -m command -a 'date' -$ ansible -m command -a 'whoami' -$ ansible -m command -a 'echo $HOME' +$ ansible -m command -a 'date' all +$ ansible -m command -a 'whoami' all ``` * Module: `file` - performs file operations (stat, link, dir, ...) @@ -92,6 +92,11 @@ localhost [some_group] hostA.mydomain.com hostB.localdomain + +[a_group_of_a_groups:children] +some_group +some_other_group + ``` * [Additional Reading.](http://docs.ansible.com/ansible/latest/intro_inventory.html) @@ -104,7 +109,7 @@ hostB.localdomain ### Playbook -Execution plan written in a form of script file(s) is called `playbook`. +**Execution plan** written in a form of script file(s) is called `playbook`. Playbook consist of multiple elements * a list (or group) of hosts that 'the play' is executed against * `task(s)` or `role(s)` that are going to be executed @@ -116,7 +121,7 @@ You can think that playbook is very advanced CLI script that you are executing. #### Example of the playbook: This playbook would execute (on all hosts defined in the inventory) two tasks -*`ping` that would return message *pong* +* `ping` that would return message *pong* * `shell` that execute three commands and return the output to our terminal ```yml From c62c527f82cd6addd38fec966efed5390bf15bdc Mon Sep 17 00:00:00 2001 From: sirkubax Date: Wed, 27 Sep 2017 17:06:17 +0200 Subject: [PATCH 33/90] test markdown --- ansible.html.markdown | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index b5de971cc4..2b9973404d 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -109,18 +109,19 @@ some_other_group ### Playbook -**Execution plan** written in a form of script file(s) is called `playbook`. +**Execution plan** written in a form of script file(s) is called **playbook**. Playbook consist of multiple elements * a list (or group) of hosts that 'the play' is executed against * `task(s)` or `role(s)` that are going to be executed * multiple optional settings (like default variables, and way more) -Playbook script language is YAML + +Playbook script language is YAML. You can think that playbook is very advanced CLI script that you are executing. #### Example of the playbook: -This playbook would execute (on all hosts defined in the inventory) two tasks +This example-playbook would execute (on all hosts defined in the inventory) two tasks: * `ping` that would return message *pong* * `shell` that execute three commands and return the output to our terminal @@ -134,11 +135,10 @@ tasks: shell: "date; whoami; df -h;" ``` -You can execute a playbook with a command: +You can run the playbook with the command: ```bash $ ansible-playbook path/name_of_the_playbook.yml ``` -It is also possible to become a user other than root using --become-user: ## More on ansible concept ### ansible-roles (a 'template-playbooks in right structure') @@ -232,6 +232,7 @@ virtualenv ### Web-UI: Ansible Tower, Jenkins, Rundeck +#become-user, become ### Tips and tricks AND,XOR From cbc9b5b2a5af550926f3232458432984951b5b53 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Wed, 27 Sep 2017 17:52:48 +0200 Subject: [PATCH 34/90] test markdown --- ansible.html.markdown | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index 2b9973404d..460faf82be 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -139,20 +139,20 @@ You can run the playbook with the command: ```bash $ ansible-playbook path/name_of_the_playbook.yml ``` -## More on ansible concept +### More on ansible concept -### ansible-roles (a 'template-playbooks in right structure') +#### ansible-roles (a 'template-playbooks' with right structure) -There are tasks (modules) that can be run via CLI +You already know the tasks (modules) that can be run via CLI The execution plans of multiple tasks (with variables and logic) are called playbooks. -For parts of the code, that should be reusable, a concept called `role` was introduced +A concept called `role` was introduced for parts of the code that should be reusable. -Role is a structured way to keep your set of tasks, variables, handlers, default settings, and way more (meta, files, templates). -Role allows to reuse the same parts of code in multiple plybooks (you can parametrize this). +**Role** is a structured way to manage your set of tasks, variables, handlers, default settings, and way more (meta, files, templates). +Role allows to reuse the same parts of code in multiple plybooks (you can parametrize the role 'further' during it's execution). It is a great way to introduce `object oriented` management for your applications. -Role can be included in your playbook (executed in your playbook). +Role can be included in your playbook (executed via your playbook). ```yml @@ -173,6 +173,16 @@ pre_tasks: shell: echo 'this task is the last, but would be executed before roles, and before tasks' ``` +Example-role + +We would clone the ready-to-use examples from additional repository +```bash +$ git colone git@github.com:sirkubax/ansible-for-learnXinYminutes.git +$ cd ansible-for-learnXinYminutes +$ source environment +$(venv) ansible-playbook playbooks/role_example.yml +``` + Role directory structure: ``` roles/ From 04a88249c9ee8f1e611d67b782267289208ab310 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Wed, 27 Sep 2017 17:53:42 +0200 Subject: [PATCH 35/90] test markdown --- ansible.html.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index 460faf82be..1f04b5204b 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -143,8 +143,8 @@ $ ansible-playbook path/name_of_the_playbook.yml #### ansible-roles (a 'template-playbooks' with right structure) -You already know the tasks (modules) that can be run via CLI -The execution plans of multiple tasks (with variables and logic) are called playbooks. + You already know the tasks (modules) that can be run via CLI. + The execution plans of multiple tasks (with variables and logic) are called playbooks. A concept called `role` was introduced for parts of the code that should be reusable. From da0ca8fcbda3b035fa725e7746c9ee4f084b08cc Mon Sep 17 00:00:00 2001 From: sirkubax Date: Wed, 27 Sep 2017 18:11:20 +0200 Subject: [PATCH 36/90] test markdown --- ansible.html.markdown | 64 +++++++++++++++++++++++++++++++------------ 1 file changed, 46 insertions(+), 18 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index 1f04b5204b..25a3828306 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -1,4 +1,4 @@ ---- +o-- category: tool tool: ansible contributors: @@ -143,10 +143,9 @@ $ ansible-playbook path/name_of_the_playbook.yml #### ansible-roles (a 'template-playbooks' with right structure) - You already know the tasks (modules) that can be run via CLI. - The execution plans of multiple tasks (with variables and logic) are called playbooks. + You already know the tasks (modules) that can be run via CLI. You also know the playbooks - the execution plans of multiple tasks (with variables and logic). -A concept called `role` was introduced for parts of the code that should be reusable. +A concept called `role` was introduced for parts of the code (playbooks) that should be reusable. **Role** is a structured way to manage your set of tasks, variables, handlers, default settings, and way more (meta, files, templates). Role allows to reuse the same parts of code in multiple plybooks (you can parametrize the role 'further' during it's execution). @@ -173,7 +172,7 @@ pre_tasks: shell: echo 'this task is the last, but would be executed before roles, and before tasks' ``` -Example-role +Example->role We would clone the ready-to-use examples from additional repository ```bash @@ -183,30 +182,59 @@ $ source environment $(venv) ansible-playbook playbooks/role_example.yml ``` -Role directory structure: +#### Role directory structure: ``` roles/ some_role/ - defaults/ - files/ - templates/ - tasks/ - handlers/ - vars/ - meta/ + defaults/ # contains default variables + files/ # for static files + templates/ # for jinja templates + tasks/ # tasks + handlers/ # handlers + vars/ # more variables (higher priority) + meta/ # meta - package (role) info ``` #### Role Handlers -Handlers are a task that can be triggered (notified) during execution of a playbook, but they itself execute at the very end of a playbook. -It is a best way to restart a service, check if application port is open, etc. +Handlers are a tasks that can be triggered (notified) during execution of a playbook, but they itself execute at the very end of a playbook. +It is a best way to restart a service, check if application port is active (successfull deployment criteria), etc. ### ansible - variables -lookup's + +Ansible is flexible - it has 21 levels of variable precedence + +[read more] + +For now you might like to know, that CLI variables has the top priority. + +You should also know, that a nice way to pool some data is a **lookup** + +##### Lookups + +* pipe +* file +* stream +* etcd + +You can use them in CLI too ```yaml +ansible -m shell -a 'echo {{ my_variable }}` -e '{{ lookup('pipe'; 'date' }}" + ``` -#### templates -JINJA2 +#### Templates + +Template is a powerfull way to deliver some (partially) dynamic content. Ansible uses **Jinja2** langueage to describe the template. + +```jinja2 +Some static content + +{{ a_variable }} + +{% for item in loop_items %} + this line item is {{ item }} +{% endfor %} +``` ### ansible-vault From 05892ff7ddd69e5f01e9da6d9d602dd318d0485e Mon Sep 17 00:00:00 2001 From: sirkubax Date: Wed, 27 Sep 2017 18:34:38 +0200 Subject: [PATCH 37/90] test markdown --- ansible.html.markdown | 63 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 57 insertions(+), 6 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index 25a3828306..cadf630127 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -1,4 +1,8 @@ -o-- +# JM inventory dynamic aws ec2 +# vault +# roles + +--- category: tool tool: ansible contributors: @@ -218,7 +222,7 @@ You should also know, that a nice way to pool some data is a **lookup** You can use them in CLI too ```yaml -ansible -m shell -a 'echo {{ my_variable }}` -e '{{ lookup('pipe'; 'date' }}" +ansible -m shell -a 'echo {{ my_variable }}` -e '{{ lookup('pipe'; 'date' }}" localhost ``` @@ -235,16 +239,63 @@ Some static content this line item is {{ item }} {% endfor %} ``` +Jinja may have some limitations, but it is a powerfull tool that you might like. -### ansible-vault - -### inventory +#### Jinja2 CLI +You can use the jinja in the CLI too +```bash +ansible -m shell -a 'echo {{ my_variable }}` -e 'my_variable=something, playbook_parameter=twentytwo" localhost +``` -### dynamic inventory ### Jinja2 and templates jinja filters + +#### ansible-vault +To maintain **ifrastructure as a code** you need to store secrets. + Ansible provides a way to encrypt the poufne files so you can store it in the repository, yet the files are decrypted in-fly during ansible execution. + +The best way to use the **ansible-vault** is to store the secret in some secure location, and configure ansible to use during runtime. + +```bash +$ echo some_very_very_long_secret > ~/.ssh/secure_located_file + +$ vi ansible.cfg + ansible_vault_password_file = ~/.ssh/secure_located_file + +#or to use env +export ANSIBLE_VAULT_PASSWORD_FILE=~/.ssh/secure_located_file + +$ ansible-playbook playbooks/vault_example.yml + + # decrypt the file +$ ansible-vault encrypt path/somefile + + # view the file +$ ansible-vault view path/somefile + + # check the file content: +$ cat path/somefile + + # decrypt the file +$ ansible-vault decrypt path/somefile +``` + +#### dynamic inventory +You might like to know, that you can build your inventory dynamically. + +(For Ansible) inventory is just a JSON with proper structure - if you can deliver that to ansible - anything is possible. + +You do not need to invent the wheel - there are plenty ready to use inventory script for most popular Cloud provicers and a lot of in-house popular usecaseses. + +```bash +$ etc/inv/ec2.py --refresh + +$ ansible -m ping all -i etc/inv/ec2.py +``` + + ### ansible profiling - callback ### facts-cache and ansible-cmdb From 3c7153633842717cb9de7a96f5cd3da5982ffe50 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Wed, 27 Sep 2017 23:57:45 +0200 Subject: [PATCH 38/90] test markdown --- ansible.html.markdown | 713 +++++++----------------------------------- 1 file changed, 119 insertions(+), 594 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index cadf630127..0023a71889 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -1,7 +1,3 @@ -# JM inventory dynamic aws ec2 -# vault -# roles - --- category: tool tool: ansible @@ -247,10 +243,14 @@ You can use the jinja in the CLI too ansible -m shell -a 'echo {{ my_variable }}` -e 'my_variable=something, playbook_parameter=twentytwo" localhost ``` - -### Jinja2 and templates -jinja filters - +### Jinja2 filters +Junja is powerfull. It has built-in many usefull functions. +```jinja +# get first item of the list +{{ some_list | first() }} +# if variable is undefined - use default value +{{ some_variable | default('default_value') }} +``` #### ansible-vault To maintain **ifrastructure as a code** you need to store secrets. @@ -295,655 +295,180 @@ $ etc/inv/ec2.py --refresh $ ansible -m ping all -i etc/inv/ec2.py ``` +#### ansible profiling - callback +It is ok that your playbook executes some time. Sometimes you may like to speed things up :) -### ansible profiling - callback - -### facts-cache and ansible-cmdb - -### debugging ansible - -### Infrastructure as a code - what about Ansible -virtualenv - -### ansible - dynamic in AWS - -### create instance in AWS - -### create env in AWS - -### Naming - -## Bonus - -### writing own module - -### Python API - -### Web-UI: Ansible Tower, Jenkins, Rundeck - -#become-user, become - -### Tips and tricks -AND,XOR ---check --diff -tags -meta -no_logs - -## Introduction -Ansible is (one of the many) orchestration tools. It allows you to controll your environment (infrastructure and a code) and automate the manual tasks. -'You can think as simple as writing in bash with python API :) -Of course the rabit hole is way deeper.' - -Ansible have great integration with multiple operating systems (even Windows) and some hardware (switches, Firewalls, etc). It has multiple tools that integrate with the could providers. Almost every worth-notice cloud provider is present in the ecosystem (AWS, Azure, Google, DigitalOcean, OVH, etc...) - - - -## Main cons and pros - -### Cons - -It is an agent-less tool - every agent consumes up to 16MB ram - in some environments, it may be noticable amount. -It is agent-less - you have to verify your environment consistency 'on-demand' - there is no built-in mechanism taht would warn you about some change automatically (this can be achieved with reasonable effort - but it must be known) -Official GUI Tool (web inferface) - Ansible Tower - is more than GUI, but it is expensive. There is no 'small enterprice' payment plan. Easy workaround with Rundeck or Jenkins is possible with reasonable workload. - -### Pros - -It is an agent-less tools :) In most scenarios, it use ssh as a transport layer. -In some way you can use it as 'bash on steroids'. -It is very-very-very easy to start. If you are familiar with ssh concept - you already know ansible :) (almost). My personal record is: 'I did show how to install and use ansible (for simple raspberry pi cluster management) and it tool me 30 seconds to deliver a working tool !!!)' -I do provide a training services - I'm able to teach a production-ready person - in 8 hours (1 training day)! It covers all needed to work aspects! No other tool can match this ease of use! -It executes when you do it - other tools (salt, puppet, chef - might execute in different scenario than you would expect) -Documentation is at the world-class standard! -The comunity (github, stackOverflow) would help you very fast. -Writing own modules and extension is fairly easy. - - -### Neutral -Migration Ansible<->Salt is failrly easy - so if you would need an event-driven agent environment - it would be a good choice to start quick with Ansible, and convert to salt when needed. - -## Basics on ansible - -Ansible uses ssh or paramiko as a transport layer. In a way you can imagine that you are using a ssh with API to perform your action. -In the 'low-level' way you can use it to execute remote command in more controlled way (still using ssh). -On the other hand - in advanced scope - you can use python anible code as a library to your own python scrips! This is awesome! (if you know what you are doing). It is a bit like fabric then. - -But ansible is way more! It provides an execution plans, an API, library, callbacks, not forget to mention - COMUNITY! and great support by developers! - - - - ---- -Github template placeholder - to be removed - -### Centralized Versioning VS Distributed Versioning - -* Centralized version control focuses on synchronizing, tracking, and backing -up files. -* Distributed version control focuses on sharing changes. Every change has a -unique id. -* Distributed systems have no defined structure. You could easily have a SVN -style, centralized system, with git. - -[Additional Information](http://git-scm.com/book/en/Getting-Started-About-Version-Control) - -### Why Use Git? - -* Can work offline. -* Collaborating with others is easy! -* Branching is easy! -* Branching is fast! -* Merging is easy! -* Git is fast. -* Git is flexible. - -## Git Architecture - -### Repository - -A set of files, directories, historical records, commits, and heads. Imagine it -as a source code data structure, with the attribute that each source code -"element" gives you access to its revision history, among other things. - -A git repository is comprised of the .git directory & working tree. - -### .git Directory (component of repository) - -The .git directory contains all the configurations, logs, branches, HEAD, and -more. -[Detailed List.](http://gitready.com/advanced/2009/03/23/whats-inside-your-git-directory.html) - -### Working Tree (component of repository) - -This is basically the directories and files in your repository. It is often -referred to as your working directory. - -### Index (component of .git dir) - -The Index is the staging area in git. It's basically a layer that separates -your working tree from the Git repository. This gives developers more power -over what gets sent to the Git repository. - -### Commit - -A git commit is a snapshot of a set of changes, or manipulations to your -Working Tree. For example, if you added 5 files, and removed 2 others, these -changes will be contained in a commit (or snapshot). This commit can then be -pushed to other repositories, or not! - -### Branch - -A branch is essentially a pointer to the last commit you made. As you go on -committing, this pointer will automatically update to point the latest commit. - -### Tag - -A tag is a mark on specific point in history. Typically people use this -functionality to mark release points (v1.0, and so on) - -### HEAD and head (component of .git dir) - -HEAD is a pointer that points to the current branch. A repository only has 1 -*active* HEAD. -head is a pointer that points to any commit. A repository can have any number -of heads. - -### Stages of Git -* Modified - Changes have been made to a file but file has not been committed -to Git Database yet -* Staged - Marks a modified file to go into your next commit snapshot -* Committed - Files have been committed to the Git Database - -### Conceptual Resources - -* [Git For Computer Scientists](http://eagain.net/articles/git-for-computer-scientists/) -* [Git For Designers](http://hoth.entp.com/output/git_for_designers.html) - -## Commands - -### init - -Create an empty Git repository. The Git repository's settings, stored -information, and more is stored in a directory (a folder) named ".git". - -```bash -$ git init -``` - -### config - -To configure settings. Whether it be for the repository, the system itself, -or global configurations ( global config file is `~/.gitconfig` ). +Since ansible 2.x there is bouilt-in callback for task execution profiling -```bash -# Print & Set Some Basic Config Variables (Global) -$ git config --global user.email "MyEmail@Zoho.com" -$ git config --global user.name "My Name" ``` - -[Learn More About git config.](http://git-scm.com/docs/git-config) - -### help - -To give you quick access to an extremely detailed guide of each command. Or to -just give you a quick reminder of some semantics. - -```bash -# Quickly check available commands -$ git help - -# Check all available commands -$ git help -a - -# Command specific help - user manual -# git help -$ git help add -$ git help commit -$ git help init -# or git --help -$ git add --help -$ git commit --help -$ git init --help +vi ansible.cfg +#set this to: +callback_whitelist = profile_tasks ``` -### ignore files +#### facts-cache and ansible-cmdb +You can pool some infrmations of you environment from another hosts. +If the informations does not change - you may consider using a facts_cache to speed things up. -To intentionally untrack file(s) & folder(s) from git. Typically meant for -private & temp files which would otherwise be shared in the repository. -```bash -$ echo "temp/" >> .gitignore -$ echo "private_key" >> .gitignore ``` +vi ansible.cfg -### status - -To show differences between the index file (basically your working copy/repo) -and the current HEAD commit. - -```bash -# Will display the branch, untracked files, changes and other differences -$ git status - -# To learn other "tid bits" about git status -$ git help status +# if set to a persistent type (not 'memory', for example 'redis') fact values +# from previous runs in Ansible will be stored. This may be useful when +# wanting to use, for example, IP information from one group of servers +# without having to talk to them in the same playbook run to get their +# current IP information. +fact_caching = jsonfile +fact_caching_connection = ~/facts_cache +fact_caching_timeout = 86400 ``` -### add +I like to use `jsonfile` as my backend. It allows to use another project +`ansible-cmdb` [github] that generates a HTML page of your inventory resources. A nice 'free' addition! -To add files to the staging area/index. If you do not `git add` new files to -the staging area/index, they will not be included in commits! +#### debugging ansible +When your job fails - it is good to be effective with debugging. -```bash -# add a file in your current working directory -$ git add HelloWorld.java - -# add a file in a nested dir -$ git add /path/to/file/HelloWorld.c - -# Regular Expression support! -$ git add ./*.java -``` +1. Increase verbosiy by using multiple -v **[ -vvvvv]** +2. If variable is undefined +3. If variable (dictionary or a list) is undefined +4. Jinja template debug -This only adds a file to the staging area/index, it doesn't commit it to the -working directory/repo. - -### branch - -Manage your branches. You can view, edit, create, delete branches using this -command. +#### Infrastructure as a code - what about Ansible +You already know, that ansible-vault allow you to store your poufne data along with your code (in repository). You can go further - and define your ansible installation and configuration as-a-code. +See `environment.sh` to learn how to install the ansible itself inside a `virtualenv` that is not attached to your operating system (can be changed by non-privilages user), and as additiinal benefit - upgrading version of ansible is as easy as installing new version in new virtualenv. You can have multiple versions of Ansible present in the same time. This is very helpfull! ```bash -# list existing branches & remotes -$ git branch -a - -# create a new branch -$ git branch myNewBranch - -# delete a branch -$ git branch -d myBranch + # recreate ansible 2.x venv +$ rm -rf venv2 +$ source environment2.sh + # execute playbook +(venv2)$ ansible-playbook playbooks/ansible1.9_playbook.yml # would fail - deprecated syntax -# rename a branch -# git branch -m -$ git branch -m myBranchName myNewBranchName + # now lets install ansible 1.9.x next to ansible 2.x +(venv2)$ deactivate +$ source environment.1.9.sh + # execute playbook +(venv1.9)$ ansible-playbook playbooks/ansible1.9_playbook.yml # works! -# edit a branch's description -$ git branch myBranchName --edit-description -``` - -### tag - -Manage your tags - -```bash -# List tags -$ git tag - -# Create a annotated tag -# The -m specifies a tagging message,which is stored with the tag. -# If you don’t specify a message for an annotated tag, -# Git launches your editor so you can type it in. -$ git tag -a v2.0 -m 'my version 2.0' - -# Show info about tag -# That shows the tagger information, the date the commit was tagged, -# and the annotation message before showing the commit information. -$ git show v2.0 - -# Push a single tag to remote -$ git push origin v2.0 - -# Push a lot of tags to remote -$ git push origin --tags -``` - -### checkout - -Updates all files in the working tree to match the version in the index, or -specified tree. - -```bash -# Checkout a repo - defaults to master branch -$ git checkout - -# Checkout a specified branch -$ git checkout branchName - -# Create a new branch & switch to it -# equivalent to "git branch ; git checkout " - -$ git checkout -b newBranch -``` - -### clone - -Clones, or copies, an existing repository into a new directory. It also adds -remote-tracking branches for each branch in the cloned repo, which allows you -to push to a remote branch. - -```bash -# Clone learnxinyminutes-docs -$ git clone https://github.com/adambard/learnxinyminutes-docs.git - -# shallow clone - faster cloning that pulls only latest snapshot -$ git clone --depth 1 https://github.com/adambard/learnxinyminutes-docs.git - -# clone only a specific branch -$ git clone -b master-cn https://github.com/adambard/learnxinyminutes-docs.git --single-branch -``` - -### commit - -Stores the current contents of the index in a new "commit." This commit -contains the changes made and a message created by the user. - -```bash -# commit with a message -$ git commit -m "Added multiplyNumbers() function to HelloWorld.c" - -# automatically stage modified or deleted files, except new files, and then commit -$ git commit -a -m "Modified foo.php and removed bar.php" - -# change last commit (this deletes previous commit with a fresh commit) -$ git commit --amend -m "Correct message" -``` - -### diff - -Shows differences between a file in the working directory, index and commits. - -```bash -# Show difference between your working dir and the index -$ git diff - -# Show differences between the index and the most recent commit. -$ git diff --cached - -# Show differences between your working dir and the most recent commit -$ git diff HEAD -``` - -### grep - -Allows you to quickly search a repository. - -Optional Configurations: - -```bash -# Thanks to Travis Jeffery for these -# Set line numbers to be shown in grep search results -$ git config --global grep.lineNumber true - -# Make search results more readable, including grouping -$ git config --global alias.g "grep --break --heading --line-number" -``` - -```bash -# Search for "variableName" in all java files -$ git grep 'variableName' -- '*.java' - -# Search for a line that contains "arrayListName" and, "add" or "remove" -$ git grep -e 'arrayListName' --and \( -e add -e remove \) -``` - -Google is your friend; for more examples -[Git Grep Ninja](http://travisjeffery.com/b/2012/02/search-a-git-repo-like-a-ninja) - -### log - -Display commits to the repository. - -```bash -# Show all commits -$ git log - -# Show only commit message & ref -$ git log --oneline - -# Show merge commits only -$ git log --merges - -# Show all commits represented by an ASCII graph -$ git log --graph -``` - -### merge - -"Merge" in changes from external commits into the current branch. - -```bash -# Merge the specified branch into the current. -$ git merge branchName - -# Always generate a merge commit when merging -$ git merge --no-ff branchName -``` - -### mv - -Rename or move a file - -```bash -# Renaming a file -$ git mv HelloWorld.c HelloNewWorld.c - -# Moving a file -$ git mv HelloWorld.c ./new/path/HelloWorld.c - -# Force rename or move -# "existingFile" already exists in the directory, will be overwritten -$ git mv -f myFile existingFile -``` - -### pull - -Pulls from a repository and merges it with another branch. - -```bash -# Update your local repo, by merging in new changes -# from the remote "origin" and "master" branch. -# git pull -$ git pull origin master - -# By default, git pull will update your current branch -# by merging in new changes from its remote-tracking branch -$ git pull - -# Merge in changes from remote branch and rebase -# branch commits onto your local repo, like: "git fetch , git -# rebase /" -$ git pull origin master --rebase -``` - -### push - -Push and merge changes from a branch to a remote & branch. - -```bash -# Push and merge changes from a local repo to a -# remote named "origin" and "master" branch. -# git push -$ git push origin master - -# By default, git push will push and merge changes from -# the current branch to its remote-tracking branch -$ git push - -# To link up current local branch with a remote branch, add -u flag: -$ git push -u origin master -# Now, anytime you want to push from that same local branch, use shortcut: -$ git push + # please note that you have both venv1.9 and venv2 present - you need to (de)activate one - that is all ``` +### Naming -### stash +### Bonus -Stashing takes the dirty state of your working directory and saves it on a -stack of unfinished changes that you can reapply at any time. +### writing own module -Let's say you've been doing some work in your git repo, but you want to pull -from the remote. Since you have dirty (uncommited) changes to some files, you -are not able to run `git pull`. Instead, you can run `git stash` to save your -changes onto a stack! +### Python API -```bash -$ git stash -Saved working directory and index state \ - "WIP on master: 049d078 added the index file" - HEAD is now at 049d078 added the index file - (To restore them type "git stash apply") -``` +### Web-UI: Ansible Tower, Jenkins, Rundeck -Now you can pull! +#### Ansible Tower +Ansible provides a Web User Interface called `Ansible Tower`. +It is a convienient way to run Ansible Playbooks, have proper user management, log retention, and cron (periodic jobs). -```bash -git pull -``` -`...changes apply...` +Personaly I'm not a fan of it - it's to expensive for my cases, and the trial is 10 inventory-hosts only. -Now check that everything is OK +For my usecases I hide the 'pure ansible' commands behind other projects. -```bash -$ git status -# On branch master -nothing to commit, working directory clean -``` +#### Rundeck +This is nice, secure interface, that allows you to execute a jobs of your choice (CLI, script, execution plan). +It can perform roling-deployment (without Ansible), can integrate with clouds, etc. -You can see what "hunks" you've stashed so far using `git stash list`. -Since the "hunks" are stored in a Last-In-First-Out stack, our most recent -change will be at top. +#### Jenkins +For my 'business cases' I use Jenkins - it has a 'cron', jobs can be binded into 'pipelines'. -```bash -$ git stash list -stash@{0}: WIP on master: 049d078 added the index file -stash@{1}: WIP on master: c264051 Revert "added file_size" -stash@{2}: WIP on master: 21d80a5 added number to log -``` - -Now let's apply our dirty changes back by popping them off the stack. - -```bash -$ git stash pop -# On branch master -# Changes not staged for commit: -# (use "git add ..." to update what will be committed) -# -# modified: index.html -# modified: lib/simplegit.rb -# -``` +### become-user, become +### ansible - dynamic in AWS +### create instance in AWS +### create env in AWS -`git stash apply` does the same thing +### Tips and tricks -Now you're ready to get back to work on your stuff! +##### --check -C +Always make sure that your playbook can executes in 'dry run' mode (--check), and it's execution is not declaring 'Changed' objects. -[Additional Reading.](http://git-scm.com/book/en/v1/Git-Tools-Stashing) +##### --diff -D +Diff is usefull to see nice detail of the files changed -### rebase (caution) +It compare 'in memory' the files like `diff -BbruN fileA fileB` -Take all changes that were committed on one branch, and replay them onto -another branch. -*Do not rebase commits that you have pushed to a public repo*. +##### Execute hosts with 'regex' ```bash -# Rebase experimentBranch onto master -# git rebase -$ git rebase master experimentBranch +ansible -m ping web* ``` -[Additional Reading.](http://git-scm.com/book/en/Git-Branching-Rebasing) - -### reset (caution) - -Reset the current HEAD to the specified state. This allows you to undo merges, -pulls, commits, adds, and more. It's a great command but also dangerous if you -don't know what you are doing. +##### +Host groups can be joined, negated, etc ```bash -# Reset the staging area, to match the latest commit (leaves dir unchanged) -$ git reset - -# Reset the staging area, to match the latest commit, and overwrite working dir -$ git reset --hard - -# Moves the current branch tip to the specified commit (leaves dir unchanged) -# all changes still exist in the directory. -$ git reset 31f2bb1 - -# Moves the current branch tip backward to the specified commit -# and makes the working dir match (deletes uncommited changes and all commits -# after the specified commit). -$ git reset --hard 31f2bb1 +ansible -m ping web*:!backend:monitoring:&allow_change ``` -### reflog (caution) +##### Tagging +You should tag some (not all) objects - a task in a playbook, all tasks included form a role, etc. +It allwos you to execute the choosen parts of the playbook. -Reflog will list most of the git commands you have done for a given time period, -default 90 days. +##### no_logs: True +You may see, that some roles print a lot of output in verbose mode. There is also a debug module. +This is the place where credentials may leak. Use `no_log` to hide the output. -This give you the a change to reverse any git commands that have gone wrong -for instance if a rebase is has broken your application. +##### Debug module +allows to print a value to the screen -You can do this: +##### Register the output of a task +You can register the output (stdout), rc (return code), stderr of a task with the `register` command. -1. `git reflog` to list all of the git commands for the rebase -``` -38b323f HEAD@{0}: rebase -i (finish): returning to refs/heads/feature/add_git_reflog -38b323f HEAD@{1}: rebase -i (pick): Clarify inc/dec operators -4fff859 HEAD@{2}: rebase -i (pick): Update java.html.markdown -34ed963 HEAD@{3}: rebase -i (pick): [yaml/en] Add more resources (#1666) -ed8ddf2 HEAD@{4}: rebase -i (pick): pythonstatcomp spanish translation (#1748) -2e6c386 HEAD@{5}: rebase -i (start): checkout 02fb96d -``` -2. Select where to reset to, in our case its `2e6c386`, or `HEAD@{5}` -3. 'git reset --hard HEAD@{5}' this will reset your repo to that head -4. You can start the rebase again or leave it alone. +##### Conditionals: when: -[Additional Reading.](https://git-scm.com/docs/git-reflog) +##### Loop: with, with_items, with_dict, with_together -### revert -Revert can be used to undo a commit. It should not be confused with reset which -restores the state of a project to a previous point. Revert will add a new -commit which is the inverse of the specified commit, thus reverting it. +## Introduction +Ansible is (one of the many) orchestration tools. It allows you to controll your environment (infrastructure and a code) and automate the manual tasks. +'You can think as simple as writing in bash with python API :) +Of course the rabit hole is way deeper.' -```bash -# Revert a specified commit -$ git revert -``` +Ansible have great integration with multiple operating systems (even Windows) and some hardware (switches, Firewalls, etc). It has multiple tools that integrate with the could providers. Almost every worth-notice cloud provider is present in the ecosystem (AWS, Azure, Google, DigitalOcean, OVH, etc...) -### rm -The opposite of git add, git rm removes files from the current working tree. -```bash -# remove HelloWorld.c -$ git rm HelloWorld.c +## Main cons and pros -# Remove a file from a nested dir -$ git rm /pather/to/the/file/HelloWorld.c -``` +### Cons -## Further Information +It is an agent-less tool - every agent consumes up to 16MB ram - in some environments, it may be noticable amount. +It is agent-less - you have to verify your environment consistency 'on-demand' - there is no built-in mechanism taht would warn you about some change automatically (this can be achieved with reasonable effort - but it must be known) +Official GUI Tool (web inferface) - Ansible Tower - is more than GUI, but it is expensive. There is no 'small enterprice' payment plan. Easy workaround with Rundeck or Jenkins is possible with reasonable workload. -* [tryGit - A fun interactive way to learn Git.](http://try.github.io/levels/1/challenges/1) +### Pros -* [Learn Git Branching - the most visual and interactive way to learn Git on the web](http://learngitbranching.js.org/) +It is an agent-less tools :) In most scenarios, it use ssh as a transport layer. +In some way you can use it as 'bash on steroids'. +It is very-very-very easy to start. If you are familiar with ssh concept - you already know ansible :) (almost). My personal record is: 'I did show how to install and use ansible (for simple raspberry pi cluster management) and it tool me 30 seconds to deliver a working tool !!!)' +I do provide a training services - I'm able to teach a production-ready person - in 8 hours (1 training day)! It covers all needed to work aspects! No other tool can match this ease of use! +It executes when you do it - other tools (salt, puppet, chef - might execute in different scenario than you would expect) +Documentation is at the world-class standard! +The comunity (github, stackOverflow) would help you very fast. +Writing own modules and extension is fairly easy. -* [Udemy Git Tutorial: A Comprehensive Guide](https://blog.udemy.com/git-tutorial-a-comprehensive-guide/) -* [Git Immersion - A Guided tour that walks through the fundamentals of git](http://gitimmersion.com/) +### Neutral +Migration Ansible<->Salt is failrly easy - so if you would need an event-driven agent environment - it would be a good choice to start quick with Ansible, and convert to salt when needed. -* [git-scm - Video Tutorials](http://git-scm.com/videos) +## Basics on ansible -* [git-scm - Documentation](http://git-scm.com/docs) +Ansible uses ssh or paramiko as a transport layer. In a way you can imagine that you are using a ssh with API to perform your action. +In the 'low-level' way you can use it to execute remote command in more controlled way (still using ssh). +On the other hand - in advanced scope - you can use python anible code as a library to your own python scrips! This is awesome! (if you know what you are doing). It is a bit like fabric then. -* [Atlassian Git - Tutorials & Workflows](https://www.atlassian.com/git/) +But ansible is way more! It provides an execution plans, an API, library, callbacks, not forget to mention - COMUNITY! and great support by developers! -* [SalesForce Cheat Sheet](http://res.cloudinary.com/hy4kyit2a/image/upload/SF_git_cheatsheet.pdf) -* [GitGuys](http://www.gitguys.com/) -* [Git - the simple guide](http://rogerdudler.github.io/git-guide/index.html) -* [Pro Git](http://www.git-scm.com/book/en/v2) +# JM inventory dynamic aws ec2 +# vault +# roles -* [An introduction to Git and GitHub for Beginners (Tutorial)](http://product.hubspot.com/blog/git-and-github-tutorial-for-beginners) From bb4deacd225d410e6c0b09c67cc2b889c4825ff3 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Thu, 28 Sep 2017 00:02:01 +0200 Subject: [PATCH 39/90] test markdown --- ansible.html.markdown | 50 ++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 27 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index 0023a71889..9c1b86e850 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -47,7 +47,7 @@ There are few commands you should know about * and other! ### Module -_*program (usally python) that execute, do some work and return proper JSON output :)*_ +_*program (usally python) that execute, do some work and return proper JSON output *_ This *program* perform specialized task/action (like manage instances in the cloud, execute shell command). @@ -78,28 +78,6 @@ $ ansible -m command -a 'whoami' all * Module: `file` - performs file operations (stat, link, dir, ...) * Module: `raw` - executes a low-down and dirty SSH command, not going through the module subsystem (usefull to install python2.7) - -## Ansible - naming and quick intro - -### Inventory -Inventory is a set of an objects or hosts, against which we are executing our playbooks or single tasks via shell commands -For this few minutes, lets asume that we are using default ansible inventory (which in Debian based system is placed in /etc/ansible/hosts) - -`/etc/ansible/hosts` -``` -localhost - -[some_group] -hostA.mydomain.com -hostB.localdomain - -[a_group_of_a_groups:children] -some_group -some_other_group - -``` -* [Additional Reading.](http://docs.ansible.com/ansible/latest/intro_inventory.html) - ### Task Execution of a single Ansible **module** is called a **task** @@ -141,6 +119,24 @@ $ ansible-playbook path/name_of_the_playbook.yml ``` ### More on ansible concept +### Inventory +Inventory is a set of an objects or hosts, against which we are executing our playbooks or single tasks via shell commands +For this few minutes, lets asume that we are using default ansible inventory (which in Debian based system is placed in /etc/ansible/hosts) + +`/etc/ansible/hosts` +``` +localhost + +[some_group] +hostA.mydomain.com +hostB.localdomain + +[a_group_of_a_groups:children] +some_group +some_other_group + +``` +* [Additional Reading.](http://docs.ansible.com/ansible/latest/intro_inventory.html) #### ansible-roles (a 'template-playbooks' with right structure) You already know the tasks (modules) that can be run via CLI. You also know the playbooks - the execution plans of multiple tasks (with variables and logic). @@ -296,7 +292,7 @@ $ ansible -m ping all -i etc/inv/ec2.py ``` #### ansible profiling - callback -It is ok that your playbook executes some time. Sometimes you may like to speed things up :) +It is ok that your playbook executes some time. Sometimes you may like to speed things up Since ansible 2.x there is bouilt-in callback for task execution profiling @@ -427,7 +423,7 @@ You can register the output (stdout), rc (return code), stderr of a task with th ## Introduction Ansible is (one of the many) orchestration tools. It allows you to controll your environment (infrastructure and a code) and automate the manual tasks. -'You can think as simple as writing in bash with python API :) +'You can think as simple as writing in bash with python API Of course the rabit hole is way deeper.' Ansible have great integration with multiple operating systems (even Windows) and some hardware (switches, Firewalls, etc). It has multiple tools that integrate with the could providers. Almost every worth-notice cloud provider is present in the ecosystem (AWS, Azure, Google, DigitalOcean, OVH, etc...) @@ -444,9 +440,9 @@ Official GUI Tool (web inferface) - Ansible Tower - is more than GUI, but it is ### Pros -It is an agent-less tools :) In most scenarios, it use ssh as a transport layer. +It is an agent-less tools In most scenarios, it use ssh as a transport layer. In some way you can use it as 'bash on steroids'. -It is very-very-very easy to start. If you are familiar with ssh concept - you already know ansible :) (almost). My personal record is: 'I did show how to install and use ansible (for simple raspberry pi cluster management) and it tool me 30 seconds to deliver a working tool !!!)' +It is very-very-very easy to start. If you are familiar with ssh concept - you already know ansible (ALMOST). My personal record is: 'I did show how to install and use ansible (for simple raspberry pi cluster management) and it tool me 30 seconds to deliver a working tool !!!)' I do provide a training services - I'm able to teach a production-ready person - in 8 hours (1 training day)! It covers all needed to work aspects! No other tool can match this ease of use! It executes when you do it - other tools (salt, puppet, chef - might execute in different scenario than you would expect) Documentation is at the world-class standard! From 6c378a858964a5c5d656e39f8fec110b584e7bd0 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Thu, 28 Sep 2017 00:02:50 +0200 Subject: [PATCH 40/90] test markdown --- ansible.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index 9c1b86e850..1cf77033a6 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -47,7 +47,7 @@ There are few commands you should know about * and other! ### Module -_*program (usally python) that execute, do some work and return proper JSON output *_ +_program (usally python) that execute, do some work and return proper JSON output_ This *program* perform specialized task/action (like manage instances in the cloud, execute shell command). From c2bcf94c80e1bfc2314014a8e7dd0858c6e4207c Mon Sep 17 00:00:00 2001 From: sirkubax Date: Thu, 28 Sep 2017 00:05:12 +0200 Subject: [PATCH 41/90] test markdown --- ansible.html.markdown | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index 1cf77033a6..d68eafd80b 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -137,7 +137,7 @@ some_other_group ``` * [Additional Reading.](http://docs.ansible.com/ansible/latest/intro_inventory.html) -#### ansible-roles (a 'template-playbooks' with right structure) +### ansible-roles (a 'template-playbooks' with right structure) You already know the tasks (modules) that can be run via CLI. You also know the playbooks - the execution plans of multiple tasks (with variables and logic). @@ -205,7 +205,7 @@ For now you might like to know, that CLI variables has the top priority. You should also know, that a nice way to pool some data is a **lookup** -##### Lookups +### Lookups * pipe * file @@ -218,7 +218,7 @@ ansible -m shell -a 'echo {{ my_variable }}` -e '{{ lookup('pipe'; 'date' }}" lo ``` -#### Templates +### Templates Template is a powerfull way to deliver some (partially) dynamic content. Ansible uses **Jinja2** langueage to describe the template. @@ -233,7 +233,7 @@ Some static content ``` Jinja may have some limitations, but it is a powerfull tool that you might like. -#### Jinja2 CLI +### Jinja2 CLI You can use the jinja in the CLI too ```bash ansible -m shell -a 'echo {{ my_variable }}` -e 'my_variable=something, playbook_parameter=twentytwo" localhost @@ -248,7 +248,7 @@ Junja is powerfull. It has built-in many usefull functions. {{ some_variable | default('default_value') }} ``` -#### ansible-vault +### ansible-vault To maintain **ifrastructure as a code** you need to store secrets. Ansible provides a way to encrypt the poufne files so you can store it in the repository, yet the files are decrypted in-fly during ansible execution. @@ -278,7 +278,7 @@ $ cat path/somefile $ ansible-vault decrypt path/somefile ``` -#### dynamic inventory +### dynamic inventory You might like to know, that you can build your inventory dynamically. (For Ansible) inventory is just a JSON with proper structure - if you can deliver that to ansible - anything is possible. @@ -291,7 +291,7 @@ $ etc/inv/ec2.py --refresh $ ansible -m ping all -i etc/inv/ec2.py ``` -#### ansible profiling - callback +### ansible profiling - callback It is ok that your playbook executes some time. Sometimes you may like to speed things up Since ansible 2.x there is bouilt-in callback for task execution profiling @@ -302,7 +302,7 @@ vi ansible.cfg callback_whitelist = profile_tasks ``` -#### facts-cache and ansible-cmdb +### facts-cache and ansible-cmdb You can pool some infrmations of you environment from another hosts. If the informations does not change - you may consider using a facts_cache to speed things up. @@ -322,7 +322,7 @@ fact_caching_timeout = 86400 I like to use `jsonfile` as my backend. It allows to use another project `ansible-cmdb` [github] that generates a HTML page of your inventory resources. A nice 'free' addition! -#### debugging ansible +### debugging ansible When your job fails - it is good to be effective with debugging. 1. Increase verbosiy by using multiple -v **[ -vvvvv]** @@ -330,7 +330,7 @@ When your job fails - it is good to be effective with debugging. 3. If variable (dictionary or a list) is undefined 4. Jinja template debug -#### Infrastructure as a code - what about Ansible +### Infrastructure as a code - what about Ansible You already know, that ansible-vault allow you to store your poufne data along with your code (in repository). You can go further - and define your ansible installation and configuration as-a-code. See `environment.sh` to learn how to install the ansible itself inside a `virtualenv` that is not attached to your operating system (can be changed by non-privilages user), and as additiinal benefit - upgrading version of ansible is as easy as installing new version in new virtualenv. You can have multiple versions of Ansible present in the same time. This is very helpfull! @@ -379,46 +379,46 @@ For my 'business cases' I use Jenkins - it has a 'cron', jobs can be binded into ### create instance in AWS ### create env in AWS -### Tips and tricks +## Tips and tricks -##### --check -C +#### --check -C Always make sure that your playbook can executes in 'dry run' mode (--check), and it's execution is not declaring 'Changed' objects. -##### --diff -D +#### --diff -D Diff is usefull to see nice detail of the files changed It compare 'in memory' the files like `diff -BbruN fileA fileB` -##### Execute hosts with 'regex' +#### Execute hosts with 'regex' ```bash ansible -m ping web* ``` -##### +#### Host groups can be joined, negated, etc ```bash ansible -m ping web*:!backend:monitoring:&allow_change ``` -##### Tagging +#### Tagging You should tag some (not all) objects - a task in a playbook, all tasks included form a role, etc. It allwos you to execute the choosen parts of the playbook. -##### no_logs: True +#### no_logs: True You may see, that some roles print a lot of output in verbose mode. There is also a debug module. This is the place where credentials may leak. Use `no_log` to hide the output. -##### Debug module +#### Debug module allows to print a value to the screen -##### Register the output of a task +#### Register the output of a task You can register the output (stdout), rc (return code), stderr of a task with the `register` command. -##### Conditionals: when: +#### Conditionals: when: -##### Loop: with, with_items, with_dict, with_together +#### Loop: with, with_items, with_dict, with_together ## Introduction From a090f8fd0af03ca558d57392a60edf6aa7184f4f Mon Sep 17 00:00:00 2001 From: sirkubax Date: Thu, 28 Sep 2017 00:07:12 +0200 Subject: [PATCH 42/90] test markdown --- ansible.html.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ansible.html.markdown b/ansible.html.markdown index d68eafd80b..699e441943 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -291,6 +291,8 @@ $ etc/inv/ec2.py --refresh $ ansible -m ping all -i etc/inv/ec2.py ``` +Read also about `dynamic inventory` below + ### ansible profiling - callback It is ok that your playbook executes some time. Sometimes you may like to speed things up From 1f035686ef8f6605d8e43c1c6138bae10c4f9b0d Mon Sep 17 00:00:00 2001 From: sirkubax Date: Fri, 20 Oct 2017 21:42:16 +0200 Subject: [PATCH 43/90] set -e - again --- ansible.html.markdown | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index 699e441943..e17e543f11 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -376,10 +376,7 @@ It can perform roling-deployment (without Ansible), can integrate with clouds, #### Jenkins For my 'business cases' I use Jenkins - it has a 'cron', jobs can be binded into 'pipelines'. -### become-user, become -### ansible - dynamic in AWS -### create instance in AWS -### create env in AWS +#### become-user, become ## Tips and tricks @@ -470,3 +467,6 @@ But ansible is way more! It provides an execution plans, an API, library, callba # vault # roles +#### ansible - dynamic in AWS +#### create instance in AWS +#### create env in AWS From 66055cf822018d1c2f38b352919c5ccdc4aeb437 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Fri, 20 Oct 2017 22:31:58 +0200 Subject: [PATCH 44/90] set -e - again --- ansible.html.markdown | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index e17e543f11..c495b30880 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -109,6 +109,7 @@ hosts: all tasks: - name: "ping all" ping: + - name: "execute a shell command" shell: "date; whoami; df -h;" ``` @@ -174,8 +175,12 @@ We would clone the ready-to-use examples from additional repository ```bash $ git colone git@github.com:sirkubax/ansible-for-learnXinYminutes.git $ cd ansible-for-learnXinYminutes -$ source environment -$(venv) ansible-playbook playbooks/role_example.yml +$ source environment.sh +(venv) u@host:~/ansible-for-learnXinYminutes$ ansible-playbook playbooks/role_example.yml + +# First lets execute the simple_playbook.yml +(venv) user@host:~/ansible-for-learnXinYminute$ ansible-playbook playbook/simple_playbook.yml + ``` #### Role directory structure: From d81ed7f3b7bfdc748b74f75debd5451cb5bbee59 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Fri, 20 Oct 2017 23:24:45 +0200 Subject: [PATCH 45/90] set -e - again --- ansible.html.markdown | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index c495b30880..d134c073bf 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -169,18 +169,23 @@ pre_tasks: shell: echo 'this task is the last, but would be executed before roles, and before tasks' ``` -Example->role - -We would clone the ready-to-use examples from additional repository +#### We would use repository with *ready to use* examples +We would clone the repository ```bash $ git colone git@github.com:sirkubax/ansible-for-learnXinYminutes.git $ cd ansible-for-learnXinYminutes $ source environment.sh -(venv) u@host:~/ansible-for-learnXinYminutes$ ansible-playbook playbooks/role_example.yml +$ +$# First lets execute the simple_playbook.yml +(venv) user@host:~/ansible-for-learnXinYminutes$ ansible-playbook playbook/simple_playbook.yml -# First lets execute the simple_playbook.yml -(venv) user@host:~/ansible-for-learnXinYminute$ ansible-playbook playbook/simple_playbook.yml +``` +```bash +$ source environment.sh +$ +$# Now we would run the above playbook with roles +(venv) user@host:~/ansible-for-learnXinYminutes$ ansible-playbook playbooks/role_example.yml ``` #### Role directory structure: From 340f30f3410602e649c224eb9804f826d2fc8e0e Mon Sep 17 00:00:00 2001 From: sirkubax Date: Fri, 20 Oct 2017 23:26:03 +0200 Subject: [PATCH 46/90] set -e - again --- ansible.html.markdown | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index d134c073bf..d3a0fb348a 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -176,15 +176,14 @@ $ git colone git@github.com:sirkubax/ansible-for-learnXinYminutes.git $ cd ansible-for-learnXinYminutes $ source environment.sh $ -$# First lets execute the simple_playbook.yml +$ # First lets execute the simple_playbook.yml (venv) user@host:~/ansible-for-learnXinYminutes$ ansible-playbook playbook/simple_playbook.yml ``` ```bash $ source environment.sh -$ -$# Now we would run the above playbook with roles +$ # Now we would run the above playbook with roles (venv) user@host:~/ansible-for-learnXinYminutes$ ansible-playbook playbooks/role_example.yml ``` From 1a935188969deac50f30fe356422d8003188afbb Mon Sep 17 00:00:00 2001 From: sirkubax Date: Fri, 20 Oct 2017 23:29:13 +0200 Subject: [PATCH 47/90] set -e - again --- ansible.html.markdown | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index d3a0fb348a..91442dbfe7 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -171,10 +171,12 @@ pre_tasks: #### We would use repository with *ready to use* examples We would clone the repository +This example install ansible in `virtualenv` so it is independend from a system. You need to init it with `source environment.sh` command + ```bash $ git colone git@github.com:sirkubax/ansible-for-learnXinYminutes.git -$ cd ansible-for-learnXinYminutes -$ source environment.sh +user@host:~/$ cd ansible-for-learnXinYminutes +user@host:~/ansible-for-learnXinYminutes$ source environment.sh $ $ # First lets execute the simple_playbook.yml (venv) user@host:~/ansible-for-learnXinYminutes$ ansible-playbook playbook/simple_playbook.yml From 738f09d92596b3c9f12477d4e0ac88f9ad9c7c76 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Fri, 20 Oct 2017 23:30:15 +0200 Subject: [PATCH 48/90] set -e - again --- ansible.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index 91442dbfe7..ee313f2c57 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -170,7 +170,7 @@ pre_tasks: ``` #### We would use repository with *ready to use* examples -We would clone the repository +For remaining examples we would clone the repository This example install ansible in `virtualenv` so it is independend from a system. You need to init it with `source environment.sh` command ```bash From a3e6e2bb3b4ed325cd6fea0cc4f7590cb198849f Mon Sep 17 00:00:00 2001 From: sirkubax Date: Fri, 20 Oct 2017 23:31:14 +0200 Subject: [PATCH 49/90] set -e - again --- ansible.html.markdown | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index ee313f2c57..57f559efee 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -169,8 +169,7 @@ pre_tasks: shell: echo 'this task is the last, but would be executed before roles, and before tasks' ``` -#### We would use repository with *ready to use* examples -For remaining examples we would clone the repository +#### For remaining examples we would use repository with *ready to use* examples This example install ansible in `virtualenv` so it is independend from a system. You need to init it with `source environment.sh` command ```bash From 68eae69fb5471f645265216967044905f3471a29 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Fri, 20 Oct 2017 23:32:41 +0200 Subject: [PATCH 50/90] set -e - again --- ansible.html.markdown | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index 57f559efee..04862a14a6 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -169,7 +169,7 @@ pre_tasks: shell: echo 'this task is the last, but would be executed before roles, and before tasks' ``` -#### For remaining examples we would use repository with *ready to use* examples +#### For remaining examples we would use additional repository This example install ansible in `virtualenv` so it is independend from a system. You need to init it with `source environment.sh` command ```bash @@ -182,6 +182,7 @@ $ # First lets execute the simple_playbook.yml ``` +Run the above playbook with roles example ```bash $ source environment.sh $ # Now we would run the above playbook with roles From ceac9628c238b8835df8d7c0154c7a91d60ac74f Mon Sep 17 00:00:00 2001 From: sirkubax Date: Fri, 20 Oct 2017 23:45:03 +0200 Subject: [PATCH 51/90] set -e - again --- ansible.html.markdown | 46 +++++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index 04862a14a6..bd0200f668 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -104,14 +104,14 @@ This example-playbook would execute (on all hosts defined in the inventory) two * `shell` that execute three commands and return the output to our terminal ```yml -hosts: all - -tasks: - - name: "ping all" - ping: - - - name: "execute a shell command" - shell: "date; whoami; df -h;" +- hosts: all + + tasks: + - name: "ping all" + ping: + + - name: "execute a shell command" + shell: "date; whoami; df -h;" ``` You can run the playbook with the command: @@ -152,21 +152,21 @@ Role can be included in your playbook (executed via your playbook). ```yml -hosts: all - -tasks: - - name: "ping all" - ping: - - name: "execute a shell command" - shell: "date; whoami; df -h;" - -role: - - some_role - - { role: another_role, some_variable: 'learnxiny', tags: ['my_tag'] } - -pre_tasks: - - name: some pre-task - shell: echo 'this task is the last, but would be executed before roles, and before tasks' +- hosts: all + + tasks: + - name: "ping all" + ping: + - name: "execute a shell command" + shell: "date; whoami; df -h;" + + roles: + - some_role + - { role: another_role, some_variable: 'learnxiny', tags: ['my_tag'] } + + pre_tasks: + - name: some pre-task + shell: echo 'this task is the last, but would be executed before roles, and before tasks' ``` #### For remaining examples we would use additional repository From bb31a53eb2c559d327b6bc7f58735b410ae4815f Mon Sep 17 00:00:00 2001 From: sirkubax Date: Sat, 21 Oct 2017 00:01:29 +0200 Subject: [PATCH 52/90] set -e - again --- ansible.html.markdown | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index bd0200f668..e41d1a6a95 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -225,7 +225,8 @@ You should also know, that a nice way to pool some data is a **lookup** You can use them in CLI too ```yaml -ansible -m shell -a 'echo {{ my_variable }}` -e '{{ lookup('pipe'; 'date' }}" localhost +ansible -m shell -a 'echo "{{ my_variable }}"' -e 'my_variable="{{ lookup("pipe", "date") }}"' localhost +ansible -m shell -a 'echo "{{ my_variable }}"' -e 'my_variable="{{ lookup("pipe", "hostname") }}"' all ``` From 8f803122808e802b8bc0bf7b2ecb057207c5f46f Mon Sep 17 00:00:00 2001 From: sirkubax Date: Fri, 27 Oct 2017 14:42:44 +0200 Subject: [PATCH 53/90] copy into docker --- .ansible.html.markdown.swl | Bin 0 -> 36864 bytes .ansible.html.markdown.swm | Bin 0 -> 32768 bytes .ansible.html.markdown.swn | Bin 0 -> 61440 bytes ansible.html.markdown | 32 ++++++++++++++++++++++++++++++-- 4 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 .ansible.html.markdown.swl create mode 100644 .ansible.html.markdown.swm create mode 100644 .ansible.html.markdown.swn diff --git a/.ansible.html.markdown.swl b/.ansible.html.markdown.swl new file mode 100644 index 0000000000000000000000000000000000000000..94a17a7deba496b8b32e79fdb7f1526ddfb3df1d GIT binary patch literal 36864 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 Ynuu4qaxs76W+%2kJaY??686LUzcvKH*#H0l literal 0 HcmV?d00001 diff --git a/.ansible.html.markdown.swn b/.ansible.html.markdown.swn new file mode 100644 index 0000000000000000000000000000000000000000..25fce1a64cba427b4f67d4f1723650743c791bbf GIT binary patch literal 61440 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 literal 0 HcmV?d00001 diff --git a/ansible.html.markdown b/ansible.html.markdown index e41d1a6a95..53ea153ff8 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -178,7 +178,7 @@ user@host:~/$ cd ansible-for-learnXinYminutes user@host:~/ansible-for-learnXinYminutes$ source environment.sh $ $ # First lets execute the simple_playbook.yml -(venv) user@host:~/ansible-for-learnXinYminutes$ ansible-playbook playbook/simple_playbook.yml +(venv) user@host:~/ansible-for-learnXinYminutes$ ansible-playbook playbooks/simple_playbook.yml ``` @@ -186,7 +186,7 @@ Run the above playbook with roles example ```bash $ source environment.sh $ # Now we would run the above playbook with roles -(venv) user@host:~/ansible-for-learnXinYminutes$ ansible-playbook playbooks/role_example.yml +(venv) user@host:~/ansible-for-learnXinYminutes$ ansible-playbook playbooks/simple_role.yml ``` #### Role directory structure: @@ -206,6 +206,15 @@ roles/ Handlers are a tasks that can be triggered (notified) during execution of a playbook, but they itself execute at the very end of a playbook. It is a best way to restart a service, check if application port is active (successfull deployment criteria), etc. +Please get familiar how you can use role in simple_apache_role example +``` +playbooks/roles/simple_apache_role/ +├── tasks +│   └── main.yml +└── templates + └── main.yml +``` + ### ansible - variables Ansible is flexible - it has 21 levels of variable precedence @@ -223,11 +232,29 @@ You should also know, that a nice way to pool some data is a **lookup** * stream * etcd +```bash +# read playbooks/lookup.yml +# run +(venv) user@host:~/ansible-for-learnXinYminutes$ ansible-playbook playbooks/lookup.yml +``` + You can use them in CLI too ```yaml ansible -m shell -a 'echo "{{ my_variable }}"' -e 'my_variable="{{ lookup("pipe", "date") }}"' localhost ansible -m shell -a 'echo "{{ my_variable }}"' -e 'my_variable="{{ lookup("pipe", "hostname") }}"' all +# Or use in playbook + +(venv) user@host:~/ansible-for-learnXinYminutes$ ansible-playbook playbooks/lookup.yml + +``` + +### Register +Another way to dynamicaly generate the variable content is a `register` command +`Register` is also useful to store an output of a task, and use it's value as a logic +for execution further tasks. +``` +(venv) user@host:~/ansible-for-learnXinYminutes$ ansible-playbook playbooks/register_and_when.yml ``` ### Templates @@ -259,6 +286,7 @@ Junja is powerfull. It has built-in many usefull functions. # if variable is undefined - use default value {{ some_variable | default('default_value') }} ``` +### ansible - tags, limmit, diff, check_mode ### ansible-vault To maintain **ifrastructure as a code** you need to store secrets. From c56a644fb3a9acc0687746f3dfd34be0dc1408d9 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Fri, 27 Oct 2017 14:55:16 +0200 Subject: [PATCH 54/90] copy into docker --- .ansible.html.markdown.swl | Bin 36864 -> 36864 bytes ansible.html.markdown | 55 +++++++++++++++++++++++++++++++++++-- 2 files changed, 53 insertions(+), 2 deletions(-) diff --git a/.ansible.html.markdown.swl b/.ansible.html.markdown.swl index 94a17a7deba496b8b32e79fdb7f1526ddfb3df1d..4664ca7078a38128e7de3801f3fb19533d3b9b7b 100644 GIT binary patch delta 1636 zcmbW2O^6&t7=~-ZvPn!9HpwLc!OyIctj^CK6mcYCP>_uo&}1>h9JXt!YkJD*?i#zQ zccv3U=cXu#VTk8|-X*N&plA@(n_dn6fPzOc2M+;7@U7~Z&5no%3!b66tLpoGtLMt~ zU01H}qR#5eYi)X>@fgEcVl1!ye*Vcr2U)GbSU>OZt2Z9H@!bBUIWc}|>4CW;TdysR zn~Sf{GuB+F4v6uAXU63>`x*Nh+yWXL27m5j>@K(lu7Y>K8{i_?1OmJQ9tRJCJzzKZ z^*+Xa0-u9V!Mos1&;t>;02aU>dl|b8KH1Ak_Aw?m!TaDn@Z%oFegNNt@4zka8Aw3_ z1b7(S-3=q)Tks+H0F1y8^ueRx5cmt}{sO)PUx1t7Bd`jZ3tMyZZ_khKf8kn581;Ir z5@o5UjZJwXTT!O-0WF_uvz^OECvszu$*vkbGPB^fyMr@tlVW3P(7!*ga}qoy_;SuL zlOtJ*+$x=t?oy%ij4U^OLsnA=H>nJLOorGp2Ay7Ox7XI$#Ea>xLEZAmc&i;rxxs!M zl_L@7p(IY7Sc|^1Ep%7~=g+S9WQJv6%7GM$$M74O7V&t<3o~`#ZR6);jkLv)4a{qe zMq?%$EcleRGnypSDG-lJBbwdKBZTFWtWl<8N#${#hNLWVcA2l#NTojd8c8dhGoShT z$>+~9<|=47B-!mMp=2rwLKwEE3>lRS;I5me!quC{ z$`%Z^$3b$qbXRHGovQ9AnA<<1SVv0GP}v?DW>g0@T)?MP`YPYHW*XFnbljl?y@b2m z@JPDC2Se1S71SydPC>NEGsT^ubQd?Cxk;W(OoKPlho~2%Pt_sIQ zPeO>$3Yh{?Cy?xb3-sU^npYaq{mKJOV@$&RKLPm=?}fiJ5auicKYXf_Ov|bq^dEWt z!|Wu$X%AZW95Qd+^kf{jDC|G~%+puFT+f672m}}y)@pu^WE2)+(9vUH$SzGvoVZbCqYIA!qyFST z0eMEL&4mJ!^?9AS7#O6vAsX~23pz~JyU)YG&=15GKr9W!;y}C=sA3}!Zvf&&K)eu$ zWq??kdov@87uRG1x2cnb!UHBh^nS>x5R{spSzMA@H2Gb4@Mb&TV?w;QfJVgeLM)Nm JEST_K9{`_EDIfp< diff --git a/ansible.html.markdown b/ansible.html.markdown index 53ea153ff8..ae5ca01eb8 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -249,7 +249,9 @@ ansible -m shell -a 'echo "{{ my_variable }}"' -e 'my_variable="{{ lookup("pipe" ``` -### Register +### Register and Conditional + +#### Register Another way to dynamicaly generate the variable content is a `register` command `Register` is also useful to store an output of a task, and use it's value as a logic for execution further tasks. @@ -257,6 +259,56 @@ for execution further tasks. (venv) user@host:~/ansible-for-learnXinYminutes$ ansible-playbook playbooks/register_and_when.yml ``` +```yaml +#file content +--- +- hosts: localhost + tasks: + - name: check the system capacity + shell: df -h / + register: root_size + + - name: debug root_size + debug: + msg: "{{ root_size }}" + + - name: debug root_size return code + debug: + msg: "{{ root_size.rc }}" + + + - name: Print this message when return code of 'check the system capacity' was ok + debug: + msg: "{{ root_size.rc }}" + when: root_size.rc == 0 + +``` +#### Conditionals + +You can define complex logic with ansible and Jinja functions. Most common is usage of `when:`, with some variable (often dynamicly generated in previous playbook steps with `register` or `lookup`) + + + +### ansible - tags, limmit + +You should know about a way to increase efficiency by this simple functionality + +#### TAGS + You can tag a task, role (and its tasks), include, etc... + You can then limit an execution by using + --tags tagA, other_tag,... + + There are special tags: always + + --skip-tags can be used to exclude a block of code + +#### LIMMIT + You can limmit an execution of your tasks to defined hosts + --limit my_hostname + --limit groupname + --limit some_prefix* + --limit hostname:group #JM + ### Templates Template is a powerfull way to deliver some (partially) dynamic content. Ansible uses **Jinja2** langueage to describe the template. @@ -286,7 +338,6 @@ Junja is powerfull. It has built-in many usefull functions. # if variable is undefined - use default value {{ some_variable | default('default_value') }} ``` -### ansible - tags, limmit, diff, check_mode ### ansible-vault To maintain **ifrastructure as a code** you need to store secrets. From 75379d6b672ed34b5f593c9aea60564e90a0cc3d Mon Sep 17 00:00:00 2001 From: sirkubax Date: Fri, 27 Oct 2017 14:56:38 +0200 Subject: [PATCH 55/90] update --- .ansible.html.markdown.swl | Bin 36864 -> 36864 bytes ansible.html.markdown | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/.ansible.html.markdown.swl b/.ansible.html.markdown.swl index 4664ca7078a38128e7de3801f3fb19533d3b9b7b..607a08ba68e4af15c92d3583197307b31cf9dc2f 100644 GIT binary patch delta 51 zcmZozz|^pSNg>G~%+puFT+f672m}}yHt2kg^cNOl(9vUH$SzGvoVZbCqswj&M#n{- F?f_N94i^9b delta 51 zcmZozz|^pSNg>G~%+puFT+f672m}}yN_9R*S_%s>=;$#pWS1r-PTZ)n(Pg&>W8xxD FcK}Vm4dws< diff --git a/ansible.html.markdown b/ansible.html.markdown index ae5ca01eb8..155a3b0e02 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -285,7 +285,7 @@ for execution further tasks. ``` #### Conditionals -You can define complex logic with ansible and Jinja functions. Most common is usage of `when:`, with some variable (often dynamicly generated in previous playbook steps with `register` or `lookup`) +You can define complex logic with Ansible and Jinja functions. Most common is usage of `when:`, with some variable (often dynamicly generated in previous playbook steps with `register` or `lookup`) From a3bbb085b06d640b4807c296358f4569599fcd5b Mon Sep 17 00:00:00 2001 From: sirkubax Date: Fri, 27 Oct 2017 14:57:54 +0200 Subject: [PATCH 56/90] update --- .ansible.html.markdown.swl | Bin 36864 -> 36864 bytes ansible.html.markdown | 3 ++- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.ansible.html.markdown.swl b/.ansible.html.markdown.swl index 607a08ba68e4af15c92d3583197307b31cf9dc2f..8916354db415c20f503353c496dd2484044161e4 100644 GIT binary patch delta 266 zcmZozz|^pSNg>G~%+puFT+f672m}}yoOM4(h6xKX=;$#pWS1r-PTZ)n(S=8VF=cb0 zz-E2kVipDlc{YgBl*xh)|Lc9Y7#O^P_!}n!!z&;@0mQ3;coh&Y1L7$_JQ;}3axgHQ z0pim@dd*HTvi@QXH! delta 238 zcmZozz|^pSNg>G~%+puFT+f672m}}yHt2kg^cNOl(9vUH$SzGvoVZbCqYIA!WAf%e zfzA57?JNuo`fL!T$&&>g{?|uyF)*+J@h?sWh8sY<8;ExS@irh{0>q1f_$~(n!yO>L z4aB#Acs~&D1L8a&&IRIRAXWw9@9aP`fcQEPZvo= Date: Fri, 27 Oct 2017 14:58:23 +0200 Subject: [PATCH 57/90] update --- .ansible.html.markdown.swl | Bin 36864 -> 36864 bytes ansible.html.markdown | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/.ansible.html.markdown.swl b/.ansible.html.markdown.swl index 8916354db415c20f503353c496dd2484044161e4..4bc70c7b8b54e4556a5a84435ddc6506860f0267 100644 GIT binary patch delta 214 zcmZozz|^pSNg>G~%+puFT+f672m}}y0(3t|DhmrS=;$#pWS1r-PTZ)n(dB?WYc>l5 zgZO4n2X)5!9!>^^ZXiC&!N70?hz|qtAs}83#LIv<42VO4*c*s>f%rZ<1H%Cz-Velc zfOt9(CjfCg5C;RXFcAM{V_3JXg}YHq=1 WdABxZ4h3C>@{H6xtIbP2qul_rwkWy) delta 213 zcmXZMKMMhI0Eh7}&YzP(B!l5@P!=wOGE$^&FwvDn5m6{5Gm~BH49-Z`kKIQ8Y~F*( zHPko;0+CE*|)n?Mri)va+f%$=4;!`n#0mL<+H*PlOR@BO$GR~0%C_>K0Y?Gx7 zEa>3@?sTIo?P*7Ks!@qT^l}3iI@5+$)TItpDMAi Date: Fri, 27 Oct 2017 14:59:23 +0200 Subject: [PATCH 58/90] update --- .ansible.html.markdown.swl | Bin 36864 -> 36864 bytes ansible.html.markdown | 5 +++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.ansible.html.markdown.swl b/.ansible.html.markdown.swl index 4bc70c7b8b54e4556a5a84435ddc6506860f0267..57301145d969e220f3b183815894e58f814ecb60 100644 GIT binary patch delta 180 zcmZozz|^pSNg>G~%+puFT+f672m}}ymg|0w>=YJa(9vUH$SzGvoVZbCqYIA!W9sHW zfzA57c`OVJa%>Q#shb5IyczujIe;30_z^n;!(kvk1jO@!coq;R191`%hXJt^5HkVs z8=&^fK)eNrHv{ofAYKB*@<1%dwwaM7lZ7QDHMd~$oxr)1*Se)m7I*)~$go+^G~%+puFT+f672m}}y0(3t|DhmrS=;$#pWS1r-PTZ)n(S=8VF=cb0 zz-E2kY!(IvaW;t3l+A(;-i%(n91INi*%=rP0P%hxo&&_wfj9w( Date: Fri, 27 Oct 2017 14:59:51 +0200 Subject: [PATCH 59/90] update --- .ansible.html.markdown.swl | Bin 36864 -> 36864 bytes ansible.html.markdown | 1 + 2 files changed, 1 insertion(+) diff --git a/.ansible.html.markdown.swl b/.ansible.html.markdown.swl index 57301145d969e220f3b183815894e58f814ecb60..4ffb166f37e0a273a641f5ac9c83bdda16b0ba79 100644 GIT binary patch delta 134 zcmZozz|^pSNg>G~%+puFT+f672m}}y_UL|&Y!Vh?(9vUH$SzGvoVZbCqYIA!W7_6G zfzA57nJf$pvTP8gX`2Nd${E!p*%=rZf%r90_!1Cr2I5UXyab3B1F;+s%d%}|WJzUV X2}#W@n0z;I&g3m_X`3b8pL+lR^C}-# delta 130 zcmZozz|^pSNg>G~%+puFT+f672m}}ymg|0w>=YJa(9vUH$SzGvoVZbCqYIA!W9sHW zfzA57c`OVJa%>Q#shb5I${CfI*clk!0EI3C@fIN748%);cnJ{81F;<2W=57w7M76I U+=9t>0_RTN?3T7!%Ke!K0Hb9eH2?qr diff --git a/ansible.html.markdown b/ansible.html.markdown index a6ce656b7c..41d9d62f0e 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -306,6 +306,7 @@ You can tag a task, role (and its tasks), include, etc... #### LIMMIT You can limmit an execution of your tasks to defined hosts + --limit my_hostname --limit groupname --limit some_prefix* From 844e24899e022a948c52cc68b8af33e2d8b28208 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Fri, 27 Oct 2017 15:00:25 +0200 Subject: [PATCH 60/90] update --- .ansible.html.markdown.swl | Bin 36864 -> 36864 bytes ansible.html.markdown | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.ansible.html.markdown.swl b/.ansible.html.markdown.swl index 4ffb166f37e0a273a641f5ac9c83bdda16b0ba79..6f1526259f79d5fe4074e3c395ea7da469f3bf9c 100644 GIT binary patch delta 159 zcmWN=u@1pd6oBE=<|sDIB(-@0t6E%xMIzWbR81t}3HlCqG`N!*B{!@FUcq9u8_oVN z`3e^nF1%<`*{DeD>&YNkpKBr|7o2m#7MuK3MV@@n@xT=`F4jeLOUOp~)b2 delta 155 zcmZozz|^pSX#0dX=ACjoI75K95EBoH$K@oP2)hD$)a8HhIl@e&|j48(FkEX%f;ktLOdB_uVs cVDjC-Ig_`!6-`!mx7-}>p1`01J~IWdHyG diff --git a/ansible.html.markdown b/ansible.html.markdown index 41d9d62f0e..a10540d3bb 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -290,7 +290,7 @@ You can define complex logic with Ansible and Jinja functions. Most common is us -### ansible - tags, limmit +### ansible - tags, limit You should know about a way to increase efficiency by this simple functionality @@ -304,8 +304,8 @@ You can tag a task, role (and its tasks), include, etc... --skip-tags can be used to exclude a block of code -#### LIMMIT -You can limmit an execution of your tasks to defined hosts +#### LIMIT +You can limit an execution of your tasks to defined hosts --limit my_hostname --limit groupname From 147533c849733dadc2c3db31e9365ff4b4943cbe Mon Sep 17 00:00:00 2001 From: sirkubax Date: Fri, 27 Oct 2017 15:05:56 +0200 Subject: [PATCH 61/90] update --- .ansible.html.markdown.swl | Bin 36864 -> 36864 bytes ansible.html.markdown | 4 +++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.ansible.html.markdown.swl b/.ansible.html.markdown.swl index 6f1526259f79d5fe4074e3c395ea7da469f3bf9c..d3239470ff2cd18e0048c5c13aeb8cd66ea0ab9e 100644 GIT binary patch delta 237 zcmZozz|^pSNg>G~%+puFT+f672m}}y6!kwx3abb)=;$#pWS1r-PTZ)n(S=8VF=KO} zz-E2kPs|Jq>sTR5Gd2r4gfsfhWM^QQ0mP+1TmZzDKx_fTxz2A)B%z4`6U^tMVlYF%Xt6* Dt#&y~ delta 197 zcmZozz|^pSNg>G~%+puFT+f672m}}y_UL|&Y!Vh?(9vUH$SzGvoVZbCqYIA!W7_6G zfzA57IV=ne3TzOiX`2Nd!WrF;urn|m2I2)kJR68pfH)b5BY;>Ih-HA71&H4PwOs|` zZ9u#gh?fKLG9Xq2VgFI5L Date: Fri, 27 Oct 2017 15:08:30 +0200 Subject: [PATCH 62/90] update --- .ansible.html.markdown.swl | Bin 36864 -> 36864 bytes ansible.html.markdown | 10 ++++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/.ansible.html.markdown.swl b/.ansible.html.markdown.swl index d3239470ff2cd18e0048c5c13aeb8cd66ea0ab9e..259fc5a0fdcabe28f06489c96d067f9afa3a24f2 100644 GIT binary patch delta 374 zcmZozz|^pSNg>G~%+puFT+f672m}}yPUwG*EL9O=(9vUH$SzGvoVZbCqYIA!W7g(C zfzA57^~?+m&a4onS(^nNycyHpvNJHe0pi6#90$a)KjXxHoXp}9 z-IB!gVug}?Fh?P=EHN`DF)1fi0VF)x!rf6v0SFRv$`dP#89>aCjMSo3g+w4OE=Wzz zOw0kRv{GOI$xdd>mYICYO;n@=BKW%~QzF%c%tMKt`pfrYIDp7U!21C8ri|_V(E74ghHdV@?17 delta 274 zcmZozz|^pSNg>G~%+puFT+f672m}}y6!kwx3abb)=;$#pWS1r-PTZ)n(S=8VF=KO} zz-E2kPs|Jq>sTR5Gd2r4cr!){aWF6l0`X&Z28NkHJOhYJfw%yOErHkqh;@PZ6B`4= zM<8Ae#H)aK5)jt_aWW9Q0I@R=n*y;35U&SXv2OE0$7be<2g*0QxK3c4{M*fHvWvR} zTVhUmVrB7UJ2!KulEn041t8(510v(|OEOZ67!-gYGQU(IIWbQGD3GU+lbM@Yq5$Nj kR-`7EmSpDVDI`@Ylon^^r7KK+?QX%Wr>D2s+heOc053;HHUIzs diff --git a/ansible.html.markdown b/ansible.html.markdown index 95735e21c2..0ad58d45b6 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -295,14 +295,16 @@ You can define complex logic with Ansible and Jinja functions. Most common is us You should know about a way to increase efficiency by this simple functionality #### TAGS -You can tag a task, role (and its tasks), include, etc... +You can tag a task, role (and its tasks), include, etc, and then run only the tagged resources - You can then limit an execution by using - ansible-playbook playbooks/simple_playbook.yml --tags tagA, tag_other + ansible-playbook playbooks/simple_playbook.yml --tags=tagA,tag_other + ansible-playbook playbooks/simple_playbook.yml -t tagA,tag_other - There are special tags: always + There are special tags: + always --skip-tags can be used to exclude a block of code + --list-tags to list available tags #### LIMIT You can limit an execution of your tasks to defined hosts From d3fdfa1260f7f0f46823dd2df15d50e5c472e41b Mon Sep 17 00:00:00 2001 From: sirkubax Date: Mon, 1 Jan 2018 20:54:32 +0100 Subject: [PATCH 63/90] update --- ansible.html.markdown | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index 0ad58d45b6..61ff6cff03 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -10,7 +10,7 @@ filename: LearnAnsible.txt ```yaml --- -"{{ Why Ansible and detailed Intro }}" written in the second part of document +"{{ Explanation: Why Ansible and detailed Intro }}" written in the second part of document ``` @@ -64,8 +64,7 @@ $ ansible -m ping all $ ansible -m shell -a 'date; whoami' localhost #hostname_or_a_group_name ``` -* Module: `command` - executes a single command that will not be processed through the shell, so variables like $HOME or operands like `|` `;` will not work -#JM +* Module: `command` - executes a single command that will not be processed through the shell, so variables like $HOME or operands like `|` `;` will not work. The command module is more secure, because it will not be affected by the user’s environment. For more complex command - use shell module. ```bash @@ -114,10 +113,11 @@ This example-playbook would execute (on all hosts defined in the inventory) two shell: "date; whoami; df -h;" ``` -You can run the playbook with the command: +Run the playbook with the command: ```bash $ ansible-playbook path/name_of_the_playbook.yml ``` +_Note: Example playbook is explained in the next chapter: 'Roles' ### More on ansible concept ### Inventory @@ -131,6 +131,7 @@ localhost [some_group] hostA.mydomain.com hostB.localdomain +1.2.3.4 [a_group_of_a_groups:children] some_group @@ -140,7 +141,7 @@ some_other_group * [Additional Reading.](http://docs.ansible.com/ansible/latest/intro_inventory.html) ### ansible-roles (a 'template-playbooks' with right structure) - You already know the tasks (modules) that can be run via CLI. You also know the playbooks - the execution plans of multiple tasks (with variables and logic). + You already know that the tasks (modules) can be run via CLI. You also know the playbooks - the execution plans of multiple tasks (with variables and logic). A concept called `role` was introduced for parts of the code (playbooks) that should be reusable. @@ -170,7 +171,9 @@ Role can be included in your playbook (executed via your playbook). ``` #### For remaining examples we would use additional repository -This example install ansible in `virtualenv` so it is independend from a system. You need to init it with `source environment.sh` command +This example install ansible in `virtualenv` so it is independend from a system. You need to initialize it into your shell-context with `source environment.sh` command. + +We are going to use repository with examples: sirkubax/ansible-for-learnXinYminutes.git ```bash $ git colone git@github.com:sirkubax/ansible-for-learnXinYminutes.git @@ -331,13 +334,13 @@ Some static content ``` Jinja may have some limitations, but it is a powerfull tool that you might like. -### Jinja2 CLI +#### Jinja2 CLI You can use the jinja in the CLI too ```bash ansible -m shell -a 'echo {{ my_variable }}` -e 'my_variable=something, playbook_parameter=twentytwo" localhost ``` -### Jinja2 filters +#### Jinja2 filters Junja is powerfull. It has built-in many usefull functions. ```jinja # get first item of the list @@ -345,6 +348,7 @@ Junja is powerfull. It has built-in many usefull functions. # if variable is undefined - use default value {{ some_variable | default('default_value') }} ``` +[Read More] ### ansible-vault To maintain **ifrastructure as a code** you need to store secrets. @@ -353,13 +357,17 @@ To maintain **ifrastructure as a code** you need to store secrets. The best way to use the **ansible-vault** is to store the secret in some secure location, and configure ansible to use during runtime. ```bash +# Try (this would fail) +$ ansible-playbook playbooks/vault_example.yml + $ echo some_very_very_long_secret > ~/.ssh/secure_located_file +# in ansible.cfg set the path to your secret file $ vi ansible.cfg ansible_vault_password_file = ~/.ssh/secure_located_file -#or to use env -export ANSIBLE_VAULT_PASSWORD_FILE=~/.ssh/secure_located_file +#or use env +$ export ANSIBLE_VAULT_PASSWORD_FILE=~/.ssh/secure_located_file $ ansible-playbook playbooks/vault_example.yml From 22d4cadc8046fc941c99bbfed367cbe56f6831f0 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Mon, 1 Jan 2018 20:55:04 +0100 Subject: [PATCH 64/90] update --- ansible.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index 61ff6cff03..067ea2919c 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -173,7 +173,7 @@ Role can be included in your playbook (executed via your playbook). #### For remaining examples we would use additional repository This example install ansible in `virtualenv` so it is independend from a system. You need to initialize it into your shell-context with `source environment.sh` command. -We are going to use repository with examples: sirkubax/ansible-for-learnXinYminutes.git +We are going to use repository with examples: https://github.com/sirkubax/ansible-for-learnXinYminutes ```bash $ git colone git@github.com:sirkubax/ansible-for-learnXinYminutes.git From 493beb467cb4b1a9fd636e6e79ed1d02c86b0256 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Mon, 1 Jan 2018 20:57:43 +0100 Subject: [PATCH 65/90] update --- ansible.html.markdown | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index 067ea2919c..9661fdf4a3 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -176,7 +176,8 @@ This example install ansible in `virtualenv` so it is independend from a system. We are going to use repository with examples: https://github.com/sirkubax/ansible-for-learnXinYminutes ```bash -$ git colone git@github.com:sirkubax/ansible-for-learnXinYminutes.git +$ # The folowing example contain a shell-prompt to indicate the venv and relative path +$ git clone git@github.com:sirkubax/ansible-for-learnXinYminutes.git user@host:~/$ cd ansible-for-learnXinYminutes user@host:~/ansible-for-learnXinYminutes$ source environment.sh $ From 0d9aad8f71a7246088389735e6a8f73111d14407 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Mon, 1 Jan 2018 21:03:34 +0100 Subject: [PATCH 66/90] update --- ansible.html.markdown | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index 9661fdf4a3..1329f7e7d5 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -176,7 +176,7 @@ This example install ansible in `virtualenv` so it is independend from a system. We are going to use repository with examples: https://github.com/sirkubax/ansible-for-learnXinYminutes ```bash -$ # The folowing example contain a shell-prompt to indicate the venv and relative path +$ # The folowing example contains a shell-prompt to indicate the venv and relative path $ git clone git@github.com:sirkubax/ansible-for-learnXinYminutes.git user@host:~/$ cd ansible-for-learnXinYminutes user@host:~/ansible-for-learnXinYminutes$ source environment.sh @@ -186,7 +186,7 @@ $ # First lets execute the simple_playbook.yml ``` -Run the above playbook with roles example +Run the playbook with roles example ```bash $ source environment.sh $ # Now we would run the above playbook with roles @@ -223,9 +223,9 @@ playbooks/roles/simple_apache_role/ Ansible is flexible - it has 21 levels of variable precedence -[read more] +[read more](http://docs.ansible.com/ansible/latest/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable) -For now you might like to know, that CLI variables has the top priority. +For now you should know that CLI variables have the top priority. You should also know, that a nice way to pool some data is a **lookup** From 4041b4c45db1796c3a8410211c6a355728b71c6a Mon Sep 17 00:00:00 2001 From: sirkubax Date: Mon, 1 Jan 2018 21:05:16 +0100 Subject: [PATCH 67/90] update --- ansible.html.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/ansible.html.markdown b/ansible.html.markdown index 1329f7e7d5..4462cbbb86 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -230,6 +230,7 @@ For now you should know that CLI variables have the top priority. You should also know, that a nice way to pool some data is a **lookup** ### Lookups +query from: * pipe * file From 91a81abb7de572b5fb595f641688b75144de5b75 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Mon, 1 Jan 2018 21:21:39 +0100 Subject: [PATCH 68/90] update --- ansible.html.markdown | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index 4462cbbb86..e4023e5a46 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -239,7 +239,7 @@ query from: ```bash # read playbooks/lookup.yml -# run +# then run (venv) user@host:~/ansible-for-learnXinYminutes$ ansible-playbook playbooks/lookup.yml ``` @@ -257,7 +257,7 @@ ansible -m shell -a 'echo "{{ my_variable }}"' -e 'my_variable="{{ lookup("pipe" ### Register and Conditional #### Register -Another way to dynamicaly generate the variable content is a `register` command +Another way to dynamicaly generate the variable content is a `register` command. `Register` is also useful to store an output of a task, and use it's value as a logic for execution further tasks. ``` @@ -265,7 +265,6 @@ for execution further tasks. ``` ```yaml -#file content --- - hosts: localhost tasks: @@ -293,6 +292,16 @@ for execution further tasks. You can define complex logic with Ansible and Jinja functions. Most common is usage of `when:`, with some variable (often dynamicly generated in previous playbook steps with `register` or `lookup`) +```yaml +--- +- hosts: localhost + tasks: + - name: check the system capacity + shell: df -h / + when: some_variable in 'a string' + roles: + - { role: mid_nagios_probe, when: allow_nagios_probes } +``` ### ansible - tags, limit From ca0e3475a019cfbe4532ddee6b1d9e5c1191c93c Mon Sep 17 00:00:00 2001 From: sirkubax Date: Mon, 1 Jan 2018 21:31:22 +0100 Subject: [PATCH 69/90] update --- ansible.html.markdown | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/ansible.html.markdown b/ansible.html.markdown index e4023e5a46..bca1331c24 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -320,6 +320,8 @@ You can tag a task, role (and its tasks), include, etc, and then run only the ta --skip-tags can be used to exclude a block of code --list-tags to list available tags +[Read more](http://docs.ansible.com/ansible/latest/playbooks_tags.html) + #### LIMIT You can limit an execution of your tasks to defined hosts @@ -350,6 +352,20 @@ You can use the jinja in the CLI too ```bash ansible -m shell -a 'echo {{ my_variable }}` -e 'my_variable=something, playbook_parameter=twentytwo" localhost ``` +In fact - jinja is used to template parts of the playbooks too +```yml +#check part of this playbook: playbooks/roles/sys_debug/tasks/debug_time.yml +- local_action: shell date +'%F %T' + register: ts + become: False + changed_when: False + +- name: Timestamp + debug: msg="{{ ts.stdout }}" + when: ts is defined and ts.stdout is defined + become: False + +``` #### Jinja2 filters Junja is powerfull. It has built-in many usefull functions. From 71ce506fc95d1aa8ed0b20f5a8b3687235639c0d Mon Sep 17 00:00:00 2001 From: sirkubax Date: Mon, 1 Jan 2018 21:39:09 +0100 Subject: [PATCH 70/90] update --- ansible.html.markdown | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/ansible.html.markdown b/ansible.html.markdown index bca1331c24..a35bcf82fb 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -347,6 +347,16 @@ Some static content ``` Jinja may have some limitations, but it is a powerfull tool that you might like. +Please examine this simple example that install apache2 and generate index.html from the template +"playbooks/roles/simple_apache_role/templates/index.html" + +```bash +$ source environment.sh +$ # Now we would run the above playbook with roles +(venv) user@host:~/ansible-for-learnXinYminutes$ ansible-playbook playbooks/simple_role.yml --tags apache2 +``` + + #### Jinja2 CLI You can use the jinja in the CLI too ```bash From 986813057bf9cee39100a0ca71fcebf82079aab9 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Mon, 1 Jan 2018 21:40:25 +0100 Subject: [PATCH 71/90] update --- ansible.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index a35bcf82fb..b6eeb8a6fe 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -385,7 +385,7 @@ Junja is powerfull. It has built-in many usefull functions. # if variable is undefined - use default value {{ some_variable | default('default_value') }} ``` -[Read More] +[Read More](http://docs.ansible.com/ansible/latest/playbooks_filters.html) ### ansible-vault To maintain **ifrastructure as a code** you need to store secrets. From 7c5e5e67f60c1d8a450339e2477d66999762828d Mon Sep 17 00:00:00 2001 From: sirkubax Date: Mon, 1 Jan 2018 21:47:54 +0100 Subject: [PATCH 72/90] update --- ansible.html.markdown | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index b6eeb8a6fe..f4f504ecc8 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -408,7 +408,7 @@ $ export ANSIBLE_VAULT_PASSWORD_FILE=~/.ssh/secure_located_file $ ansible-playbook playbooks/vault_example.yml - # decrypt the file + # encrypt the file $ ansible-vault encrypt path/somefile # view the file @@ -428,13 +428,15 @@ You might like to know, that you can build your inventory dynamically. You do not need to invent the wheel - there are plenty ready to use inventory script for most popular Cloud provicers and a lot of in-house popular usecaseses. +[AWS example](http://docs.ansible.com/ansible/latest/intro_dynamic_inventory.html#example-aws-ec2-external-inventory-script) + ```bash -$ etc/inv/ec2.py --refresh +$ etc/inv/ec2.py --refresh $ ansible -m ping all -i etc/inv/ec2.py ``` -Read also about `dynamic inventory` below +[Read more](http://docs.ansible.com/ansible/latest/intro_dynamic_inventory.html) ### ansible profiling - callback It is ok that your playbook executes some time. Sometimes you may like to speed things up From 0c6ac5e17b26978fff44fd79457b41d1482c4b45 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Mon, 1 Jan 2018 21:49:37 +0100 Subject: [PATCH 73/90] update --- ansible.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index f4f504ecc8..3134bf8373 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -439,7 +439,7 @@ $ ansible -m ping all -i etc/inv/ec2.py [Read more](http://docs.ansible.com/ansible/latest/intro_dynamic_inventory.html) ### ansible profiling - callback -It is ok that your playbook executes some time. Sometimes you may like to speed things up +Playbook execution takes some time. It is OK. First make it run, then you may like to speed things up Since ansible 2.x there is bouilt-in callback for task execution profiling From 275c6eb59f3af0993314bfd2d090cfef724da569 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Mon, 1 Jan 2018 21:51:14 +0100 Subject: [PATCH 74/90] update --- ansible.html.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index 3134bf8373..82e3f94687 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -441,7 +441,7 @@ $ ansible -m ping all -i etc/inv/ec2.py ### ansible profiling - callback Playbook execution takes some time. It is OK. First make it run, then you may like to speed things up -Since ansible 2.x there is bouilt-in callback for task execution profiling +Since ansible 2.x there is built-in callback for task execution profiling ``` vi ansible.cfg @@ -467,7 +467,7 @@ fact_caching_timeout = 86400 ``` I like to use `jsonfile` as my backend. It allows to use another project -`ansible-cmdb` [github] that generates a HTML page of your inventory resources. A nice 'free' addition! +`ansible-cmdb` [github](https://github.com/fboender/ansible-cmdb) that generates a HTML page of your inventory resources. A nice 'free' addition! ### debugging ansible When your job fails - it is good to be effective with debugging. From 2e7311c4252ff13e4c604c28110418e92ab0ee75 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Mon, 1 Jan 2018 21:54:39 +0100 Subject: [PATCH 75/90] update --- ansible.html.markdown | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index 82e3f94687..0f349c30ee 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -467,15 +467,18 @@ fact_caching_timeout = 86400 ``` I like to use `jsonfile` as my backend. It allows to use another project -`ansible-cmdb` [github](https://github.com/fboender/ansible-cmdb) that generates a HTML page of your inventory resources. A nice 'free' addition! +`ansible-cmdb` [(project on github)](https://github.com/fboender/ansible-cmdb) that generates a HTML page of your inventory resources. A nice 'free' addition! -### debugging ansible +### debugging ansible [chapter in progres] When your job fails - it is good to be effective with debugging. 1. Increase verbosiy by using multiple -v **[ -vvvvv]** -2. If variable is undefined +2. If variable is undefined + - grep -R path_of_your_inventory -e missing_variable 3. If variable (dictionary or a list) is undefined + - grep -R path_of_your_inventory -e missing_variable 4. Jinja template debug +5. Strange behaviour - try to run the code 'at the destination' ### Infrastructure as a code - what about Ansible You already know, that ansible-vault allow you to store your poufne data along with your code (in repository). You can go further - and define your ansible installation and configuration as-a-code. From 4cb6d9179414541ddcdba04044f38851ac4c4fba Mon Sep 17 00:00:00 2001 From: sirkubax Date: Mon, 1 Jan 2018 21:58:35 +0100 Subject: [PATCH 76/90] update --- ansible.html.markdown | 38 ++------------------------------------ 1 file changed, 2 insertions(+), 36 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index 0f349c30ee..ab77e5f431 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -23,7 +23,7 @@ $ pip install ansible $ apt-get install ansible ``` -* Appendix A - How do I install ansible +* [Appendix A - How do I install ansible](#infrastructure-as-a-code) * [Additional Reading.](http://docs.ansible.com/ansible/latest/intro_installation.html) ### Your first ansible command (shell execution) @@ -480,7 +480,7 @@ When your job fails - it is good to be effective with debugging. 4. Jinja template debug 5. Strange behaviour - try to run the code 'at the destination' -### Infrastructure as a code - what about Ansible +### Infrastructure as a code You already know, that ansible-vault allow you to store your poufne data along with your code (in repository). You can go further - and define your ansible installation and configuration as-a-code. See `environment.sh` to learn how to install the ansible itself inside a `virtualenv` that is not attached to your operating system (can be changed by non-privilages user), and as additiinal benefit - upgrading version of ansible is as easy as installing new version in new virtualenv. You can have multiple versions of Ansible present in the same time. This is very helpfull! @@ -499,30 +499,6 @@ $ source environment.1.9.sh # please note that you have both venv1.9 and venv2 present - you need to (de)activate one - that is all ``` -### Naming - -### Bonus - -### writing own module - -### Python API - -### Web-UI: Ansible Tower, Jenkins, Rundeck - -#### Ansible Tower -Ansible provides a Web User Interface called `Ansible Tower`. -It is a convienient way to run Ansible Playbooks, have proper user management, log retention, and cron (periodic jobs). - -Personaly I'm not a fan of it - it's to expensive for my cases, and the trial is 10 inventory-hosts only. - -For my usecases I hide the 'pure ansible' commands behind other projects. - -#### Rundeck -This is nice, secure interface, that allows you to execute a jobs of your choice (CLI, script, execution plan). -It can perform roling-deployment (without Ansible), can integrate with clouds, etc. - -#### Jenkins -For my 'business cases' I use Jenkins - it has a 'cron', jobs can be binded into 'pipelines'. #### become-user, become @@ -608,13 +584,3 @@ On the other hand - in advanced scope - you can use python anible code as a libr But ansible is way more! It provides an execution plans, an API, library, callbacks, not forget to mention - COMUNITY! and great support by developers! - - - -# JM inventory dynamic aws ec2 -# vault -# roles - -#### ansible - dynamic in AWS -#### create instance in AWS -#### create env in AWS From 9a524f4cd1d2df67a727b0599504fd852d12c4a6 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Mon, 1 Jan 2018 21:59:42 +0100 Subject: [PATCH 77/90] update --- ansible.html.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index ab77e5f431..8a48076eef 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -389,7 +389,7 @@ Junja is powerfull. It has built-in many usefull functions. ### ansible-vault To maintain **ifrastructure as a code** you need to store secrets. - Ansible provides a way to encrypt the poufne files so you can store it in the repository, yet the files are decrypted in-fly during ansible execution. + Ansible provides a way to encrypt the confidential files so you can store it in the repository, yet the files are decrypted in-fly during ansible execution. The best way to use the **ansible-vault** is to store the secret in some secure location, and configure ansible to use during runtime. @@ -481,7 +481,7 @@ When your job fails - it is good to be effective with debugging. 5. Strange behaviour - try to run the code 'at the destination' ### Infrastructure as a code -You already know, that ansible-vault allow you to store your poufne data along with your code (in repository). You can go further - and define your ansible installation and configuration as-a-code. +You already know, that ansible-vault allow you to store your confidential data along with your code (in repository). You can go further - and define your ansible installation and configuration as-a-code. See `environment.sh` to learn how to install the ansible itself inside a `virtualenv` that is not attached to your operating system (can be changed by non-privilages user), and as additiinal benefit - upgrading version of ansible is as easy as installing new version in new virtualenv. You can have multiple versions of Ansible present in the same time. This is very helpfull! ```bash From 485db56931ea13d7be17a08aa0e97ba32228afb9 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Mon, 1 Jan 2018 22:03:48 +0100 Subject: [PATCH 78/90] update --- ansible.html.markdown | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index 8a48076eef..76d03eded8 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -482,7 +482,7 @@ When your job fails - it is good to be effective with debugging. ### Infrastructure as a code You already know, that ansible-vault allow you to store your confidential data along with your code (in repository). You can go further - and define your ansible installation and configuration as-a-code. -See `environment.sh` to learn how to install the ansible itself inside a `virtualenv` that is not attached to your operating system (can be changed by non-privilages user), and as additiinal benefit - upgrading version of ansible is as easy as installing new version in new virtualenv. You can have multiple versions of Ansible present in the same time. This is very helpfull! +See `environment.sh` to learn how to install the ansible itself inside a `virtualenv` that is not attached to your operating system (can be changed by non-privilages user), and as additional benefit - upgrading version of ansible is as easy as installing new version in new virtualenv. What is more, you can have multiple versions of Ansible present in the same time. This is very helpfull! ```bash # recreate ansible 2.x venv @@ -501,6 +501,9 @@ $ source environment.1.9.sh ``` #### become-user, become +In Ansible - to become `sudo` - use the `become` parameter. Use `become_user` to specify the username. + +[Read more](http://docs.ansible.com/ansible/latest/become.html) ## Tips and tricks From 2d596b6c4f1eda1bdf906c84110da5c84ce69e39 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Mon, 1 Jan 2018 22:07:51 +0100 Subject: [PATCH 79/90] update --- ansible.html.markdown | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/ansible.html.markdown b/ansible.html.markdown index 76d03eded8..b83fb0c16f 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -502,6 +502,14 @@ $ source environment.1.9.sh #### become-user, become In Ansible - to become `sudo` - use the `become` parameter. Use `become_user` to specify the username. +``` +- name: Ensure the httpd service is running + service: + name: httpd + state: started + become: true +``` +Note: You may like to execute Ansible with `--ask-sudo-pass` or add the user to sudoers file in order to allow non-supervised execution if you require 'admin' privilages. [Read more](http://docs.ansible.com/ansible/latest/become.html) From 03060af4f717a4ebdd80236329d24da3a439c223 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Mon, 1 Jan 2018 22:10:59 +0100 Subject: [PATCH 80/90] update --- ansible.html.markdown | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index b83fb0c16f..891f20ac35 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -538,14 +538,14 @@ ansible -m ping web*:!backend:monitoring:&allow_change #### Tagging You should tag some (not all) objects - a task in a playbook, all tasks included form a role, etc. -It allwos you to execute the choosen parts of the playbook. +It allows you to execute the choosen parts of the playbook. #### no_logs: True You may see, that some roles print a lot of output in verbose mode. There is also a debug module. This is the place where credentials may leak. Use `no_log` to hide the output. #### Debug module -allows to print a value to the screen +allows to print a value to the screen - use it! #### Register the output of a task You can register the output (stdout), rc (return code), stderr of a task with the `register` command. @@ -554,6 +554,8 @@ You can register the output (stdout), rc (return code), stderr of a task with th #### Loop: with, with_items, with_dict, with_together +[Read more](http://docs.ansible.com/ansible/latest/playbooks_conditionals.html) + ## Introduction Ansible is (one of the many) orchestration tools. It allows you to controll your environment (infrastructure and a code) and automate the manual tasks. From 8c681ba025b9b3b68ef802a3a85c7d7a082e1b99 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Mon, 1 Jan 2018 22:14:27 +0100 Subject: [PATCH 81/90] update --- ansible.html.markdown | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index 891f20ac35..ece6087eb5 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -570,20 +570,20 @@ Ansible have great integration with multiple operating systems (even Windows) an ### Cons -It is an agent-less tool - every agent consumes up to 16MB ram - in some environments, it may be noticable amount. -It is agent-less - you have to verify your environment consistency 'on-demand' - there is no built-in mechanism taht would warn you about some change automatically (this can be achieved with reasonable effort - but it must be known) -Official GUI Tool (web inferface) - Ansible Tower - is more than GUI, but it is expensive. There is no 'small enterprice' payment plan. Easy workaround with Rundeck or Jenkins is possible with reasonable workload. - + It is an agent-less tool - every agent consumes up to 16MB ram - in some environments, it may be noticable amount. + It is agent-less - you have to verify your environment consistency 'on-demand' - there is no built-in mechanism taht would warn you about some change automatically (this can be achieved with reasonable effort - but it must be known) + Official GUI Tool (web inferface) - Ansible Tower - is great, but it is expensive. There is no 'small enterprice' payment plan. Easy workaround with Rundeck or Jenkins is possible with reasonable workload. + ### Pros -It is an agent-less tools In most scenarios, it use ssh as a transport layer. -In some way you can use it as 'bash on steroids'. -It is very-very-very easy to start. If you are familiar with ssh concept - you already know ansible (ALMOST). My personal record is: 'I did show how to install and use ansible (for simple raspberry pi cluster management) and it tool me 30 seconds to deliver a working tool !!!)' -I do provide a training services - I'm able to teach a production-ready person - in 8 hours (1 training day)! It covers all needed to work aspects! No other tool can match this ease of use! -It executes when you do it - other tools (salt, puppet, chef - might execute in different scenario than you would expect) -Documentation is at the world-class standard! -The comunity (github, stackOverflow) would help you very fast. -Writing own modules and extension is fairly easy. + It is an agent-less tools In most scenarios, it use ssh as a transport layer. + In some way you can use it as 'bash on steroids'. + It is very-very-very easy to start. If you are familiar with ssh concept - you already know ansible (ALMOST). My personal record is: 'I did show how to install and use ansible (for simple raspberry pi cluster management) and it tool me 30 seconds to deliver a working tool !!!)' + I do provide a training services - I'm able to teach a production-ready person - in 8 hours (1 training day)! It covers all needed to work aspects! No other tool can match this ease of use! + It executes when you do it - other tools (salt, puppet, chef - might execute in different scenario than you would expect) + Documentation is at the world-class standard! + The comunity (github, stackOverflow) would help you very fast. + Writing own modules and extension is fairly easy. ### Neutral From 2ba076f0b0e33b8e5520a28a3a66ea623e1f2034 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Mon, 1 Jan 2018 22:18:10 +0100 Subject: [PATCH 82/90] update --- ansible.html.markdown | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index ece6087eb5..421b5b59de 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -570,20 +570,20 @@ Ansible have great integration with multiple operating systems (even Windows) an ### Cons - It is an agent-less tool - every agent consumes up to 16MB ram - in some environments, it may be noticable amount. - It is agent-less - you have to verify your environment consistency 'on-demand' - there is no built-in mechanism taht would warn you about some change automatically (this can be achieved with reasonable effort - but it must be known) - Official GUI Tool (web inferface) - Ansible Tower - is great, but it is expensive. There is no 'small enterprice' payment plan. Easy workaround with Rundeck or Jenkins is possible with reasonable workload. - +It is an agent-less tool - every agent consumes up to 16MB ram - in some environments, it may be noticable amount. +It is agent-less - you have to verify your environment consistency 'on-demand' - there is no built-in mechanism taht would warn you about some change automatically (this can be achieved with reasonable effort - but it must be known) +Official GUI Tool (web inferface) - Ansible Tower - is great, but it is expensive. There is no 'small enterprice' payment plan. Easy workaround with Rundeck or Jenkins is possible with reasonable workload. + ### Pros - It is an agent-less tools In most scenarios, it use ssh as a transport layer. - In some way you can use it as 'bash on steroids'. - It is very-very-very easy to start. If you are familiar with ssh concept - you already know ansible (ALMOST). My personal record is: 'I did show how to install and use ansible (for simple raspberry pi cluster management) and it tool me 30 seconds to deliver a working tool !!!)' - I do provide a training services - I'm able to teach a production-ready person - in 8 hours (1 training day)! It covers all needed to work aspects! No other tool can match this ease of use! - It executes when you do it - other tools (salt, puppet, chef - might execute in different scenario than you would expect) - Documentation is at the world-class standard! - The comunity (github, stackOverflow) would help you very fast. - Writing own modules and extension is fairly easy. +It is an agent-less tools In most scenarios, it use ssh as a transport layer. +In some way you can use it as 'bash on steroids'. +It is very-very-very easy to start. If you are familiar with ssh concept - you already know ansible (ALMOST). My personal record is: 'I did show how to install and use ansible (for simple raspberry pi cluster management) and it tool me 30 seconds to deliver a working tool !!!)' +I do provide a training services - I'm able to teach a production-ready person - in 8 hours (1 training day)! It covers all needed to work aspects! No other tool can match this ease of use! +It executes when you do it - other tools (salt, puppet, chef - might execute in different scenario than you would expect) +Documentation is at the world-class standard! +The comunity (github, stackOverflow) would help you very fast. +Writing own modules and extension is fairly easy. ### Neutral @@ -591,9 +591,9 @@ Migration Ansible<->Salt is failrly easy - so if you would need an event-driven ## Basics on ansible -Ansible uses ssh or paramiko as a transport layer. In a way you can imagine that you are using a ssh with API to perform your action. -In the 'low-level' way you can use it to execute remote command in more controlled way (still using ssh). -On the other hand - in advanced scope - you can use python anible code as a library to your own python scrips! This is awesome! (if you know what you are doing). It is a bit like fabric then. +Ansible uses ssh or paramiko as a transport layer. In a way you can imagine that you are using a ssh with API to perform your action. +In the 'low-level' way you can use it to execute remote command in more controlled way (still using ssh). +On the other hand - in advanced scope - you can use python anible code as a library to your own python scrips! This is awesome! (if you know what you are doing). It is a bit like fabric then. But ansible is way more! It provides an execution plans, an API, library, callbacks, not forget to mention - COMUNITY! and great support by developers! From e6036b20527c96e0db5a78d17a8e9029bd76a656 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Mon, 1 Jan 2018 22:21:33 +0100 Subject: [PATCH 83/90] update --- ansible.html.markdown | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index 421b5b59de..ffd7f2449c 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -14,6 +14,7 @@ filename: LearnAnsible.txt ``` + ## Installation ```bash # Universal way @@ -571,7 +572,7 @@ Ansible have great integration with multiple operating systems (even Windows) an ### Cons It is an agent-less tool - every agent consumes up to 16MB ram - in some environments, it may be noticable amount. -It is agent-less - you have to verify your environment consistency 'on-demand' - there is no built-in mechanism taht would warn you about some change automatically (this can be achieved with reasonable effort - but it must be known) +It is agent-less - you have to verify your environment consistency 'on-demand' - there is no built-in mechanism that would warn you about some change automatically (this can be achieved with reasonable effort) Official GUI Tool (web inferface) - Ansible Tower - is great, but it is expensive. There is no 'small enterprice' payment plan. Easy workaround with Rundeck or Jenkins is possible with reasonable workload. ### Pros From 487db1817eead3fe38887e96038606980ad671e8 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Mon, 1 Jan 2018 22:29:17 +0100 Subject: [PATCH 84/90] update --- ansible.html.markdown | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index ffd7f2449c..741952227d 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -566,35 +566,35 @@ Of course the rabit hole is way deeper.' Ansible have great integration with multiple operating systems (even Windows) and some hardware (switches, Firewalls, etc). It has multiple tools that integrate with the could providers. Almost every worth-notice cloud provider is present in the ecosystem (AWS, Azure, Google, DigitalOcean, OVH, etc...) +But ansible is way more! It provides an execution plans, an API, library, callbacks, not forget to mention - COMMUNITY! and great support by developers! -## Main cons and pros -### Cons +### Main cons and pros + +#### Cons It is an agent-less tool - every agent consumes up to 16MB ram - in some environments, it may be noticable amount. It is agent-less - you have to verify your environment consistency 'on-demand' - there is no built-in mechanism that would warn you about some change automatically (this can be achieved with reasonable effort) Official GUI Tool (web inferface) - Ansible Tower - is great, but it is expensive. There is no 'small enterprice' payment plan. Easy workaround with Rundeck or Jenkins is possible with reasonable workload. -### Pros +#### Pros It is an agent-less tools In most scenarios, it use ssh as a transport layer. In some way you can use it as 'bash on steroids'. -It is very-very-very easy to start. If you are familiar with ssh concept - you already know ansible (ALMOST). My personal record is: 'I did show how to install and use ansible (for simple raspberry pi cluster management) and it tool me 30 seconds to deliver a working tool !!!)' +It is very-very-very easy to start. If you are familiar with ssh concept - you already know Ansible (ALMOST). My personal record is: 'I did show "how to install and use ansible" (for simple raspberry pi cluster management) - it took me 30 seconds to deliver a complete working example !!!)' I do provide a training services - I'm able to teach a production-ready person - in 8 hours (1 training day)! It covers all needed to work aspects! No other tool can match this ease of use! -It executes when you do it - other tools (salt, puppet, chef - might execute in different scenario than you would expect) +It executes 'as is' - other tools (salt, puppet, chef - might execute in different scenario than you would expect) Documentation is at the world-class standard! The comunity (github, stackOverflow) would help you very fast. Writing own modules and extension is fairly easy. - -### Neutral +#### Neutral Migration Ansible<->Salt is failrly easy - so if you would need an event-driven agent environment - it would be a good choice to start quick with Ansible, and convert to salt when needed. -## Basics on ansible +#### Some concepts Ansible uses ssh or paramiko as a transport layer. In a way you can imagine that you are using a ssh with API to perform your action. -In the 'low-level' way you can use it to execute remote command in more controlled way (still using ssh). -On the other hand - in advanced scope - you can use python anible code as a library to your own python scrips! This is awesome! (if you know what you are doing). It is a bit like fabric then. +The simplest way is to execute remote command in more controlled way (still using ssh). +On the other hand - in advanced scope - you can wrap Ansible (use python Ansible code as a library) with your own Python scrips! This is awesome! It would act a bit like Fabric then. -But ansible is way more! It provides an execution plans, an API, library, callbacks, not forget to mention - COMUNITY! and great support by developers! From df4f61476c19ee35721ea078954618ed519a713a Mon Sep 17 00:00:00 2001 From: sirkubax Date: Thu, 1 Mar 2018 22:56:33 +0100 Subject: [PATCH 85/90] Delete .ansible.html.markdown.swl --- .ansible.html.markdown.swl | Bin 36864 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .ansible.html.markdown.swl diff --git a/.ansible.html.markdown.swl b/.ansible.html.markdown.swl deleted file mode 100644 index 259fc5a0fdcabe28f06489c96d067f9afa3a24f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36864 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 VZD?PWLk>Rse*o}Uz#RYp From 4427b4a70b43d1fd7e902ffe54eaf6cf752ab82a Mon Sep 17 00:00:00 2001 From: sirkubax Date: Thu, 1 Mar 2018 22:56:43 +0100 Subject: [PATCH 86/90] Delete .ansible.html.markdown.swm --- .ansible.html.markdown.swm | Bin 32768 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .ansible.html.markdown.swm diff --git a/.ansible.html.markdown.swm b/.ansible.html.markdown.swm deleted file mode 100644 index ff91c7a0069c9f7912c3dbca68ff82ef4414acbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 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 Ynuu4qaxs76W+%2kJaY??686LUzcvKH*#H0l From 81666159b4358be0a4c9e767256725529a0e3b35 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Thu, 1 Mar 2018 22:56:54 +0100 Subject: [PATCH 87/90] Delete .ansible.html.markdown.swn --- .ansible.html.markdown.swn | Bin 61440 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .ansible.html.markdown.swn diff --git a/.ansible.html.markdown.swn b/.ansible.html.markdown.swn deleted file mode 100644 index 25fce1a64cba427b4f67d4f1723650743c791bbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61440 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 From 30b7e84f2642dc4182d3c1333ffe14fdaddd6f5b Mon Sep 17 00:00:00 2001 From: sirkubax Date: Tue, 15 May 2018 12:03:43 +0200 Subject: [PATCH 88/90] add example playbook --- ansible.html.markdown | 74 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 68 insertions(+), 6 deletions(-) diff --git a/ansible.html.markdown b/ansible.html.markdown index 741952227d..d02ca1ce81 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -6,14 +6,73 @@ contributors: filename: LearnAnsible.txt --- -## Ansible: the easiest orchestration tool - -```yaml --- -"{{ Explanation: Why Ansible and detailed Intro }}" written in the second part of document +"{{ Ansible }}" is an orchestration tool written in Python. ``` +## Example +An example playbook to install apache and configure log level +```yml +--- +- hosts: apache + + vars: + apache2_log_level: "warn" + + handlers: + - name: restart apache + service: + name: apache2 + state: restarted + enabled: True + notify: + - Wait for instances to listen on port 80 + become: True + + - name: reload apache + service: + name: apache2 + state: reloaded + notify: + - Wait for instances to listen on port 80 + become: True + + - name: Wait for instances to listen on port 80 + wait_for: + state: started + host: localhost + port: 80 + timeout: 15 + delay: 5 + + tasks: + - name: Update cache + apt: + update_cache: yes + cache_valid_time: 7200 + become: True + + - name: Install packages + apt: + name={{ item }} + with_items: + - apache2 + - logrotate + notify: + - restart apache + become: True + + - name: Configure apache2 log level + lineinfile: + dest: /etc/apache2/apache2.conf + line: "LogLevel {{ apache2_log_level }}" + regexp: "^LogLevel" + notify: + - reload apache + become: True + +``` ## Installation ```bash @@ -29,7 +88,7 @@ $ apt-get install ansible ### Your first ansible command (shell execution) ```bash -# This command ping the localhost (defined in default inventory /etc/ansible/hosts) +# This command ping the localhost (defined in default inventory: /etc/ansible/hosts) $ ansible -m ping localhost # you should see this output localhost | SUCCESS => { @@ -231,12 +290,15 @@ For now you should know that CLI variables have the top priority. You should also know, that a nice way to pool some data is a **lookup** ### Lookups +Awesome tool to query data from various sources!!! Awesome! query from: -* pipe +* pipe (load shell command output into variable!) * file * stream * etcd +* password management tools +* url ```bash # read playbooks/lookup.yml From 0429074f0808ec5f369f53375bdd6580f246f81e Mon Sep 17 00:00:00 2001 From: sirkubax Date: Tue, 15 May 2018 12:04:30 +0200 Subject: [PATCH 89/90] rm .ansible.html.markdown.swl --- .ansible.html.markdown.swl | Bin 36864 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .ansible.html.markdown.swl diff --git a/.ansible.html.markdown.swl b/.ansible.html.markdown.swl deleted file mode 100644 index 259fc5a0fdcabe28f06489c96d067f9afa3a24f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36864 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 VZD?PWLk>Rse*o}Uz#RYp From 2af6679e91bdaf055cc969e7fbf7c2585f744e43 Mon Sep 17 00:00:00 2001 From: sirkubax Date: Tue, 15 May 2018 12:06:16 +0200 Subject: [PATCH 90/90] add example playbook --- ansible.html.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/ansible.html.markdown b/ansible.html.markdown index d02ca1ce81..a319a89d4b 100644 --- a/ansible.html.markdown +++ b/ansible.html.markdown @@ -6,6 +6,7 @@ contributors: filename: LearnAnsible.txt --- +```yml --- "{{ Ansible }}" is an orchestration tool written in Python.