Top Banner
40

Best practices for ansible roles development

Jan 22, 2018

Download

Technology

jtyr
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Best practices for ansible roles development
Page 2: Best practices for ansible roles development

●●

○○○○

●○○

Page 3: Best practices for ansible roles development
Page 4: Best practices for ansible roles development

- file: path=/etc/foo.conf mode=0644

- file: path=/etc/foo.conf mode=0644

- file: "path=/etc/foo.conf mode=0644"

- file: path: /etc/foo.conf mode: 0644

Page 5: Best practices for ansible roles development
Page 6: Best practices for ansible roles development

- file: path: "{{ my_path }}" owner: "foo" group: "bar" mode: "0644"

- copy:dest: "{{ my_path }}"

content: " Some very long line which needs to be wrapped"

- copy: dest: "{{ my_path }}" content: "First\nSecond\n"

- file: path: "{{ my_path }}" owner: foo group: bar mode: 0644

- copy:dest: "{{ my_path }}"

content: >2- Some very long line which needs to be wrapped

- copy:dest: "{{ my_path }}"

content: | First Second

Page 7: Best practices for ansible roles development

● - { } [ ] * & ? | > ! % ` # @ :

- file: path: "{{ my_path }}" mode: 0644

●- debug: msg: "Path: {{ my_path }}"

● yes false

- copy: dest: "{{ my_path }}" content: "yes"

● yamllint

ansible all -i localhost, --connection local -m debug -a 'msg={{xxx}}' -e '{xxx: @asd}'

Page 8: Best practices for ansible roles development
Page 9: Best practices for ansible roles development

- file: path: "{{ my_path }}" owner: foo group: bar mode: 0644

- hosts: all vars: data: aaa: bbb ccc: - ddd: - eee

# Half tabs (4 spaces)- file: path: "{{ my_path }}" owner: foo group: bar mode: 0644

# Inconsistent indentation- hosts: all vars: data: aaa: bbb ccc: - ddd: - eee

Page 10: Best practices for ansible roles development
Page 11: Best practices for ansible roles development

● .yml .yaml .jon .json● .yaml meta

Page 12: Best practices for ansible roles development
Page 13: Best practices for ansible roles development

●●

●○○

Page 14: Best practices for ansible roles development
Page 15: Best practices for ansible roles development

# roles/role1/defaults/main.yamlvar1: aaa

# roles/role2/defaults/main.yamlvar1: bbb

# group_vars/allvar1: ccc

# role1/defaults/main.yamlrole1_var1: aaa

# role2/defaults/main.yamlrole2_var1: bbb

# group_vars/allrole2_var1: ccc

Page 16: Best practices for ansible roles development
Page 17: Best practices for ansible roles development

# roles/role1/defaults/main.yamlrole1_var1: aaa

# roles/role1/tasks/main.yaml- debug: msg: > var1={{ role1_var1 }}, var2={{ role1_var2 }}

# group_vars/allrole1_var2: bbb

# roles/role1/defaults/main.yamlrole1_var1: aaa# Must be defined by the userrole1_var2: null

# roles/role1/tasks/main.yaml- debug: msg: > var1={{ role1_var1 }}, var2={{ role1_var2 }}

# group_vars/allrole1_var2: bbb

Page 18: Best practices for ansible roles development
Page 19: Best practices for ansible roles development

# roles/role1/defaults/main.yamlrole1_var1: aaa

# roles/role1/vars/main.yamlrole1_var2: bbb

# roles/role1/tasks/main.yaml- debug: msg: > var1={{ role1_var1 }}, var2={{ role1_var2 }}

# roles/role1/defaults/main.yamlrole1_var1: aaarole1_var2: bbb

# roles/role1/tasks/main.yaml- debug: msg: > var1={{ role1_var1 }}, var2={{ role1_var2 }}

Page 20: Best practices for ansible roles development

● vars defaults

# roles/role1/meta/main.yamldependencies: - role2

# roles/role1/vars/main.yamlrole1_var1: bbb

# roles/role2/defaults/main.yamlrole1_var1: aaa

●○○

Page 21: Best practices for ansible roles development
Page 22: Best practices for ansible roles development

- file: path: /etc/foo.conf mode: 0644

- name: Set foo.conf mode file: path: /etc/foo.conf mode: 0644

Page 23: Best practices for ansible roles development
Page 24: Best practices for ansible roles development

- cron: name: Run my command job: /usr/bin/my_prog minute: "*" hour: "*" state: present

- cron: name: Run my command job: /usr/bin/my_prog

- cron: name: Run my command minute: "{{ minute }}" hour: "{{ hour }}" job: /usr/bin/my_prog

Page 25: Best practices for ansible roles development
Page 26: Best practices for ansible roles development

- package: name: mysql-server

- template: src: my.cnf.j2 dest: /etc/my.cnf

- service: name: mysql enabled: yes state: started

- package: name: mysql-server tags: - mysql_pkg

- template: src: my.cnf.j2 dest: /etc/my.cnf tags: - mysql_config

- service: name: mysql enabled: yes state: started tags: - mysql_service

Page 27: Best practices for ansible roles development

# roles/mysql/tasks/main.yaml- package: name: "{{ mysql_pkg }}" notify: Restart MySQL service tags: mysql_pkg

- template: src: my.cnf.j2 dest: "{{ mysql_config_path }}" notify: Restart MySQL service tags: mysql_config

- service: name: "{{ mysql_service }}" enabled: yes tags: mysql_service

- service: name: "{{ mysql_service }}" state: started register: mysql_service_started tags: mysql_service

# roles/mysql/handlers/main.yaml- name: Restart MySQL service service: name: "{{ mysql_service }}" state: restarted when: > mysql_service_started is not defined or not mysql_service_started.changed

# roles/mysql/defaults/main.yamlmysql_pkg: mysql-servermysql_config_path: /etc/my.cnfmysql_service: mysql

Page 28: Best practices for ansible roles development
Page 29: Best practices for ansible roles development

- lineinfile: path: /etc/selinux/config regexp: ^SELINUX= line: SELINUX=enforcing

- template: src: selinux_config.j2 dest: /etc/selinux/config

Page 30: Best practices for ansible roles development
Page 32: Best practices for ansible roles development

# Desired config file (myapp.cfg):[section1]option11=value11option12=value12

# myapp_role/templates/myapp.cfg.j2:{{ myapp_config | encode_ini }}

# myapp_role/defaults/main.yaml:myapp_config: section1: option11: value11 option12: value12

# myapp_role/tasks/main.yaml:- name: Create config file template: dest: /etc/myapp/ myapp.cfg src: myapp.cfg.j2

Page 33: Best practices for ansible roles development

# myapp_role/defaults/main.yaml:

myapp_section1_option11: value1myapp_section1_option12: value2

myapp_section1__default: option11: "{{ myapp_section1_option11 }}" option12: "{{ myapp_section1_option12 }}"

myapp_section1__custom: []

myapp_section1: "{{ myapp_section1__default.update(myapp_section1__custom)}}{{ myapp_section1__default}}"

myapp_config__default: section1: "{{ myapp_section1 }}"

myapp_config__custom: {}

myapp_config: "{{ myapp_config__default.update(myapp_config__custom) }}{{ myapp_config__default }}"

Page 34: Best practices for ansible roles development

# Desired config file (/etc/selinux/config):SELINUX=enforcingSELINUXTYPE=targeted

# roles/sudo/templates/selinux_config.j2:{{ ansible_managed | comment }}{{ selinux_config | encode_ini(ucase_prop=true) }}

# roles/selinux/defaults/main.yaml:selinux_config: selinux: enforcing selinuxtype: targeted

# roles/selinux/tasks/main.yaml:- name: Create config file template: dest: /etc/selinux/config src: selinux_config.j2

Page 35: Best practices for ansible roles development
Page 36: Best practices for ansible roles development

● README.md●

○○○○○

■○○

Page 37: Best practices for ansible roles development
Page 38: Best practices for ansible roles development

●●●●●●●

●●

Page 39: Best practices for ansible roles development

git clone https://github.com/jtyr/vagrantfile_config.git /tmp/vagrantfile_configmkdir -p /tmp/test/roles && cd /tmp/testgit clone https://github.com/jtyr/ansible-nginx.git roles/nginxgit clone https://github.com/jtyr/ansible-config_encoder_filters.git roles/config_encoder_filtersln -s /tmp/vagrantfile_config/Vagrantfile ./cat > vagrant.yaml <<END---defaults: provision_individual: yesvms: testvm1: ports: HTTP: host: 8080 guest: 80ENDcat > site.yaml <<END---- hosts: all become: yes roles: - nginxENDvagrant upvagrant provisionansible-playbook -i .vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory site.yamlvagrant sshssh -p 10000 -i .vagrant/machines/test/virtualbox/private_key -l vagrant localhostvagrant destroy -f

Page 40: Best practices for ansible roles development