「技巧」使用Ansible實現自動化運維的一些技巧

提示:本文要求讀者有一定的 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/


分享到:


相關文章: