2015-06-05 15 views
7

tôi phải chạy một playbook ansible để thực hiện các nhiệm vụ sauAnsible set_fact qua đóng

1) ngày ở định dạng YYYY_MM_DD Tính và sau đó sử dụng tiền tố này để tải một số tập tin từ AWS để máy tính cục bộ của tôi. Tên tệp có định dạng sau 2015_06_04_latest_file.csv

2) Tôi phải tạo thư mục theo tên 2015_06_04 vào nhiều máy chủ và tải tệp này lên đó.

Đây là playbook hiện tại của tôi -

--- 
- hosts: 127.0.0.1 
    connection: local 
    sudo: yes 
    gather_facts: no 
    tasks: 
    - name: calculate date 
    shell: date "+%Y_%m_%d" --date="1 days ago" 
    register: output 
    - name: set date variable 
    set_fact: latest_date={{ item }} 
    with_items: output.stdout_lines 
    - local_action: command mkdir -p /tmp/latest_contracts/{{ latest_date }} 
    - local_action: command /root/bin/aws s3 cp s3://primarydatafolder/data/{{ latest_date }}_latest_data.csv /tmp/latest_contracts/{{ latest_date }}/ creates=/tmp/latest_contracts/{{ latest_date }}/latest_data.csv 
    register: result 
    ignore_errors: true 
    - local_action: command /root/bin/aws s3 cp s3://secondarydatafolder/data/{{ latest_date }}_latest_data.csv /tmp/latest_contracts/{{ latest_date }}/ creates=/tmp/latest_contracts/{{ latest_date }}/latest_data.csv 
    when: result|failed 
# remove the date prefix from the downloaded file 
    - local_action: command ./rename_date.sh {{ latest_date }} 
    ignore_errors: true 
- hosts: contractsServers 
    sudo: yes 
    gather_facts: no 
    tasks: 
    - name: create directory 
    file: path={{item.path}} state=directory mode=0775 owner=root group=root 
    with_items: 
    - {path: '/var/mukul/contracts/{{ latest_date }}' } 
    - {path: '/var/mukul/contracts/dummy' } 
    - name: copy dummy contracts 
    copy: src=dummy dest=/var/mukul/contracts/ 
    - name: delete previous symlink 
    shell: unlink /var/mukul/contracts/latest 
    ignore_errors: true 
    - name: upload the newly created latest date folder to the host 
    copy: src=/tmp/latest_contracts/{{ latest_date }} dest=/var/mukul/contracts/ 
    - name: create a symbolic link to the folder on the host and call it latest 
    action: file state=link src=/var/mukul/contracts/{{ latest_date }} dest=/var/mukul/contracts/latest 

Theo tài liệu ansible về biến set_fact, biến LATEST_DATE này nên có sẵn trên vở kịch. Tuy nhiên, ansible không thành công với thông báo sau

failed: [192.168.101.177] => (item={'path': u'/var/mukul/contracts/{# latest_date #}'}) => {"failed": true, "item": {"path": "/var/mukul/contracts/{# latest_date #}"}} 
msg: this module requires key=value arguments (['path=/var/mukul/contracts/{#', 'latest_date', '#}', 'state=directory', 'mode=0775', 'owner=root', 'group=root']) 

Có vẻ như nếu playbook thứ hai là không thể nhận được giá trị của LATEST_DATE thực tế. Bạn có thể cho tôi biết tôi đang phạm sai lầm ở đâu không?

Trả lời

11

Sự kiện là máy chủ cụ thể. Khi số documentation about set_fact cho biết, "[v] ariables [set with set_fact] được đặt trên cơ sở từng máy chủ".

Thay vào đó, tôi muốn thử sử dụng run_once theo quy định tại Delegation, rolling updates, and local actions, như thế này:

- hosts: contractsServers 
    tasks: 
    - name: Determine date 
     local_action: shell: date "+%Y_%m_%d" --date="1 days ago" 
     register: yesterday 
     always_run: True 
     changed_when: False 
     run_once: True 
    - name: Do something else locally 
     local_action: ... 
     register: some_variable_name 
     always_run: True 
     changed_when: False 
     run_once: True 

    - name: Do something remotely using the variables registered above 
     ... 
+0

Hoàn hảo. Cảm ơn, run_once đã giải quyết được sự cố của tôi. –

2

Bạn có thể kích hoạt tính năng fact-caching. Bạn sẽ cần phải thiết lập một ví dụ redis địa phương nơi các sự kiện sau đó sẽ được lưu trữ.

+0

Cảm ơn vì điều này. Tôi đã tìm cách để làm điều này mà không có bộ nhớ đệm thực tế, bởi vì với tôi nó có vẻ hơi quá nhiều để làm cho chỉ duy trì sự kiện trên các vở kịch. –

Các vấn đề liên quan