2014-12-05 23 views
6

Tôi đang tạo một playbook trước tiên tạo tên người dùng mới. Sau đó tôi muốn chạy "moretasks.yml" là người dùng mới mà tôi vừa tạo. Hiện tại, tôi đang thiết lập remote_user cho mọi công việc. Có cách nào tôi có thể đặt nó cho toàn bộ các tác vụ một lần không? Tôi dường như không thể tìm thấy ví dụ về điều này, cũng không phải bất kỳ nỗ lực của tôi để di chuyển remote_user xung quanh giúp đỡ.Đặt remote_user cho tập hợp các tác vụ trong Playbook Ansible mà không lặp lại nó cho mỗi tác vụ

Dưới đây là main.yml:

--- 
- name: Configure Instance(s) 
    hosts: all 
    remote_user: root 
    gather_facts: true 

    tags: 
    - config 
    - configure 

    tasks: 
    - include: createuser.yml new_user=username 
    - include: moretasks.yml new_user=username 
    - include: roottasks.yml #some tasks unrelated to username. 

moretasks.yml:

--- 
    - name: Task1 
    copy: 
     src: /vagrant/FILE 
     dest: ~/FILE 
    remote_user: "{{newuser}}" 

    - name: Task2 
    copy: 
     src: /vagrant/FILE 
     dest: ~/FILE 
    remote_user: "{{newuser}}" 

Trả lời

7

Trước hết bạn chắc chắn muốn sử dụng sudo_user (người dùng từ xa là người đăng nhập, sudo_user là người thực hiện tác vụ).

Trong trường hợp của bạn, bạn muốn thực hiện các nhiệm vụ như một người dùng khác (một trong những tạo ra trước đó) chỉ cần thiết lập:

- include: moretasks.yml 
    sudo: yes 
    sudo_user: "{{ newuser }}" 

và những nhiệm vụ sẽ được thực hiện như {{newuser}} (Đừng quên báo giá)

Lưu ý: Trong hầu hết các trường hợp, bạn nên xem xét remote_user làm thông số máy chủ lưu trữ. Người dùng được phép đăng nhập trên máy và có đủ quyền để làm việc. Đối với nội dung hoạt động, bạn nên sử dụng sudo/sudo_user

+2

Tôi nghĩ sudo_user là một trong đó thực hiện chỉ khi bạn cần phải làm một số hành động sudo? Tôi muốn lưu ý, người dùng tôi đang tạo không có đặc quyền sudo. Tất cả các hành động trong "moretasks" là địa phương đến nhà của họ. Nó vẫn còn thích hợp (gây hiểu lầm?) Để sử dụng phương pháp tiếp cận sudo_user? (Cách tiếp cận đã hoạt động) – Shark

+0

Bạn nói đúng, @Shark. Từ tài liệu, sudo_user: Đây là người dùng mặc định cho sudo nếu người dùng không được chỉ định hoặc 'sudo_user' không được chỉ định trong một Playbook Ansible. Mặc định là hợp lý nhất: ‘root’. – Esteban

+2

Lưu ý rằng 'sudo' và' sudo_user' đã không được dùng để ủng hộ 'trở thành' và' trở thành_user'. http://docs.ansible.com/ansible/become.html#become – kkurian

7

Bạn có thể chia này thành đến lượt riêng biệt? (Playbooks có thể chứa nhiều lượt)

--- 
- name: PLAY 1 
    hosts: all 
    remote_user: root 
    gather_facts: true 

    tasks: 
    - include: createuser.yml new_user=username 
    - include: roottasks.yml #some tasks unrelated to username. 

- name: PLAY 2 
    hosts: all 
    remote_user: username 
    gather_facts: false 

    tasks: 
    - include: moretasks.yml new_user=username 

Có một Gotcha sử dụng lượt riêng biệt: bạn không thể sử dụng các biến thiết lập với register: hoặc set_fact: trong vở kịch đầu tiên cần làm mọi thứ trong vở kịch thứ hai (tuyên bố này là không hoàn toàn đúng, các biến có sẵn trong hostvars, nhưng tôi khuyên bạn không nên sử dụng các biến giữa các vai trò). Các biến được định nghĩa như trong group_vars và host_vars hoạt động tốt.

Một mẹo khác mà tôi muốn cung cấp là xem xét sử dụng roleshttp://docs.ansible.com/playbooks_roles.html. Mặc dù ban đầu nó có vẻ phức tạp hơn, nhưng việc sử dụng lại chúng dễ dàng hơn nhiều (như bạn đang làm với "createuser.yml"). Nhìn vào loại điều bạn đang cố gắng đạt được, con đường 'bao gồm mọi thứ' sẽ không kéo dài lâu hơn nữa.

+0

@ Câu trả lời của ProfHase85 là chính xác, tôi không thực sự hiểu rằng trong trường hợp của bạn, bạn không cần phải đăng nhập với tư cách là "người mới sử dụng". Vẫn để lại câu trả lời, việc chia nhỏ các playbook và sử dụng các vai trò là những lời khuyên hợp lệ. –

+0

Vâng, chỉ cần bắt đầu cấu trúc của cơ sở mã này. Khi nó trở nên phức tạp hơn, tôi có lẽ sẽ xem xét cách vai trò hiệu quả có thể được. Đối với tôi, nó chỉ trông giống như một cách để tham khảo các tệp yml khác nhau mà không thực sự "bao gồm" chúng. Nó không có vẻ để thêm bất kỳ tính năng mà bạn không thể thực hiện nếu không – Shark

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