提示:本文要求讀者有一定的 Ansible 使用經驗
最近一年才有機會在生產環境上使用 Ansible。用的過程中,想把一些小技巧記錄下來,避免自己忘記。如果能幫助到其他同學就更好了。如果有同學指出有更好的方法,就更更好了。
技巧1:校驗你的模板文件是否正確
通常我們會使用template module 來生成應用的配置,比如生成 Nginx 的配置或者 sudoers 配置。而像 sudoers 文件內的配置錯誤可能直接導致無法登錄。所以,我們希望在生成這些配置文件後能校驗一下它的正確性。如果校驗失敗,直接停止,不生成該配置文件。
而 template module 有一個屬性 validate 就是為了實現這一需求的:
- template:
src: "user-sudoers"
dest: "/etc/sudoers.d/abc"
validate: visudo -cf %s
校驗 Nginx 配置文件的文件:
- name: Copy the nginx file
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
validate: "/usr/sbin/nginx -t -c %s"
notify:
- restart nginx
校驗 Prometheus 配置文件:
- name: Copy Prometheus config
template:
src: prometheus.yml.j2
dest: "/etc/prometheus.yml"
validate: "promtool check config %s"
notify:
reload prometheus config
校驗 Logstash 配置文件:
- name: template configs
template:
src: "logstash-filter.conf"
dest: "/opt/logstash/conf"
validate: "logstash -t -f %s"
environment:
JAVA_HOME: "" ## logstash 命令需要 JAVA_HOME 環境變量
技巧2:使用 host 變量解決分佈式系統中的 id 問題
在部署 Zookeeper 時,通常會部署 3 臺組成集群,同時每臺 Zookeeper 都需要在配置一個 myid 的文本文件,而這個文件中只放id。而 id 是要求每臺機器都是不同的。這時 host 變量派上用場了。定義 host 變量有兩種方式:
第一種:直接在 inventory 文件中定義
[zk]
192.168.1.11 myid=1
192.168.1.12 myid=2
192.168.1.13 myid=3
第二種:在 host_vars 目錄中定義
這種方式筆者認為可維護性更高
├── group_vars
├── host_vars
│ ├── 192.168.1.11
│ ├── 192.168.1.12
│ ├── 192.168.1.13
├── hosts
#cat 192.168.1.11myid: 1
不推薦兩種方式都使用,因為變量的作用域問題會把你搞暈
技巧3:在執行 shell 時需要某個環境變量
某個 shell 需要一個臨時變量,可以使用 environment 實現
- name: install | Build commons daemon.
shell: "./configure && make chdir=/opt/pinpoint/"
environment:
- JAVA_HOME: ""
技巧4:Jinjia2 語法:去除最後的逗號
以下方式會生成:a,a,a,a, 注意最後的逗號我們是不需要的:
{% for f in files %}
a,
{% endfor %}
這時,我們可以這樣:
{% for f in files %}
a{%- if not loop.last -%},{% endif %}
{% endfor %}
技巧5: 利用 host 變量解決機器連接方式的不統一的問題
機器標準化要求每臺機器的ssh連接方式及管理員用戶名及密碼都是一樣的。但是事實中,面對老機器,常常做不過。所以,我們的 Ansible 腳本必須能做到不同的機器可以使用不同的連接方式、管理員用戶名和密碼。利用 host 變量就可以實現了。
舉個例子,當前的文件內容如下:
├── group_vars
├── host_vars
│ ├── 192.168.1.11
│ ├── 192.168.1.12
│ ├── 192.168.1.13
├── hosts
#cat 192.168.1.11ansible_ssh_user: abcansible_become_method: sudoansible_ssh_private_key_file: /users/abc/id_rsa
#cat 192.168.1.12ansible_ssh_user: bcdansible_become_method: sudoansible_ssh_pass: 1234567
#cat 192.168.1.13ansible_ssh_user: bcdansible_become_method: suansible_ssh_private_key_file: /users/bcd/id_rsaansible_ssh_pass: 1234567
小結
常識和技巧之間的界限很模糊。總之,希望對讀者有幫助。
原文轉載自:http://showme.codes/2018-06-22/ansible-in-action-1/
閱讀更多 無情河邊柳 的文章