Thứ Sáu, 18 tháng 3, 2022

Ansible Cheat Sheet


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') }}"

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

Ứng cứu khi chown -R user1:user1 /etc

1. Bài toán Gõ nhầm: chown -R user1:user1 /etc 2. Giải: Cách 1: Tìm bản backup /etc cũ (tỉ lệ phục hồi gần như ~100%) Cách 2: Tìm tạm 1 thư ...