2016-06-20 81 views
1

Ansible的新手,運行版本2.1.0。我寫了一個Ansible playbook,它針對一組主機運行PostgreSQL查詢。當我在shell命令中指定SQL DB密碼時,它的工作原理是,但我希望針對一組主機運行該手冊,並需要更好的方式來輸入密碼,因爲它們都是唯一的。任何人都可以提出一個更好的方法來做到這一點在Ansible Playbook中指定PostgreSQL密碼

--- 

- hosts: Test_Hosts  
    sudo: yes  
    sudo_user: root  
    gather_facts: yes 
    tasks:  
    - name: Login to DB and run command  
    shell: export PGPASSWORD='Password'; psql -U 'user' -d 'db' -c 'select * FROM table'; 
    register: select_all_from_table 

    - name: Display table contents  
    debug: msg="{{ select_all_from_table.stdout }}" 

我看到另一個線程的話題,但不知道如何實現的建議:Run a postgresql command with ansible playbook. Postgresql requires password

回答

3

Ansible允許您使用environment parameter任何任務來設置環境變量的任務。

所以你的情況,你可能只是這樣做:

- name: Login to DB and run command  
    shell: export PGPASSWORD='Password'; psql -U 'user' -d 'db' -c 'select * FROM table'; 
    register: select_all_from_table 
    environment: 
     PGPASSWORD: '{{ pgpassword }}' 

,然後設置pgpassword變量在grouphost水平。

+0

謝謝你的回覆,我會t你的建議。 – Sysadmin1234

0

我今天剛剛遇到這個問題,這是對我有用。在Linux上,您可以將所有憑據打包到~/.pgpass隱藏文件中。

只需在本地創建它(在本例中爲./files/pgpass),然後在運行psql命令之前使用ansible將其複製到主機上。

- name: set passwd file for PSQL 
    copy: 
    src: files/pgpass 
    dest: ~/.pgpass 
    mode: 0600   ### important: will not work with wrong permissions 

- name: PSQL command 
    shell: "psql -U 'user' -d 'db' -c 'select * FROM table'" 
    register: select_all_from_table 

文件內容必須採用以下格式:

hostname:port:database:username:password 

但是,您可以使用通配符,所以我的是這樣,例如:

*:*:db1:user1:passwd1 
*:*:db2:user2:passwd2 

用於查看文檔更多詳情: https://www.postgresql.org/docs/9.1/static/libpq-pgpass.html