iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 27
1
Kubernetes

在地端建置Angular+ASP.NET Core的DevOps環境系列 第 27

day27_ansible05_vault,variables_facts,defaults,vars

  • 分享至 

  • xImage
  •  

前言

今天的都很重要呀!!
有些比較難的個人理解有限,就只PO比較簡單的部分
(如果理解有誤,再麻煩大大們留言勘誤,感恩)
有用到時還是建議查官網手冊,或GOOGLE找解答喔~
閒聊的部分打在結語好了~GOGO~

vault(這個很重要呀!!)

先來簡單的操作一下

# 假設你已在ansible專案目錄了
$ mkdir -p /group_vars/all/
$ export EDITOR=vi # ansible 2.1以前預設是vim(有的電腦沒vim,還是指定一下編輯器)
$ cd /group_vars/all/ 
$ ansible-vault create vault 
Vault password: # 會問你vault密碼,這個檔案要設定的vault password
Confirm Vault password:
# 接著會用vi編輯檔案,你打明文
--- 
vault_db_pass: GWF@$TVASV

# 實際上會變成密文
$ANSIBLE_VAULT;1.1;AES256
31326664313635666139646530343436636439393631313266353235393335643639343932623535
3561366265333735616236353263633134363564653766310a303932653039613161623864366263
33386537306131323166663564663436613136393461643263346465613134393966333763646330
3561366265333735616236353263633134363564653766310a303932653039613161623864366263
33386537306131323166663564663436613136393461643263346465613134393966333763646330
633163626635303238306233633164313566663337306323830623

# 後續俢改
$ ansible-vault edit vault

問題來了,我的ansible專案怎麼用vault裡的變數呢?
設定在ansible.cfg的vault_password_file
例如:

# 把密碼放在一個檔案,只有owner可以讀寫(0600=>110 read/write/exec)
$ echo "your vault's password" > ~/.vault_passwd.txt 
$ chmod 0600 !$ 

# 「!$」補充說明:
# 「!$」是指「上個command」的「end」
# 例如:
# $ grep -i joe /some/long/directory/structure/user-lists/list-15 # /some/.../list-15 就是這個the end of the command
# $ vi !$
# 等於 $ vi /some/long/directory/structure/user-lists/list-15

# ansible.cfg
vault_password_file = ~/.vault_passwd

看過簡單的範例,我們來review一下官網文件囉

best-practices-for-variables-and-vaults

