Ansible 小手冊系列 二十(經常遇到的問題)

(1). 怎么為任務設置環(huán)境變量爱只?

- name: set environment
  shell: echo $PATH $SOME >> /tmp/a.txt
  environment:
    PATH: "{{ ansible_env.PATH }}:/thingy/bin"
    SOME: value

(2). 不同的用戶登錄不同的主機民镜?

在主機清單里設置

[webservers`]
asdf.example.com  ansible_port=5000   ansible_user=alice  ansible_pass=123456
jkl.example.com   ansible_port=5001   ansible_user=bob   ansible_pass=654321

也可以指定連接類型

[testcluster]
localhost           ansible_connection=local
/path/to/chroot1    ansible_connection=chroot
foo.example.com
bar.example.com

(3). 通過跳轉主機訪問無法訪問的主機

    ansible_ssh_common_args: '-o ProxyCommand="ssh -W %h:%p -q user@gateway.example.com"'
    ansible_ssh_common_args: '-o ProxyCommand="sshpass -f /etc/tpasswd ssh xx@10.10.10.1 -p 66677 nc %h %p"' 

(4). 關閉cowsay功能

export ANSIBLE_NOCOWS=1

(5). 關閉ssh在首次連接時出現(xiàn)檢查keys 的提示

export ANSIBLE_HOST_KEY_CHECKING=False

(6). 查看主機名的所有清單變量嫁佳?

ansible -m debug -a "var=hostvars['hostname']" localhost

(7). 通過拼接字符串乾蛤,來獲取接口ip地址

{{ hostvars[inventory_hostname]['ansible_' + which_interface]['ipv4']['address'] }}

(8). 獲取組中第一個主機的ip地址

{{ hostvars[groups['webservers'][0]]['ansible_eth0']['ipv4']['address'] }}

(9). 在任務中設置變量

- set_fact: headnode={{ groups[['webservers'][0]] }}
- debug: msg={{ headnode}}

(10). 如何獲取shell變量砸西?

vars:
  local_home: "{{ lookup('env','HOME') }}"
tasks:
   - debug: var=local_home

在ansible1.4版本以上力喷,可以使用以下方式獲取

- debug: var=ansible_env.HOME

(11). 在模板中如何遍歷某一組內的所有主機?

{% for host in groups['db_servers'] %}
  {{ host }}
{% endfor %}

獲取ip地址

{% for host in groups['db_servers'] %}
  {{ hostvars[host]['ansible_eth0']['ipv4']['address'] }}
{% endfor %}

(12). 加密hosts主機清單文件

有時候我們主機清單里面會有些密碼信息眷昆,但是不想讓別人看到蜒秤。這種情況可以用ansible-vault來達到此目的。

[root@node1 ansible]# cat db_hosts
localhost ansible_connection=local
[root@node1 ansible]# ansible-vault encrypt db_hosts 
New Vault password: 
Confirm New Vault password: 
Encryption successful
[root@node1 ansible]# ansible -i db_hosts localhost -m ping
ERROR! Decryption failed
Decryption failed
[root@node1 ansible]# ansible -i db_hosts --ask-vault-pass localhost -m ping
Vault password: 
localhost | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
[root@node1 ansible]# cat db_hosts 
$ANSIBLE_VAULT;1.1;AES256
61663966666265363465653064386666326234353433346163633838366532366236313032303636
6437313333333936396164663031633566613233343161650a333163333732616130343762636135
30303864663138643661393234336433313465623830333832663165393964353961323261373130
3135626236626435640a396338616563646532623966333337366365636665663563666432333539
61663632633130623733316232353836663366623136636432616332376266383263356264303765
6133616235363066356164653232326139643862653464623037

(13). service 模塊啟動服務沒效果隙赁?
首先檢查下service httpd status的信息垦藏,是不是有

httpd is stopped

這種字符梆暖,沒有的話伞访,在服務啟動腳本里,在case語句里添加以下方法

status)
    status -p ${pidfile} $httpd
    RETVAL=$?
    ;;
# bash變量
# httpd=${HTTPD-/usr/sbin/httpd}
# pidfile=${PIDFILE-/var/run/httpd/httpd.pid}

從而達到service http status有stopped的字樣轰驳。

(14). 遞歸目錄中的模版文件

- name: Copying the templated jinja2 files
  template: src={{item}} dest={{RUN_TIME}}/{{ item | regex_replace(role_path+'/templates','') | regex_replace('\.j2', '') }}
  with_items: "{{ lookup('pipe','find {{role_path}}/templates -type f').split('\n') }}"

(15). 目標主機的python為2.7版本厚掷,且需要使用yum模塊
需要增加下列變量,指定python版本為2.6

- hosts: servers
  vars:
    - ansible_python_interpreter: /usr/bin/python2.6.6

(16). 遠程遍歷拷貝文件

- name    : get files in /path/
  shell   : ls /path/*
  register: path_files
    
- name: fetch these back to the local Ansible host for backup purposes
  fetch:
  src : /path/"{{item}}"
  dest: /path/to/backups/
  with_items: "{{ path_files.stdout_lines }}"

(17). 獲取主機清單中組的ip地址

- shell: "ping -c 1 {{item}} | grep icmp_seq | gawk -F'[()]'  '{print $2}'"
  with_inventory_hostnames: test2
  register: testip

 - debug: "msg={{ item.stdout }}"
  with_items: "{{ testip.results }}"

(18). 保留ansbile遠程執(zhí)行的模塊文件级解,并調試模塊

添加ANSIBLE_KEEP_REMOTE_FILES=1 環(huán)境變量

`$ ANSIBLE_KEEP_REMOTE_FILES=1 ansible localhost -m ping -a 'data=debugging_session' -vvv`
  sing module file /usr/lib/python2.6/site-packages/ansible/modules/core/system/ping.py
  <localhost> ESTABLISH LOCAL CONNECTION FOR USER: root
  <localhost> EXEC /bin/sh -c '( umask 77 && mkdir -p "` echo ~/.ansible/tmp/ansible-tmp-1489477306.61-275734926719932 `" && echo ansible-tmp-1489477306.61-275734926719932="` echo ~/.ansible/tmp/ansible-tmp-1489477306.61-275734926719932 `" ) && sleep 0'
  <localhost> PUT /tmp/tmpv4EenK TO /root/.ansible/tmp/ansible-tmp-1489477306.61-275734926719932/ping.py
  <localhost> EXEC /bin/sh -c 'chmod u+x /root/.ansible/tmp/ansible-tmp-1489477306.61-275734926719932/ /root/.ansible/tmp/ansible-tmp-1489477306.61-275734926719932/ping.py && sleep 0'
  <localhost> EXEC /bin/sh -c '/usr/bin/python /root/.ansible/tmp/ansible-tmp-1489477306.61-275734926719932/ping.py && sleep 0'
  localhost | SUCCESS => {
      "changed": false, 
      "invocation": {
          "module_args": {
              "data": "debugging_session"
          }, 
          "module_name": "ping"
      }, 
      "ping": "debugging_session"
}

模塊文件是由base64編碼的字符串文件冒黑,可使用explode將字符串轉換成可執(zhí)行的python文件

$ python /root/.ansible/tmp/ansible-tmp-1489477306.61-275734926719932/ping.py explode
Module expanded into:
/root/.ansible/tmp/ansible-tmp-1489477306.61-275734926719932/debug_dir
$ tree  /root/.ansible/tmp/ansible-tmp-1489477306.61-275734926719932/debug_dir/
/root/.ansible/tmp/ansible-tmp-1489477306.61-275734926719932/debug_dir/
├── ansible
│   ├── __init__.py
│   └── module_utils
│       ├── basic.py
│       ├── __init__.py
│       ├── pycompat24.py
│       ├── six.py
│       └── _text.py
├── ansible_module_ping.py
└── args

ansible_module_ping.py 是模塊本身的代碼。
args文件包含一個JSON字符串勤哗。 該字符串是一個包含模塊參數(shù)和其他變量的字典抡爹。
ansible目錄包含由ansible_module_ping模塊使用的ansible.module_utils的代碼文件。
如果修改了debug_dir文件中的代碼之后芒划,需要使用execute執(zhí)行代碼

$ python /root/.ansible/tmp/ansible-tmp-1489477306.61-275734926719932/ping.py execute
{"invocation": {"module_args": {"data": "debugging_session"}}, "changed": false, "ping": "debugging_session"}

(19). 提升權限

Ansible ad-hoc命令

ansible -i hosts node1 -m shell -a "whoami" --become  --become-method=su --become-user=root --ask-su-pass
SU password: 
192.168.77.130 | SUCCESS | rc=0 >>
root

Ansible-playbook命令

cat test.yml
---
- hosts: node1
  gather_facts: no
  tasks:
  - name: I'm become to root.
    shell: whoami
    register: w
    become: true
    become_user: "root"
    become_method: "su"
  - debug: var=w.stdout

[root@base ~]# ansible-playbook -i hosts test.yml --ask-su-pass
SUDO password: 

PLAY [node1] ****************************************************************************************************************************************

TASK [I'm become to root.] **************************************************************************************************************************
changed: [192.168.77.130]

TASK [debug] ****************************************************************************************************************************************
ok: [192.168.77.130] => {
    "w.stdout": "root"
}

PLAY RECAP ******************************************************************************************************************************************
192.168.77.130             : ok=2    changed=1    unreachable=0    failed=0  

如果不想在執(zhí)行過程中輸入提升用戶的密碼冬竟,可以在hosts文件中配置ansible_become_pass變量設置密碼欧穴。

# cat hosts 
[node1]
192.168.77.130 ansible_ssh_user=test ansible_ssh_pass=123456 ansible_become_pass=123456

參數(shù)解釋

  • become 開啟提升權限
  • become-method 提升權限的方式,有sudo泵殴,su涮帘,runas等。
  • become-user 提升權限的用戶
  • ansible_become_pass 提升權限的用戶密碼
  • ask-su-pass 告訴程序提升權限的用戶密碼

(20). 變量嵌套

在動態(tài)取變量的時候笑诅,我們第一時間就會寫出"{{ t_var[{{ n }}] }}"的引用命令调缨,但這類引用在jinja2的語法中是錯誤的,可以使用下列方式解決此引用問題吆你。

- hosts: localhost
  gather_facts: no
  vars:
   - t_var: ['1','2']
   - n: "1"

  tasks:
   - shell: "echo {% if n %} {% set number = n | int %} {{ t_var[number]}} {% endif %}"
ansible-playbook test.yml -vv
Using /etc/ansible/ansible.cfg as config file
 [WARNING]: provided hosts list is empty, only localhost is available


PLAYBOOK: test.yml ***************************************************************************************************************
1 plays in test.yml

PLAY [localhost] *****************************************************************************************************************
META: ran handlers

TASK [command] *******************************************************************************************************************
task path: /etc/ansible/test.yml:10
changed: [localhost] => {"changed": true, "cmd": "echo   2 ", "delta": "0:00:00.012834", "end": "2017-09-12 10:40:44.959595", "rc": 0, "start": "2017-09-12 10:40:44.946761", "stderr": "", "stderr_lines": [], "stdout": "2", "stdout_lines": ["2"]}
META: ran handlers
META: ran handlers

PLAY RECAP ***********************************************************************************************************************
localhost                  : ok=1    changed=1    unreachable=0    failed=0 

(21). 環(huán)境變量找不到的問題

我們在ansible直接執(zhí)行命令弦叶,不帶有絕對路徑,就會報出找不到命令的提示信息:

ansible node2 -m shell -a "openresty -v"
192.168.77.130 | FAILED | rc=127 >>
/bin/sh: openresty: 未找到命令

此時我們應該使用下列命令避免早处。

ansible node2 -m shell -a "source /etc/profile; openresty -v"
192.168.77.130 | SUCCESS | rc=0 >>
nginx version: openresty/1.11.2.3

ansible 的ssh登陸屬于交互式的非登陸shell

詳細說明請移步到 ssh連接遠程主機執(zhí)行腳本的環(huán)境變量問題

(22). 獲取redis的info信息

- hosts: localhost
  gather_facts: false
  tasks:
  - name: "query redis info"
    expect:
      command: "telnet 127.0.0.1 6379"
      responses:
        "Escape":
           - "auth test\ninfo\nquit\n"
    ignore_errors: true
    register: result
  - name: "show the variable"
    debug: 
      var: result

更多文章請看 Ansible 專題文章總覽

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末湾蔓,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子砌梆,更是在濱河造成了極大的恐慌默责,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咸包,死亡現(xiàn)場離奇詭異桃序,居然都是意外死亡,警方通過查閱死者的電腦和手機烂瘫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門媒熊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人坟比,你說我怎么就攤上這事芦鳍。” “怎么了葛账?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵柠衅,是天一觀的道長。 經常有香客問我籍琳,道長菲宴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任趋急,我火速辦了婚禮喝峦,結果婚禮上,老公的妹妹穿的比我還像新娘呜达。我一直安慰自己谣蠢,他們只是感情好,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著眉踱,像睡著了一般勋颖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上勋锤,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天饭玲,我揣著相機與錄音,去河邊找鬼叁执。 笑死茄厘,一個胖子當著我的面吹牛,可吹牛的內容都是我干的谈宛。 我是一名探鬼主播次哈,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼吆录!你這毒婦竟也來了窑滞?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤恢筝,失蹤者是張志新(化名)和其女友劉穎哀卫,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體撬槽,經...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡此改,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了侄柔。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片共啃。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖暂题,靈堂內的尸體忽然破棺而出移剪,到底是詐尸還是另有隱情,我是刑警寧澤薪者,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布纵苛,位于F島的核電站,受9級特大地震影響啸胧,放射性物質發(fā)生泄漏赶站。R本人自食惡果不足惜幔虏,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一纺念、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧想括,春花似錦陷谱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽渣窜。三九已至,卻和暖如春宪躯,著一層夾襖步出監(jiān)牢的瞬間乔宿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工访雪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留详瑞,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓臣缀,卻偏偏與公主長得像坝橡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子精置,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內容