【问题标题】:Passing variables to ansible roles将变量传递给 ansible 角色
【发布时间】:2017-03-19 07:09:31
【问题描述】:

我的目录结构是这样的

└── digitalocean
    ├── README.md
    ├── play.yml
    └── roles
        ├── bootstrap_server
        │   └── tasks
        │       └── main.yml
        ├── create_new_user
        │   └── tasks
        │       └── main.yml
        ├── update
        │   └── tasks
        │       └── main.yml
        └── vimserver
            ├── files
            │   └── vimrc_server
            └── tasks
                └── main.yml

当我在角色 create_new_user 下创建用户时,我将用户名硬编码为

---
- name: Creating a user named username on the specified web server.
  user: 
    name: username
    state: present
    shell: /bin/bash
    groups: admin
    generate_ssh_key: yes
    ssh_key_bits: 2048
    ssh_key_file: .ssh/id_rsa

- name: Copy .ssh/id_rsa from host box to the remote box for user username
  become: true
  copy: 
    src: ~/.ssh/id_rsa.pub
    dest: /home/usernmame/.ssh/authorized_keys
    mode: 0600
    owner: username
    group: username

解决此问题的一种方法可能是创建一个var/main.yml 并将用户名放在那里。但我想要一些东西,通过它我可以在play.yml 级别指定用户名。因为我也在角色vimrcserver 中使用用户名。

我正在使用play.yml 调用角色

---
- hosts: testdroplets
  roles:
    - update
    - bootstrap_server
    - create_new_user
    - vimserver

在这种情况下,模板可以在这里工作吗?从这些 SO questions 中找不到太多内容

【问题讨论】:

    标签: ansible ansible-template


    【解决方案1】:

    我做了一个

    ---
    - hosts: testdroplets
      roles:
        - update
        - bootstrap_server
        - role: create_new_user
          username: username
        - role: vimserver
          username: username
    

    play.yml

    虽然很想看到与此不同的方法

    文档http://docs.ansible.com/ansible/playbooks_roles.html#roles

    编辑

    我终于解决了像

    这样的目录结构
    $ tree
    .
    ├── README.md
    ├── ansible.cfg
    ├── play.yml
    └── roles
        ├── bootstrap_server
        │   └── tasks
        │       └── main.yml
        ├── create_new_user
        │   ├── defaults
        │   │   └── main.yml
        │   └── tasks
        │       └── main.yml
        ├── update
        │   └── tasks
        │       └── main.yml
        └── vimserver
            ├── defaults
            │   └── main.yml
            ├── files
            │   └── vimrc_server
            └── tasks
                └── main.yml
    

    我在需要使用{{username}} 的角色内创建defaults/main.yml 文件

    如果有人对代码感兴趣,

    【讨论】:

      【解决方案2】:

      您应该可以将 username 放入 play.yml 中的 vars 条目中。

      变量也可以拆分成单独的文件。

      这是一个显示两个选项的示例:

      - hosts: all
        vars:
          favcolor: blue
        vars_files:
          - /vars/external_vars.yml
      
        tasks:
      
        - name: this is just a placeholder
          command: /bin/echo foo
      

      https://docs.ansible.com/ansible/playbooks_variables.html#variable-file-separation

      Ansible 似乎很高兴有不同的方法来做同样的事情,没有很好的综合参考,也没有讨论每种不同方法的全部含义的理由:)。如果您不记得上述是可能的(我完全忘记了vars_files),从文档中找到最简单的选项可能是第三种方式,这是最复杂的方式。

      有一个关于 ansible-examples 的重要建议。您可以看到group_vars 目录,其中包含根据组自动为主机提供值的文件,包括神奇的all 组。 group_vars 目录可以和 playbook 放在同一目录下。

      https://github.com/ansible/ansible-examples/tree/master/lamp_simple

      【讨论】:

        【解决方案3】:

        也许这就是你想要的?

        ---
        - hosts: testdroplets
          roles:
            - update
            - bootstrap_server
            - { role: create_new_user, username: 'foobar' }
            - vimserver
        

        https://docs.ansible.com/ansible/2.5/user_guide/playbooks_reuse_roles.html#using-roles

        【讨论】:

          【解决方案4】:

          你不能只用 -e 参数从命令行传递变量吗?因此,您甚至可以在执行之前指定变量。这也导致了始终优先的最强变量声明(请参阅Variable precendence)。

          如果你想把它放在你的剧本中,我建议在剧本中使用set_fact 指令定义用户名。然后,此变量可用于所有角色并包含在剧本中。比如:

          ---
          - hosts: testdroplets
            pre_tasks:
              - set_fact:
                  username: my_username
            roles:
              - update
              - bootstrap_server
              - create_new_user
              - vimserver
          

          【讨论】:

            【解决方案5】:

            如果你使用include_role,可以像下面这样传递变量。

            - hosts: all_hosts
              tasks:
                - include_role:
                    name: "path/to/role"
                  vars:
                    var1: "var2_value"
                    var2: "var2_value"
                
            

            【讨论】:

            • 最佳答案。该选项可为您提供完全控制和更大的灵活性。
            • 注意:default(omit) 在 vars 块内使用时无法正常工作。它不会跳过那一行,而是将省略占位符字符串传递给导入的角色。要解决此问题,您可以在包含角色之前使用 set_facts 设置角色变量。
            【解决方案6】:

            都在这里:http://docs.ansible.com/ansible/playbooks_variables.html

            虽然已经有一些很好的答案,但我想添加我的,因为我已经完成了这件事。

            这是我写的角色:https://github.com/jmalacho/ansible-examples/tree/master/roles/users

            而且,我使用 hash_merge=true 和 ansible 的 group_vars 来制作用户字典:键、组,以便按主机或按环境添加新用户,并且重新运行很容易。

            我还曾经写过我的团队如何在环境中使用组变量,例如:“https://www.coveros.com/ansible-environment-design/

            【讨论】:

            猜你喜欢
            • 2023-02-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-06-12
            • 1970-01-01
            • 2016-01-03
            • 1970-01-01
            相关资源
            最近更新 更多