https://docs.ansible.com/ansible/latest/user_guide/playbooks_best_practices.html#best-practices-for-variables-and-vaults
這是官方建議的作法,代表,很多高級專案也可能長這樣
了解best practices對你看網路上的專案有幫助
官方建議把「變數名稱」放在未加密的檔案,這樣才好維護
只加密「變數的內容」(用vault加密

在跑Playbook時,Ansible會在沒加密的文件中找到「變數名稱」,而所有「機敏內容」都在加密文件裡

  • 1、建議從group_vars/,建立2個檔案 vars 和 vault
  • 2、在vars定義「所有變數名稱」,包括「不用加密變數」跟「要加密的變數」
  • 3、將所有「要加密的變數名稱」複製到Vault,並使用vault_當變數名稱的prefix
  • 4、使用jinja2語法調整vars中的變數指到「vault_」開頭的變數,並確保Vault是加密的

哪些東西可加密?

Ansible Vault可以加密Ansible的任何結構化文件(檔案)、資料都可以加密
包括

  • 放在group_vars/或host_vars/裡的變數
  • 由include_vars或vars_files加進來的變數(寫在playbook)
  • 使用「-e @ file.yml」或「-e @file.json」在跑ansible-playbook才指定的變數的檔案
  • tasks、handlers也是資料,也可以加密
    如果要隱藏變數名稱,可以加密整個task file
  • Ansible Vault還可以加密任何檔案
    如果將vault加密文件作為src參數提供給copy、template、unarchive、script、assemble這些modules,
    則這些文件會被放在目標主機(dest host)上的目標主機上解密
    當然在跑playbook時要傳vault password給目標主機

從版本2.3開始,Ansible支持加密YAML文件中的單個值,使用!vault標記讓YAML和Ansible知道它使用特殊處理。下面將詳細介紹此功能。

在ansible專案底下

# 加密
$ ansible-vault create foo.yml # 建新檔案,用create
$ ansible-vault encrypt foo.yml bar.yml baz.yml # 已經存在的檔案,用encrypt
# 預設用AES加密(對稱式金鑰),所以檔案如果被copy走,可以被慢慢暴力破解
# 所以valut password最好不要跟其他密碼一樣,降低風險

# 修改
$ ansible-vault edit foo.yml
# 只看不改
$ ansible-vault view foo.yml bar.yml baz.yml


# 設新密碼(rekeying)
$ ansible-vault rekey foo.yml bar.yml baz.yml # 會先問舊密碼,再輸入新密碼
# 解密
$ ansible-vault decrypt foo.yml bar.yml baz.yml
# Use encrypt_string to create encrypted variables to embed in yaml
這段有關--vault-id我看不太懂,怕被誤導的請略過,或直接看原文喔
# 對字串加密
$ ansible-vault encrypt_string --vault-id a_password_file 'foobar' --name 'the_secret'
# 字串: 'foobar'
# 變數名稱: 'the_secret'
# --vault-id: 密碼
# 密碼檔: a_password_file
# 幫--vault-id,設一個label,dev
# --vault-id  =>  label@password
$ ansible-vault encrypt_string --vault-id dev@password 'foooodev' --name 'the_dev_secret'

其他提供vault passwords的方式

$ ansible-playbook --vault-id /path/to/my/vault-password-file site.yml
$ ansible-playbook --vault-id @prompt site.yml # 提示輸入密碼
$ ansible-playbook --ask-vault-pass site.yml # 不知道有何差別?
$ ansible-playbook --vault-password-file dev-password site.yml
# 前面應該有講過了
# 可設定環境變數DEFAULT_VAULT_PASSWORD_FILE,指定預設的密碼檔位置

# 也可餵多個密碼檔
$ ansible-playbook --vault-id dev@dev-password --vault-id prod@prompt site.yml

給vault-id貼label的用途

最常用的,
例如:dev:開發環境、prod:正式環境

$ ansible-playbook --vault-id dev@dev-password --vault-id prod@prompt site.yml

Running a Playbook With Vault

https://docs.ansible.com/ansible/latest/user_guide/playbooks_vault.html

跑playbook怎麼讀到vault加密的東西呢?

有3種作法

  • 1、下ansible-playbook指令時問密碼
$ ansible-playbook site.yml --ask-vault-pass
  • 2、把密碼寫在檔案(權限要設一下喔)
$ ansible-playbook site.yml --vault-password-file ~/.vault_pass.txt
$ ansible-playbook site.yml --vault-password-file ~/.vault_pass.py
  • 3、設環境變數ANSIBLE_VAULT_PASSWORD_FILE
    Ansible會自動去找這個變數的檔案
    例如:
export ANSIBLE_VAULT_PASSWORD_FILE=~/.vault_pass.txt
通常都寫到 ~/.bash_profile 或 ~/.bashhrc

===

facts

官網文件:
https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#information-discovered-from-systems-facts
https://docs.ansible.com/ansible/2.7/user_guide/playbooks_variables.html

變數:ansible_facts,跟system有關的資訊

為了看fact變數,我在macOS下

$ ansible 127.0.0.1 -m setup
    "ansible_en0": { # 這邊我的網卡就不是eth0,而是en0,ubuntu應該就是eth0
      "device": "en0", 
      "ipv4": [
        {
          "address": "172.20.10.5", 
          "broadcast": "172.20.10.15", 
          "netmask": "255.255.255.240", 
          "network": "172.20.10.0"
        }
      ], 
- host: databse
  become: true
  tasks:
    - name: ensure mysql listening on all ports
      lineinfile: dest=/etc/mysql/my.cnf regexp=^bind-address # 用正則表達式找line
                  line="bind-address = {{ ansible_eth0.ipv4.address }}" # 讓我的mysql bind正確的ip

===

default

https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse_roles.html#role-default-variables

  • roles/myapp/meta/main.yml
---
dependencies:
  - role: common
    vars:
      some_parameter: 3
  - role: apache
    vars:
      apache_port: 80
  - role: postgres
    vars:
      dbname: blarg
      other_parameter: 12

假設有一個role,叫mysql
/mysql/defaults/main.yml 定義了這個role預設的變數,內容如下

---
db_name: myapp
db_user_name: dbuser
db_user_pass: dbpass
db_user_host: localhost

mysql/tasks/main.yml 就能用這些變數

- name: create database
  mysql_db: name={{ db_name }} state=present

- name: create user
  mysql_user: name={{ db_user_name }} password={{ db_user_pass }} priv={{ db_name }}.*:ALL
              host='{{ db_user_host }}' state=present

===

vars

https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html
跳離role/,我們回到專案的根目錄

  • /group_vars/all/vars
---
db_name: demo
db_user: demo
db_pass: "{{ vault_db_pass }}"

例如:kube-ansible,/inventory/group_vars/all/vars

然後在ansible-playbook的yaml檔,要用role時,就可以傳參數進去

---
- hosts: database
  become: true
  roles:
    - role: mysql
      db_user_name: "{{ db_user }}" # 把/group_vars/all/vars 的變數傳給role mysql
      db_user_pass: "{{ db_pass }}"
      db_user_host: '%'
# 也可以寫成一行
    - { role: mysql, db_user_name: "{{ db_user }}", db_user_pass: "{{ db_pass }}", db_user_host: '%'}

結語

今天11/11,個人反而覺得是閃光節,
原為:出雙入對,雙雙對對
實際上被操作成「電商節」

景氣差,血拼前要衡量自身財力嘿

SATA3 的 SSD 變好便宜喔,忍住忍住,
為了2年後換 macbook 不能再亂買其他 3C 產品惹

昨天udemy變成300$(最近比較少變300$了,幾乎都360$)
又買了幾門課 = =
依我買課的coco(一個月超過3門)的用量來看,
pluralsight好像比較便宜na
(用ios訂閱的話,一個月890$,如果有更便宜的訂閱方式歡迎留言分享喔)
不過我的udemy已經買很齊了,而且一堆買了都還沒看,還是忍住別再去訂閱pluralsight

可能明年要一次參加多個鐵人賽,才能逼自己把買的課程看完了 = ="

不過google了一下,Visual Studio Dev Essentials(免費),
可以免費用pluralsight 3個月,
等有時間學的時候再來啟用&評估,聽說課程很優質,很多課又有中文字幕
https://samtsai.org/2017/09/15/160-visual-studio-essentials-pluralsight-free/
https://docs.microsoft.com/zh-tw/visualstudio/subscriptions/vs-pluralsight
https://ithelp.ithome.com.tw/upload/images/20181111/20107868Dj4silSKIX.png


上一篇
day26_ansible04_modules_pip,mysql_db,mysql_user,wait_for,uri,register,when
下一篇
day28_ansible06_variables_with_dict,group_vars,vars_files
系列文
在地端建置Angular+ASP.NET Core的DevOps環境31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言