Vim config fast Ansible
# vim ~/.vimrc
set ts=2 sw=2
set tabstop=2
Inventory
[redis_server]
pc1 ansible_ssh_host=192.168.122.129 install_redis=yes redis_role=master
pc2 ansible_ssh_host=192.168.122.128 install_redis=yes redis_role=slave
pc3 ansible_ssh_host=192.168.122.129 install_redis=yes redis_role=slave
Roles
Khai báo roles
---
- name: Install redis
hosts: redis
vars:
- ahihi: 'kaka'
roles:
- role: redis-all-in-one
become: true
Folder and File
https://docs.ansible.com/ansible/latest/collections/ansible/builtin/file_module.html
- name: create folder
file:
path: /setup
state: directory #hoặc file
owner: foo
group: foo
mode: '0755'
- name: delete folder
file:
path: /setup
state: absent
Debug
- name: show echo
shell: echo {{ tuanda }}
register: kiemtra
- name: Debug kiem tra lan 1
debug:
var: kiemtra
- name: debug kiem tra lan 2
debug:
msg: XIN CHAO {{ kiemtra }}
Tags
Để gọi riêng từng nhóm tags, đỡ phải chạy task không cần thiết như make redis (bỏ). Ta gọi thẳng start redis
Variable Priority
https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#understanding-variable-precedence cái nào xuất hiện trước, sẽ được ưu tiên lấy ra đầu tiên
1. File trong yml role > inventory /etc/ansible/hosts
- option -e cao nhất (0)
- Khai báo trong thư mục roles/xxx/vars (1) sẽ có độ ưu tiên cao nhất, dù khai báo 2,3,4 đều không lấy biến đó.
- file role tổng (2) (file gọi các roles)
- file inventory /etc/ansible/hosts (3)
- file trong roles/xxx/default (4)
group_vars và host_vars (Thư mục)
Thứ tự các file sắp xếp như dưới đấy. Việc oder file nào trước nằm ở mục Variable Priority
[tuanda@master-node nfs-server-client]$ cat inventory.yml
[nfs_server]
pc1 ansible_ssh_host=192.168.56.12
[nfs_client]
pc2 ansible_ssh_host=192.168.56.13
[tuanda@master-node nfs-server-client]$ tree
.
├── group_vars
│ ├── all.yml
│ ├── nfs_client
│ │ ├── nfs_client.yml
│ │ └── nfs_server.yml
│ └── nfs_server
├── host_vars
│ ├── pc1.yml
│ └── pc2.yml
├── inventory.yml
├── nfs.yml
└── roles
Copy
- name: Upload package require
copy:
src: "{{ item }}.rpm"
dest: /setup/
loop: "{{ package_names }}"
Local Copy
Lưu file từ stdout > Ansible master
- name: "Storing Token"
local_action: copy content={{ x.stdout }} dest=/tmp/token
Template
Unarchive
- name: Extract foo.tgz into /var/lib/foo
unarchive:
src: /var/lib/foo.tgz
dest: /var/lib/foo/
Lookup get file
- name: Set authorized key took from file
authorized_key:
user: charlie
state: present
key: "{{ lookup('file', '/home/charlie/.ssh/id_rsa.pub') }}"
- name: Set authorized key took from file
authorized_key:
user: charlie
state: present
key: "{{ lookup('file', '/home/charlie/.ssh/id_rsa.pub') }}"
Loop
Ngoài loop theo item liệt kê. ta còn có thể loop theo variable theo loop.
loop:
- {{ list_port }}
Verify inventory
Để kiểm tra Ansible đang load variable từ những file nào, giá trị latest ra sao, ta có thể chạy
ansible-inventory -i host.yaml --list (dạng json)
ansible-inventory -i host.yaml --list -y (dạng yaml)
Handler:
- name: "restart redis 1"
service:
name: "{{ redis_service_name }}"
state: restarted
Sau đó gọi bằng notify: restart redis 1
Create user if not exist
- name: check if redis user exists (ignore errors)
command: id {{ redis_user }}
ignore_errors: yes
changed_when: false
register: user_exists
- name: add redis group
group:
name: "{{ redis_group }}"
state: present
when: user_exists is failed
- name: add redis user
user:
name: "{{ redis_user }}"
group: "{{ redis_group }}"
comment: "Redis"
home: "{{ redis_install_dir }}"
shell: /bin/false
system: yes
when: user_exists is failed
when
VD1: Compare variable string
[redis_server] < Ta đặt inventory variable như sau:
192.168.122.129 install_redis=yes redis_role=master
...
when:
- redis_role == 'master'
Ví dụ 2: When with variable bool
Ta đặt default var là redis_tarball: false
when: not redis_tarball
when: redis_tarball
Nếu là false thì
nếu là string hoặc interger thì:
For jinja
Link kiểm tra Jinja https://cryptic-cliffs-32040.herokuapp.com/ File default:
redis_save:
- 900 1
- 300 10
- 60 10000
File template
{% for save in redis_save -%}
save {{ save }}
{% endfor -%}
IF ijnja
Trong file default mặc định để false. Nếu thay đổi thì xóa false đi và thay bằng string
redis_bind: false
Trong file Template
{% if redis_bind -%}
bind {{ redis_bind }}
{% else %}
bind 127.0.0.1
{% endif -%}
>>>> Hoặc, để bỏ dòng bind nếu false <<<<<
{% if redis_bind -%}
bind {{ redis_bind }}
{% endif -%}
Giải thích: Nếu false thì sẽ không có trong file config, nếu không false thì sẽ là string và kết quả là: requirepass matkhau
Ansible Vault
Phần 1: Tạo và chạy Vault (mã hóa all)
ansible-vault create test1.yaml
---
- hosts: api
become: true
tasks:
- name: echo text
shell: echo XINCHAO
ansible-vault edit test1.yaml
ansible-vault view test1.yaml
ansible-playbook test1.yaml --ask-vault-pass
Phần 2: Chèn vault vào variable
ansible-vault encrypt_string --vault-id @prompt thisismysupersecretstring
---
- hosts: api
become: true
vars:
secret: !vault |
$ANSIBLE_VAULT;1.1;AES256
66666435303938323065643534376535633535353766323062633566313038313839343038336237
3966616433326432643365623136383332313733646333390a333762663236393636613232663762
33313861656264313061363265653031366538373662336132626465613839313335613862343464
6436303837643761630a666532623532616431303632613466646661326566326332306264323236
61383331333833333530373934356333653962396661336336653034306339306333
tasks:
- name: echo text
shell: echo {{ secret }}
Sau đó ta chạy
ansible-playbook test1_encrypt.yaml --ask-vauld-pass
ansible-playbook test1_encrypt.yaml --vault-password-file=pass.txt
Không có nhận xét nào:
Đăng nhận xét