为Ansible playbook中的一组任务设置远程用户,而不重复每个任务

为Ansible playbook中的一组任务设置远程用户,而不重复每个任务,ansible,ansible-playbook,Ansible,Ansible Playbook,我正在创建一个剧本,首先创建一个新用户名。然后我想以我刚刚创建的新用户的身份运行“moretasks.yml”。目前,我正在为每个任务设置远程用户。有没有一种方法可以为整个任务集设置一次?我似乎找不到这方面的例子,也没有任何尝试移动远程用户的帮助 以下是main.yml: --- - name: Configure Instance(s) hosts: all remote_user: root gather_facts: true tags: - config

我正在创建一个剧本,首先创建一个新用户名。然后我想以我刚刚创建的新用户的身份运行“moretasks.yml”。目前,我正在为每个任务设置远程用户。有没有一种方法可以为整个任务集设置一次?我似乎找不到这方面的例子,也没有任何尝试移动远程用户的帮助

以下是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}}"

你可以把它分成几个不同的剧本吗?(剧本可以包含多个剧本)

使用单独的剧本有一个问题:您不能在第一个剧本中使用带有
寄存器的变量集:
set\u事实:
在第二个剧本中做事情(这句话不完全正确,变量在
hostvars
中可用,但我建议不要在角色之间使用变量)。定义的变量(如组变量和主机变量)工作正常


我想给出的另一个技巧是研究如何使用
角色
。虽然一开始看起来可能更复杂,但重用它们要容易得多(就像您使用“createuser.yml”时所做的那样)。查看您试图实现的目标类型,“包含所有目标”的路径不会持续太久。

首先,您肯定希望使用
sudo\u用户
(远程用户是登录的用户,
sudo\u用户
是执行任务的用户)

在您的情况下,您希望以另一个用户(先前创建的用户)的身份执行任务,该用户只需设置:

- include: moretasks.yml
  sudo: yes
  sudo_user: "{{ newuser }}"
这些任务将作为{{newuser}}执行(不要忘记引号)


在大多数情况下,你应该考虑<代码> ReleTyAuthor <代码>作为主机参数。是用户被允许登录到机器上,并且有足够的权限进行操作。对于操作性的东西,你应该使用
sudo
/
sudo\u用户

某种程度上与你的问题相关。希望能有帮助。在更新我的剧本以获得对Cisco IOS network_cli连接的Ansible 2.5支持时

使用ansible vault创建的凭据文件:auth/secrets.yml

---
creds:
  username: 'ansible'
  password: 'user_password'
剧本:

---
- hosts: ios
  gather_facts: yes
  connection: network_cli
  become: yes
  become_method: enable
  ignore_errors: yes

  tasks:
  - name: obtain login credentials
    include_vars: auth/secrets.yml

  - name: Set Username/ Password
    set_fact:
     remote_user: "{{ creds['username'] }}"
     ansible_ssh_pass: "{{ creds['password'] }}"

  - name: Find info for "{{ inventory_hostname }}" via ios_facts
    ios_facts:
      gather_subset: all
    register: hardware_fact
在没有auth/secrets.yml凭据的情况下运行playbook:

ansible-playbook -u ansible -k playbook.yml -l inventory_hostname

@ProfHase85的回答是正确的,我不太明白在您的情况下,您不需要以“新用户”身份登录。答案仍然未定,拆分剧本和使用角色是有效的技巧。是的,只是开始这个代码库的结构。随着它变得更加详细,我可能会研究角色的有效性。在我看来,它只是一种引用不同yml文件的方法,而不实际“包含”它们。它似乎没有添加任何其他功能无法完成的功能。我认为sudo_用户是仅在需要执行某些sudo操作时才执行的用户?我想指出,我创建的用户没有sudo权限。“moretasks”中的所有操作都是他们家的本地操作。使用sudo_用户方法是否仍然合适(误导?)?(这种方法确实奏效)你是对的,沙克。从文档中,sudo_user:如果Ansible playbook中未指定sudo user或“sudo_user”,则这是sudo to的默认用户。默认值是最符合逻辑的“root”。请注意,
sudo
sudo\u user
已被弃用,取而代之的是
been
been\u user
ansible-playbook -u ansible -k playbook.yml -l inventory_hostname