Ansible:变量的剧本名称和任务步骤索引

时间:2018-11-22 15:22:00

标签: ansible

在我的剧本中,每个剧本有多个shell任务,例如十个或更多。我想使用create shell arg来避免一遍又一遍地执行它们。

目前我有这个:

- name: Download sonar-runner
  get_url:
    url: http://repo1.maven.org/maven2/org/codehaus/sonar/runner/sonar-   runner-dist/2.4/sonar-runner-dist-2.4.zip
    dest: /tmp
    mode: 0755

- name: Unarchive
  unarchive:
    src: /tmp/sonar-runner-dist-2.4.zip
    dest: /opt/tools/sonar-runner-2.4

- name: Sym link
  shell: ln -s sonar-runner-2.4 sonar-runner
  args:
    creates: ~/.ansible/sonar-runner.task/step.3

- name: Configure profile
  shell: |
    echo 'export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/' > /etc/profile.d/maven.sh
    echo 'export M2_HOME=/opt/maven/apache-maven-3.5.3' >> /etc/profile.d/maven.sh
    echo 'export PATH=${M2_HOME}/bin:${PATH}' >> /etc/profile.d/maven.sh
  args:
    creates: ~/.ansible/sonar-runner.task/step.4

有什么方法可以使用变量来实现。我在想这样的事情:

- name: Sym link
  shell: ln -s sonar-runner-2.4 sonar-runner
  args:
    creates: ~/.ansible/{{playbook_name}}/{{task_index}}

- name: Configure profile
  shell: |
    echo 'export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/' > /etc/profile.d/maven.sh
    echo 'export M2_HOME=/opt/maven/apache-maven-3.5.3' >> /etc/profile.d/maven.sh
    echo 'export PATH=${M2_HOME}/bin:${PATH}' >> /etc/profile.d/maven.sh
  args:
    creates: ~/.ansible/{{playbook_name}}/{{task_index}}

有没有办法做到这一点?我想念什么吗?还是不是Ansible的工作方式?

2 个答案:

答案 0 :(得分:0)

  

有没有办法做到这一点?我想念什么吗?还是不是Ansible的工作方式?

是的,是的,没有:-)

  

有什么办法吗?

shell:command:支持内联creates=声明,因此您可以将所有这些声明放在一个块中(因此,它很可能是变量或yaml)锚):

- shell: |
    creates=/etc/profile.d/maven.sh
    echo 'hello' > /etc/profile.d/maven.sh
- command: |
    creates=/etc/profile.d/maven.sh
    cp /something /etc/profile.d/maven.sh

但是,我只是告诉您,为您提供信息,以及在以下情况下由于以下原因而导致这些后续步骤无法正常工作的情况:

  

我想念什么吗?

您希望尽可能使用内置的幂等性,以使您摆脱手动进行“必须执行此任务”簿记的工作。因此:

- file:
    src: sonar-runner-2.4
    dest: sonar-runner
    state: link
- copy:
    dest: /etc/profile.d/maven.sh
    content: |
        export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/
        export M2_HOME=/opt/maven/apache-maven-3.5.3
        export PATH=${M2_HOME}/bin:${PATH}

当您尝试手动使用ln时,ansible没发牢骚让我感到非常惊讶,因为它了解常见的Shell命令,并会带您切换到内置模块file: < / p>

答案 1 :(得分:0)

好吧,最后我设法通过混合使用变量,事实和角色来解决这个问题。

testfacts.yml剧本


            FOREIGN KEY (

角色/测试事实/任务/main.yml

)
            REFERENCES

角色/测试事实/任务/task1.yml

.

roles / common / tasks / set_facts.yml

(

库存/产品/group_vars/group_vars.yml

---
- hosts: all
  vars:
    current_role: 'testfacts'
  roles:
    - testfacts